SQL Query永远占用

时间:2010-01-27 13:40:40

标签: sql-server datetime join

我有这个webapplication工具,可以查询数据并在网格中显示它。现在很多人都使用它,所以它必须具有很高的性能。

问题是,我需要通过连接添加几个额外的字段,现在需要永远运行查询。

如果我在sql server中运行以下查询:

select top 100 *
from bam_Prestatie_AllInstances p
join bam_Zending_AllRelationships r on p.ActivityID = r.ReferenceData
join bam_Zending_AllInstances z on r.ActivityID = z.ActivityID
where p.PrestatieZendingOntvangen >= '2010-01-26' and p.PrestatieZendingOntvangen < '2010-01-27'

这需要大约35-55秒,这太长了。因为这只是一个小的。

如果我删除其中一个日期检查,则只需1秒。如果我删除了两个连接,它也只需要1秒钟。

当我在此使用查询计划时,我可以看到100%的时间花在了PrestatieZendingOntvangen字段的索引上。如果我将此字段设置为索引,则不会发生任何变化。

任何人都知道该怎么做?

因为我的客户开始抱怨超时等问题。

由于

6 个答案:

答案 0 :(得分:6)

除了明显的bam_Prestatie_AllInstances.PrestatieZendingOntvangen列索引问题外,还要检查是否有外键列的索引:

  • p.ActivityID(表格:bam_Prestatie_AllInstances
  • r.ReferenceData(table:bam_Zending_AllRelationships
  • r.ActivityID(表格:bam_Zending_AllRelationships
  • z.ActivityID(表格:bam_Zending_AllInstance

索引外键字段可以帮助加快这些字段上的JOIN!

此外,正如已经提到的:尝试通过指定特定的字段列表来限制您选择的字段 - 而不是使用SELECT * - 特别是如果您连接多个表,只需选择的列数(乘以您选择的行数)可能会导致海量数据传输 - 如果您不需要所有这些列,那就是浪费带宽!

答案 1 :(得分:2)

  1. 指定要检索的字段,而不是*
  2. 指定内部加入或外部加入

答案 2 :(得分:0)

尝试?

where p.PrestatieZendingOntvangen 
   between '2010-01-26 00:00:00' and '2010-01-27 23:00:00'

答案 3 :(得分:0)

您是否在Where子句的日期字段中放置了索引

如果没有,我会在这些字段上创建一个INDEX,看它是否与你的时间有任何差异。

当然,索引会占用更多磁盘空间,因此您必须考虑该额外索引的影响。

编辑:

其他人也指出了在Select而不是*(通配符)中指定所需的列,以及在外键上放置更多索引等等。

答案 4 :(得分:0)

DB背景的人可以清楚我对此的怀疑。

我认为,您应该以数据库能够理解它的样式指定日期 例如假设,日期以表格内的mm / dd / yyyy样式存储。您的查询尝试输入不同的日期样式进行比较(yyyy-mm-dd),性能会下降。

当我假设这个时,我太天真了吗?

答案 5 :(得分:0)

bam_Prestatie_AllInstances和其他表有多少列?看起来你正在排列所有列,这肯定是一个性能问题。

您是否尝试从特定表中选择特定列,例如:

select top 100 p.column1, p.column2, p.column3

反而查询当前正在执行的所有列:

select top 100 *