SET STATISTICS IO ON GO SELECT ModifiedDate, SalesOrderID, SalesOrderDetailID, ProductID, UnitPrice FROM SalesOrdDetailDemo WHERE ModifiedDate='2005-07-01 00:00:00.000' GO SELECT ModifiedDate, SalesOrderID, SalesOrderDetailID, ProductID, UnitPrice FROM SalesOrdDetailDemo WITH(INDEX=idx_SalesDetail_SalesOrderlID) WHERE ModifiedDate='2005-07-01 00:00:00.000' GO SELECT ModifiedDate, SalesOrderID, SalesOrderDetailID, ProductID, UnitPrice FROM SalesOrdDetailDemo WITH(INDEX=idx_non_clust_SalesOrdDetailDemo_ModifiedDate) WHERE ModifiedDate='2005-07-01 00:00:00.000' GO
比较下来,采用了 clustered index 的查询表现最差,另外 SET STATISTICS IO 输出的数据中clustered index 的查询在 logical reads 上花费了更多的时间。
DROP INDEX idx_non_clust_SalesOrdDetailDemo_ModifiedDate ON SalesOrdDetailDemo GO CREATE NONCLUSTERED INDEX idx_non_clust_SalesOrdDetailDemo_ModifiedDate ON SalesOrdDetailDemo(ModifiedDate) INCLUDE ( ProductID, UnitPrice ) GO -- 清下缓存,仅用于开发环境! DBCC FREEPROCCACHE DBCC DROPCLEANBUFFERS GO再次执行之前的查询:
SELECT ModifiedDate, SalesOrderID, SalesOrderDetailID, ProductID, UnitPrice FROM SalesOrdDetailDemo WHERE ModifiedDate='2005-07-01 00:00:00.000' GO
这下完美了,因为我们的查询字段都包含在索引中,所以执行计划最终被优化为 Index Seek。