该相信哪个?

Ric*_*ick 8 performance index sql-server

我们正在与供应商解决一个长期存在的问题。他们的软件有一种倾向,每周一到两次停止工作并停止工作,从而对我们的运营造成重大干扰。尽管我们向他们发送了许多 GB 的日志和数据库备份,但他们仍无法确定原因。最近,他们开始暗示问题出在我们的维护上,而不是出在他们的软件上(尽管没有长时间运行的查询、CPU/RAM/IO 压力,甚至在问题发生时出现死锁)。特别是他们说我们的索引是一个问题。

他们最喜欢使用的工具是 DBCC showcontig,尽管我认为 MS 不赞成使用该工具。他们尤其关注扫描密度和范围碎片。为了消除这个借口,我制定了一些积极的夜间维护,以<90% 的扫描密度或> 10% 的碎片重建索引。这在某种程度上使他们脱离了扫描密度序列,但他们仍然专注于范围碎片。即使在数小时前重建的索引上,DBCC showcontig 也会显示高度碎片化。下面是 dbcc_showcontig 和 sys.dm_db_index_physical_stats 的结果,他们指出一个表是“可能的问题”。

DBCC SHOWCONTIG
Run Code Online (Sandbox Code Playgroud)
  • 扫描的页面......................................: 1222108
  • 扫描的范围............................................:152964
  • 范围开关………………………………………………………………………………………………………………
  • 平均 每个范围的页数………………………………………………………………………………………………………………………………………………
  • 扫描密度 [最佳计数:实际计数]......:84.44% [152764:180905]
  • 逻辑扫描分片 ..................... 3.24%
  • 范围扫描碎片 ..................... 35.97%
  • 平均 每页可用字节数........................: 692.5
  • 平均 页面密度(完整)......................:91.44%

sys.dm_db_index_physical_stats

index_type_desc      alloc_unit_type_desc     Avg_fragmentation_in_percent  page_count

CLUSTERED INDEX       IN_ROW_DATA          3.236803129  1222070

NONCLUSTERED INDEX    IN_ROW_DATA          0.680074642  48230

NONCLUSTERED INDEX    IN_ROW_DATA          0.093237195  48264

NONCLUSTERED INDEX    IN_ROW_DATA          0.03315856   48253

NONCLUSTERED INDEX    IN_ROW_DATA          0.194653248  48291

NONCLUSTERED INDEX    IN_ROW_DATA          0.393480436  58961

NONCLUSTERED INDEX    IN_ROW_DATA          0.23622292   64346

NONCLUSTERED INDEX    IN_ROW_DATA          0.041445623  48256

NONCLUSTERED INDEX    IN_ROW_DATA          0.701172007  59044

NONCLUSTERED INDEX    IN_ROW_DATA          0.216397724  53605
Run Code Online (Sandbox Code Playgroud)

我应该关心我的索引吗?上面的一个不是非典型的。首选的 MS DMV 似乎表明它很好,但供应商坚持 35.97% 的范围碎片。我怀疑这只是他们拼命想找一些东西来归咎于他们的软件问题,但如果我有实际问题,我想尝试修复它。

小智 -2

您可以检查索引是否需要重新组织或重建的一件事是使用以下查询:

declare @strBD nvarchar(50)

set @strBD = N'Tu_BD';

select table = OBJECT_NAME(object_id, database_id)
    ,index = index_id
    ,Index_Type = index_type_desc
    ,Logic_Frag = avg_fragmentation_in_percent
    ,Action = case 
        when avg_fragmentation_in_percent < 30.0
            then 'ALTER INDEX REORGANIZE'
        else 'ALTER INDEX REBUILD WITH (ONLINE = ON)'
        end
from sys.dm_db_index_physical_stats(DB_ID(@strBD), null, null, null, 'LIMITED');
Run Code Online (Sandbox Code Playgroud)

@strBD用。。。来代替your database name

根据结果​​,请按照https://msdn.microsoft.com/en-us/library/ms189858(v=sql.110).aspx中的说明进行操作。此链接适用于 2012 版 SQL Server;请选择正确的版本以正确进行。

正如有人评论的那样,最好告诉您的供应商进行审查和修复,而不仅仅是“碎片问题”。也许可以通过 SQL Profiler 捕获来识别一些查询和执行计划。