我在一个大表(1600万行)的列(日期)上创建了一个非聚集的,非唯一的索引,但与完全相同的查询相比,我的查询速度非常相似被迫不使用任何索引。
查询1(使用索引):
SELECT *
FROM testtable
WHERE date BETWEEN '01/01/2017' AND '03/01/2017'
ORDER BY date
查询2(无索引):
SELECT *
FROM testtable WITH(INDEX(0))
WHERE date BETWEEN '01/01/2017' AND '03/01/2017'
ORDER BY date
两个查询都需要相同的时间才能运行,并返回相同的结果。查看每个执行计划时,查询1的行数为
大约400万行,其中查询2读取1.06亿行。该指数似乎正在发挥作用,但我没有从中获得任何性能优势。
在这种情况下,任何关于为什么会这样或者如何提高查询速度的想法都将非常感激。
答案 0 :(得分:0)
创建包含列的索引:Cover index
本主题介绍如何使用SQL Server Management Studio或Transact-SQL添加包含(或非键)列以扩展SQL Server中非聚簇索引的功能。通过包含非键列,您可以创建涵盖更多查询的非聚簇索引。这是因为非键列具有以下好处:
当查询中的所有列都作为键列或非键列包含在索引中时,具有非键列的索引可以显着提高查询性能。由于查询优化器可以在索引中找到所有列值,因此可以实现性能提升;不访问表或聚簇索引数据,从而减少磁盘I / O操作。
CREATE NONCLUSTERED INDEX IX_your_index_name
ON testtable (date)
INCLUDE (col1,col2,col3);
GO
答案 1 :(得分:0)
您需要根据查询的需要建立一个索引 - 这个快速免费的视频课程可以让您快速上手。
https://www.brentozar.com/archive/2016/10/think-like-engine-class-now-free-open-source/