索引减少行数读取;没有表现收益

时间:2017-09-07 18:45:57

标签: sql sql-server database sql-server-2008

我在一个大表(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亿行。该指数似乎正在发挥作用,但我没有从中获得任何性能优势。

在这种情况下,任何关于为什么会这样或者如何提高查询速度的想法都将非常感激。

2 个答案:

答案 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/