Насколько точен столбец sys.partition.rows?


13

Системное представление sys.partitionsимеет столбец «строки», который представляет собой общее количество строк в данном разделе. Для таблицы, которая не разделена (или имеет только один раздел в зависимости от того, как вы на нее смотрите), в этом столбце указывается количество строк в таблице.

Мне интересно, насколько точен этот столбец и могу ли я использовать его вместо a SELECT COUNT(1) FROM TableName. Я провел несколько экспериментов, где создавал таблицу и добавлял несколько тысяч строк, удалял несколько сотен, добавлял еще несколько тысяч и т. Д., И счет всегда был мертвым. Однако у меня есть одна таблица с примерно 700 мил строк и несколько индексов. Строка sys.partitionsдля кластеризованного индекса снова не работает, однако другие индексы показывают небольшие изменения (+ -20k).

Кто-нибудь знает, как рассчитывается этот ряд и насколько он точен?


4
Я использую запрос, основанный на столбце строк в течение веков. Не заметил, что он устарел
billinkc

Ответы:


13

Books Online заявляет, что поле строк «указывает приблизительное количество строк в этом разделе». Поэтому я ожидаю, что он будет близким, но не на 100% точным, в 100% случаев.

Михаэль Зильберштейн приводит пример sys.partitionsдикой неверности в « Из-за гвоздя» . Не сказать, что это обычное явление, но это возможно.

sys.dm_db_index_physical_stats содержит record_count поле, которое представляется более точным, хотя следует помнить, что запуск DMV может привести к проблеме блокировки REDO, если вы запустите его на экземпляре, на котором размещена всегда читаемая вторичная реплика.

Объяснение дляrecord_count поля показывает следующую информацию:

Общее количество записей.

Для индекса общее количество записей применяется к текущему уровню b-дерева в единице выделения IN_ROW_DATA.

Для кучи - общее количество записей в единице выделения IN_ROW_DATA.

Для кучи количество записей, возвращаемых из этой функции, может не совпадать с количеством строк, возвращаемых при запуске SELECT COUNT (*) для кучи. Это потому, что строка может содержать несколько записей. Например, в некоторых ситуациях обновления одна строка кучи может иметь запись пересылки и запись пересылки в результате операции обновления. Кроме того, большинство больших строк больших объектов разделяются на несколько записей в хранилище LOB_DATA. Для единиц выделения LOB_DATA или ROW_OVERFLOW_DATA - общее количество записей в полной единице выделения.

См. Также ответ Мартина Смита на аналогичный вопрос о переполнении стека.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.