SQL Server 2005 集群索引查询速度

4
我们的网站受到了相当大的压力,因此我们正在研究优化一些现有查询。
在研究过程中,我们发现几个查询的执行计划在查询中引用聚集索引时快了约4-5倍...例如:
如果这是旧查询:
SELECT ...
FROM myTable
WHERE categoryID =  @category 

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

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

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

1个回答

6

对我来说似乎很明显

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

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

你还需要了解聚集索引就是数据,表中的所有数据都在聚集索引中。当你在具有聚集索引的表上创建非聚集索引时,非聚集索引将指向聚集索引(因为那里有其余的数据),除非你可以通过非聚集索引完全满足查询,在这种情况下只使用非聚集索引...我现在会停止胡言乱语

编辑

我阅读到AND lotID = @lotID NOT AND lotID = lotID

有时你可以通过执行where lotID & gt; 0(选择你拥有的最小数字)来欺骗聚集索引,并获得一个查找

所以如果你的最小lotID = 1并且你添加了 AND lotID & gt; 0

你也可以看到一个查找而不是扫描,我在这篇文章中演示了WHERE IndexValue & gt; '' 索引扫描总是比索引查找更好或更快吗?


只有当SELECT语句中的所有列也在聚集索引中时,才会出现这种情况。我不认为这在这里是个问题(虽然可能存在)。 - Eric Petroelje
1
让我再强调一遍,表格中的所有数据(不包括行溢出的BLOB LOB和图像+ varchar(max)类型)都在聚集索引中。 - SQLMenace
那么,在 WHERE 子句中使用聚集索引是通用的做法吗,即使它不会影响返回的结果但可以加快查询速度?我从未见过这样的操作。 - Chris Klepeis
哦,天啊……我读到“AND lotID = @lotID”的时候……有时你可以通过where lotID >0(选择你拥有的最低数字)来欺骗聚集索引,然后你就会得到一个搜索。 - SQLMenace
对我们起作用的方法是预先查询,存储@maxLotID = (MAX(lotID) - 20000),然后在我的示例查询中执行lotID > @maxLotID...这使得速度比只是使用lotID = lotID快了约3倍 :) - Chris Klepeis
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接