Sql 索引减少了读取的行数;没有性能增益

Sql 索引减少了读取的行数;没有性能增益,sql,sql-server,database,sql-server-2008,Sql,Sql Server,Database,Sql Server 2008,我在一个大表(1600万行)的列(日期)上创建了一个非聚集、非唯一的索引,但与强制不使用任何索引的完全相同的查询相比,我的查询速度非常相似 查询1(使用索引): 查询2(无索引): 两个查询的运行时间相同,返回的结果相同。查看每个查询的执行计划时,查询1读取的行数为 ~400万行,其中as查询2读取的是1.06亿行。该索引似乎正在运行,但我没有从中获得任何性能好处 任何关于这是为什么的想法,或者如何在这种情况下提高我的查询速度,都将不胜感激 创建包含列的索引: 本主题介绍如何使用SQL Serv

我在一个大表(1600万行)的列(日期)上创建了一个非聚集、非唯一的索引,但与强制不使用任何索引的完全相同的查询相比,我的查询速度非常相似

查询1(使用索引):

查询2(无索引):

两个查询的运行时间相同,返回的结果相同。查看每个查询的执行计划时,查询1读取的行数为
~400万行,其中as查询2读取的是1.06亿行。该索引似乎正在运行,但我没有从中获得任何性能好处


任何关于这是为什么的想法,或者如何在这种情况下提高我的查询速度,都将不胜感激

创建包含列的索引:

本主题介绍如何使用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  

你需要围绕你的查询需求建立一个索引——这个快速免费的视频课程应该能让你很快跟上进度


您真的需要所有列吗?只带几个,然后再测试一次。您可以向索引中添加列,称为覆盖索引。
date
的数据类型是什么?您显然没有专门使用索引,因为您引入了所有列-这意味着NC索引没有覆盖您的查询,因此尽管您的索引正在使用,您仍将返回到聚集索引以获取更多字段。日期数据类型为datetime@joy你熟悉覆盖索引技术吗?你测试过我的建议了吗?这看起来是一个非常有用的信息链接!非常感谢。当我将日期范围扩展到8个月时,查询2返回结果的速度比查询1快,这对我来说没有多大意义。然后,我将Select语句限制为仅包含日期列,查询2的速度仍然稍快。有什么想法吗?
SELECT *
FROM testtable WITH(INDEX(0)) 
WHERE date BETWEEN '01/01/2017' AND '03/01/2017'
ORDER BY date
CREATE NONCLUSTERED INDEX IX_your_index_name 
ON testtable  (date)  
INCLUDE (col1,col2,col3);  
GO