0

我有一个看起来像这样的查询:

SELECT Distinct(ContKey)
FROM Point
WHERE Created > 1245750191000
  AND Created < 1345753791000
  AND ContainerId='abcd'

查询的目的是获取所有不同的 ContKey 值,这些值根据某些条件(包括范围)映射到表“Container”中的字段“Key”。

它运行得很慢。我确信这不是索引问题,因为我们在相关字段和字段组合上有一个索引。在我拥有数百万行的数据库中,此查询需要 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。这是重写不正确吗?根据我正在尝试做的事情,我希望我可以改进查询。

谢谢。

4

1 回答 1

1

我确信这不是索引问题,因为我们在相关字段和字段组合上有一个索引。

所以换句话说,你不确定你需要什么索引,所以你只是在你能想到的所有东西上添加了索引?当您考虑所有各种多列索引和列的排列时,有很多可能的组合。在不了解您在做什么的情况下,您很可能没有添加正确的索引。

您应该将最具选择性的列放在索引的首位。在这种情况下,它看起来ContainerId可能是最具选择性的。尝试添加这个多列索引:

(ContainerId, CreatedId, ContKey)

重复一遍:索引中的列顺序很重要。以不同的顺序创建具有相同列的索引可能会产生不同的性能特征。

于 2012-08-24T21:26:44.773 回答