Sql server Microsoft SQL Server 2008 R2索引降低查询速度

Sql server Microsoft SQL Server 2008 R2索引降低查询速度,sql-server,indexing,Sql Server,Indexing,我目前正在努力提高Microsoft SQL Server 2008 R2的性能。分析查询时,Microsoft数据库引擎优化工具将使用此查询创建索引: CREATE NONCLUSTERED INDEX [samplelocation1] ON [dbo].[sample_location] ( [sample_id] ASC, [sample_code] ASC ) WITH (SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DRO

我目前正在努力提高Microsoft SQL Server 2008 R2的性能。分析查询时,Microsoft数据库引擎优化工具将使用此查询创建索引:

CREATE NONCLUSTERED INDEX [samplelocation1] ON [dbo].[sample_location]  
(
    [sample_id] ASC,
    [sample_code] ASC
) WITH (SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF) ON [PRIMARY]
这将使用从备份还原的数据库在测试服务器(运行相同版本的SQL server,2008 R2)上执行查询的时间从17秒缩短到5秒

但是,在生产服务器上,执行时间从17秒增加到1分40秒。发生什么事了

查询:

select * 
from sample_view  
where version_date >= '<date>' 
  and version_date - 0.9999999 <= '<date>' 
  and (cus_id in (select company_id 
                  from company_emp_relation_view 
                  where user_id = '<userid>') 
       or 
       fac_id in (select company_id 
                  from company_emp_relation_view 
                  where user_id = '<userid>'))  
  and sample_code in (select min(sample_code)  
                      from sample_location 
                      group by sample_id) 
  and (rfq_status<>'I') 
  and location <> 'D'  
order by 
  version_date desc
选择*
从示例视图
其中版本\u日期>=“”

和version_date-0.9999999好吧,您的测试和生产系统上的数据量和分布可能完全不同-因此,您在测试系统上确定的只有几百行的任何内容都可能在生产系统上以同样的方式工作,生产系统上有几十万行


数据的数量和分布是查询优化器决定是否使用索引(或只是执行表扫描)的关键因素。因此,任何性能调整都必须在实际数据(或其副本)上执行,而不是在只有一小部分数据的“虚拟”开发或测试系统上执行…

u可以使用探查器和DTA,它将给出在其上包含索引的建议

首先检查列version\u date,用户id的索引不是。如果存在alredy索引,则必须确定索引的碎片级别。如果碎片在5%到30%之间,那么你必须重新组织索引,如果碎片超过30%,那么你必须重新构建索引

检查碎片 转到所需表并转到索引-->ur索引名-->属性-->碎片上的rc


如果您的表或视图不包含任何索引,请尝试创建一个聚集索引,然后创建非聚集索引。

那么,您的测试和生产系统上的数据量和分布可能完全不同,因此,您在测试系统上确定的几百行的任何内容在生产系统上的工作方式可能与在生产系统上确定的几十万行的工作方式不同……请注意marc-您不能这样做,除非测试是生产的最新副本。此外,DTA是好的,但它并不总是正确的,特别是如果你收集的时间太短。虽然我认为这确实属于dba.stackexchange.comHi,但测试系统使用了一个大约一周的备份,应该具有代表性。还有一点很奇怪,我认为65%的预期改善率没有达到,因为速度慢了很多…@米奇:是的,你是对的。我的坏…@StevenH:那么测试和产品使用的硬件(服务器、RAM、CPU)也可以比较吗?@Marc_S:不,测试硬件预计会快一点,但(我)仍然会看到一些改进在这个situation@StevenH:请您在测试服务器和prod服务器上运行查询,获取实际执行计划,并将其发布到此处,好吗?(编辑/更新你的问题)嗨,谢谢你的回答。主键索引非常零碎,所以我重新构建了它。不幸的是没有变化。这个表中没有其他索引,这就是我想添加一个索引的原因。在我的开场白中添加一个使用查询的,仍然会减慢查询速度,虽然从17秒到1分钟40秒左右。这是DTA建议的指数。