加入查询以及何时过多

时间:2010-06-30 21:17:47

标签: c# sql linq-to-sql

我发现我使用了很多连接查询,尤其是从我的数据库中获取有关用户操作的统计信息。像这样的查询并不罕见:

from io in db._Owners where io.tenantId == tenantId
    join i in db._Instances on io.instanceId equals i.instanceId
    join m in db._Machines on i.machineId equals m.machineId
    select ...

我的应用程序仍未激活,因此我无法判断这些查询在现实生活中是否会在计算上受到限制。我的问题:

  1. 是否存在太多“连接”过多的限制,并且可以在不获取真实运行统计数据的情况下进行描述?
  2. 我有什么选择?例如,是否最好只创建其他表来保存我随时更新的统计信息,而不是每次需要统计信息时将不同的表源都汇总在一起?

3 个答案:

答案 0 :(得分:13)

如果您没有性能信息,请不要进行优化。

过早优化是万恶之源。

1)我认为你不会达到“极限”。 2)这称为非正规化,如果你不知道是否存在问题,过早的非规范化只是浪费精力。

我说你的查询看起来很正常。

答案 1 :(得分:0)

  

1)当太多“连接”太多时,是否存在限制

不,连接数不是问题,而是每个表中的数据结构,索引的存在和使用以及需要采取哪些措施来获取数据。

规范化数据通常是关系数据库设计的主要目标。您通常会将非规范化视为仅在必要时优化查询的方法,因为需要额外的工作来维护数据一致性。

如果您真的担心,请发布数据模型ERD(数据库表及其相关方式)以及您用于项目的数据库(因为并非所有数据库都相同)。

答案 2 :(得分:0)

除非您拥有非常高的流量并正确设置了索引等,否则您应该没有问题。

对于报告/分析,某些地方将创建一个data warehouse,其最基本的形式是主数据库的[部分]非规范化副本。它们更容易报告,因为一个表通常包含报告中所需的大部分(如果不是全部)数据。它们也可以更快地读取,因为您不必加入这么多。但是,它们需要更多磁盘空间(重复数据)。如果允许写入,它们会更慢(必须更新所有重复数据),并且您将遇到保持重复数据一致的问题。

换句话说,除非您只进行报告(或只读访问),否则请保留联接。