我们的网站变得非常困难,所以我们正在考虑优化一些现有的查询。

在研究这个问题时,我们遇到了几个查询,当查询中聚集索引的简单引用时,执行计划的速度提高了4-5倍...例如

如果这是旧查询:

SELECT ...
FROM myTable
WHERE categoryID =  @category 

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

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

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

有帮助吗?

解决方案

对我来说似乎很明显

聚集索引不包含您的第一个查询,而第二个查询不包含第一个查询的WHERE子句中的第一个查询

您可能需要阅读 SQL Server覆盖索引看看这一切是如何运作的

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

修改

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

有时你可以通过执行lotID> 0(选择你拥有的最低数字)来伪造聚集索引,然后你会得到一个搜索

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top