我有这个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字段的索引上。如果我将此字段设置为索引,则不会发生任何变化。
任何人都知道该怎么做?
因为我的客户开始抱怨超时等问题。
由于
答案 0 :(得分:6)
除了明显的bam_Prestatie_AllInstances.PrestatieZendingOntvangen
列索引问题外,还要检查是否有外键列的索引:
bam_Prestatie_AllInstances
)bam_Zending_AllRelationships
)bam_Zending_AllRelationships
)bam_Zending_AllInstance
)索引外键字段可以帮助加快这些字段上的JOIN!
此外,正如已经提到的:尝试通过指定特定的字段列表来限制您选择的字段 - 而不是使用SELECT *
- 特别是如果您连接多个表,只需选择的列数(乘以您选择的行数)可能会导致海量数据传输 - 如果您不需要所有这些列,那就是浪费带宽!
答案 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 *