【问题标题】:Microsoft SQL Server 2008 R2 index slows down queryMicrosoft SQL Server 2008 R2 索引减慢查询速度
【发布时间】:2012-11-28 05:35:31
【问题描述】:

我目前正在努力提高 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

查询不是我编写的,看起来过于复杂,但我想在不更改任何查询的情况下解决这个问题。我最大的惊喜是索引的效果在不同系统之间是不一样的。

【问题讨论】:

  • 嗯,您的测试与生产系统上的数据量和分布可能完全不同 - 因此,您在测试系统上确定一百行可能在具有数十万行的生产系统上以相同的方式工作.....
  • 在 marc 上的位置 - 你不能那样做,除非 test 是最近的生产副本。此外,DTA 很好,但并不总是正确,尤其是如果您聚集的时间太短。

标签: sql-server indexing


【解决方案1】:

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

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

【讨论】:

  • +1。虽然我认为这确实属于 dba.stackexchange.com
  • 您好,测试系统使用了大约一周前的备份,应该具有代表性。也很奇怪,我认为没有达到预期的 65% 的改进,因为它减慢了很多...... @Mitch:是的,你是对的。我的坏...
  • @StevenH:TEST 和 PROD 使用的硬件(服务器、RAM、CPU)是否也可比?
  • @Marc_S:不,预计测试硬件会更快一些,但在这种情况下(我)仍会看到一些改进
  • @StevenH:您能否在测试服务器和生产服务器上运行查询并获取实际的执行计划,然后将它们发布在这里? (编辑/更新您的问题)
【解决方案2】:

你可以使用 profiler 和 DTA ,它会建议在上面包含索引。

解决您的问题首先检查列 version_date , user_id 没有索引。如果已经存在索引,那么您必须确定索引的碎片级别。如果碎片在 5% 到 30% 之间,那么你必须重新组织索引,如果碎片超过 30%,那么你必须重建索引。

检查碎片 转到所需的表并转到索引-> rc on ur index name--> properties--> fragmentaion

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

【讨论】:

  • 您好,感谢您的回答。主键索引非常碎片化,所以我重建了它。不幸的是没有变化。此表中没有其他索引,这就是为什么我要添加一个。在我的开篇文章中添加使用查询的查询仍然会减慢查询速度,尽管从 17 秒到 1 分 40 秒。这是 DTA 建议的索引。
猜你喜欢
  • 2016-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多