我的查询看起来像这样:
SELECT Distinct(ContKey)
FROM Point
WHERE Created > 1245750191000
AND Created < 1345753791000
AND ContainerId='abcd'
查询的目的是获取所有不同的ContKey值,这些值映射到字段&#34; Key&#34;在表&#34;容器&#34;中,基于一些标准,包括范围。
它运行得很慢。我确信它不是索引问题,因为我们有相关字段和字段组合的索引。在具有数百万行的数据库中,此查询需要300秒才能返回69,338个结果。太慢了!
我试图重新编写查询以消除DISTINCT
子句。我想出了这个:
SELECT Key
FROM Container t
WHERE t.ContainerId = 'abcd'
AND EXISTS( SELECT 1
FROM Point
WHERE Created > 1245750191000
AND Created < 1345753791000
AND ContainerId = t.ContainerId )
它运行得更快(不到一秒钟)。但产生更多结果。 72,330准确。这种重写不正确吗?基于我想要做的事情,我希望我能改进查询。
感谢。
答案 0 :(得分:1)
我确信这不是一个索引问题,因为我们有相关字段和字段组合的索引。
所以换句话说,你不确定你需要什么索引,所以你只是添加了你能想到的所有索引?当您考虑所有各种多列索引和列的排列时,可能存在批次。如果不了解您正在做什么,很可能您没有添加正确的索引。
您应该将最具选择性的列放在索引中的第一位。在这种情况下,看起来ContainerId
可能是最具选择性的。尝试添加此多列索引:
(ContainerId, CreatedId, ContKey)
重复一遍:索引中的列顺序很重要。使用不同顺序的相同列创建索引可能会提供不同的性能特征。