Процент фрагментации индекса отличается от сценария и клиента SSMS - PullRequest
0 голосов
/ 30 сентября 2019

Мы используем SQL Server 2012 (полностью обновленный). Мы проверяли уровни фрагментации с помощью приведенного ниже сценария, но мы получаем очень разные результаты от того, что показывает нам клиент SSMS. Может ли кто-то пролить свет на то, что происходит и кому доверять?

SELECT OBJECT_NAME(ind.OBJECT_ID) AS TableName,
ind.name AS IndexName, indexstats.index_type_desc AS IndexType,
indexstats.avg_fragmentation_in_percent
FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, NULL) indexstats
INNER JOIN sys.indexes ind 
ON ind.object_id = indexstats.object_id
AND ind.index_id = indexstats.index_id
WHERE indexstats.avg_fragmentation_in_percent > -1--You can specify the percent as you want
ORDER BY indexstats.avg_fragmentation_in_percent DESC

Вот результат запуска приведенного выше сценария

enter image description here

Вот результат при просмотре через SSMS Client

enter image description here

Вы можете увидетьэти результаты очень разные. Это наблюдалось как на кластерных, так и некластеризованных индексах.

Если это имеет значение, мы регулярно обновляем статистику, поэтому не уверены, что происходит и кому доверять

1 Ответ

1 голос
/ 30 сентября 2019

Вы вызываете sys.dm_db_index_physical_stats с набором параметров, отличным от того, который использует SSMS.

Когда вы вызываете эту функцию, вы указываете параметр mode=NULL, который совпадает с mode='LIMITED'. Если вы посмотрите SSMS с помощью SQL Profiler, вы увидите, что он предоставляет параметр mode='SAMPLED', например:

select partition_number as PartitionNumber,
    index_type_desc as IndexType,
    index_depth as Depth,
    avg_fragmentation_in_percent    as AverageFragmentation,
    page_count  as Pages,
    avg_page_space_used_in_percent  as AveragePageDensity,
    record_count as Rows,
    ghost_record_count  as GhostRows,
    version_ghost_record_count  as VersionGhostRows,
    min_record_size_in_bytes as MinimumRecordSize,
    max_record_size_in_bytes as MaximumRecordSize,
    avg_record_size_in_bytes as AverageRecordSize,
    forwarded_record_count as ForwardedRecords
from sys.dm_db_index_physical_stats(11, 730589791, 1, NULL, 'SAMPLED')

В соответствии с Режимами сканирования (выделено):

Режим LIMITED является самым быстрым и сканирует наименьшее количество страниц. Для индекса сканируются только страницы родительского уровня B-дерева (то есть страницы выше уровня листа). Для кучи проверяются связанные страницы PFS и IAM, а страницы данных кучи сканируются в режиме LIMITED.

В режиме LIMITED сжато_page_count равно NULL, поскольку компонент Database Engine сканирует только неконечные страницыB-дерево и страницы IAM и PFS в куче.

Используйте режим SAMPLED, чтобы получить приблизительное значение для сжатого_страницы, и используйте режим DETAILED, чтобы получить фактическое значение для сжатого_страницы. Режим SAMPLED возвращает статистику на основе выборки в 1 процент от всех страниц в индексе или куче. Результаты в режиме SAMPLED следует рассматривать как приблизительные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...