4

我们的网站受到了相当大的冲击,因此我们正在研究优化我们现有的一些查询。

在研究这个问题时,我们遇到了几个查询,当查询中包含聚集索引的简单引用时,它们的执行计划快了大约 4-5 倍……例如

如果这是旧查询:

SELECT ...
FROM myTable
WHERE categoryID =  @category 

根据 SSMS 中的执行计划,以下查询将快 4 倍:

SELECT ...
FROM myTable
WHERE categoryID =  @category 
AND lotID = lotID

我们似乎无法理解这将如何使查询更快。聚集索引位于 lotID 上,但由于它与自身进行比较,这有什么帮助?

4

1 回答 1

6

对我来说似乎很明显

您的第一个查询没有被聚集索引覆盖,而第二个查询是因为 lotID 不在第一个查询的 WHERE 子句中

您可能想阅读SQL Server 覆盖索引以了解所有工作原理

您还需要了解聚集索引是数据,一个表的所有数据都在聚集索引中。当您在具有聚集索引的表上创建非聚集索引时,非聚集索引将具有指向聚集索引的指针(因为这是其余数据所在的位置),除非您可以通过非聚集索引完全满足您的查询索引,在这种情况下,将只使用非聚集索引......我现在停止漫谈

编辑

我读 AND lotID = @lotID NOT AND lotID = lotID

有时您可以通过执行 where lotID >0 (选择您拥有的最低数字)来伪造聚集索引,然后您将获得搜索

因此,如果您的最小 lotID = 1 并且您添加 AND lotID > 0

您还可以看到搜索而不是扫描,我在这篇文章中演示了 WHERE IndexValue > ''索引搜索总是比索引扫描更好还是更快?

于 2009-06-16T18:43:17.737 回答