【问题标题】:How to avoid too many trip to database如何避免过多访问数据库
【发布时间】:2012-08-27 23:31:51
【问题描述】:

我有这些课程

class Match
{
  int MatchID,
  int TeamID, //used to reference Team
  ... other fields
}

注意:比赛实际上有 2 个团队,这意味着 2 个 TeamID

class Team
{
   int TeamID,
   string TeamName
}

在我看来,我需要显示 List<Match> 来显示 TeamName。所以我添加了另一个字段

class Match
{
  int MatchID,
  int TeamID, //used to reference Team
  ... other fields

  string TeamName;
}

我现在可以做

Match m = getMatch(id);
m.TeamName = getTeamName(m.TeamId); //get name from database

但对于List<Match>getTeamName(TeamId) 将进入数据库以获取每个 TeamID 的 TeamName。

对于每页 10 个匹配项的页面,这可能是 (10x2Teams)=20 访问数据库。

为了避免这种情况,我想到了一次加载所有内容,将其存储在内存中,然后只在内存中查找 TeamName。这让我重新思考如果记录是 5000 或更多会怎样。

有没有更好的方法呢?谢谢。

【问题讨论】:

  • 您可以做的一件事是在您的数据库调用中实现分页,因此您只检索正在显示的当前页面所需的数字。然后,当单击“下一页”时,将是另一个数据库调用以检索下一页的数据,依此类推。对数据库的每次调用都将包含一个页码,以便数据库知道要检索哪个页面。
  • 您是否考虑过使用 MS Entity Framework 或 NHibernate 为您管理持久性?它会让事情变得更容易,让你拥有更清晰的数据模型,并让你自动获取相关数据。
  • 我同意 Pablo - ORM LightSpeed 在急切/延迟加载方面做了一些很棒的事情。因为机器有不同的规格,我不认为你会得到灵丹妙药的解决方案。与 PLINQ 类似,您必须尝试不同的方法来优化性能。

标签: c# asp.net sql-server performance


【解决方案1】:

按页面执行缓存 - 将当前 10 场比赛列表中存在的 id 列表放在一起,然后加载具有这些 id 之一的所有团队。

你没有说你是如何访问你的数据的,但是如果你使用的是 SQL,那么 IN 就是你的朋友。

select * from teams were id in ('1', '2', '3', '4')

或者,您可以首先使用 join 语句将您的比赛加载到球队,然后在填充比赛数据的同时填充球队数据。

【讨论】:

  • 谢谢拉维。当然在很多情况下都是这样,但这只是一个例子。
  • 你的方法没问题。有了这个我可以做一次旅行,20条记录,这就是我想要的。谢谢。
【解决方案2】:

我同意到目前为止给出的答案。我只是想扩展马特的答案。如果您需要对象中的所有数据,那么在一次访问数据库中发出多个 sql 语句会更有效。这将在单个数据库命中返回多个表。

【讨论】:

    猜你喜欢
    • 2011-01-05
    • 2020-06-14
    • 2017-07-10
    • 2017-05-24
    • 2017-09-05
    • 2012-04-07
    • 1970-01-01
    • 1970-01-01
    • 2021-03-29
    相关资源
    最近更新 更多