Наскільки точний стовпець sys.partition.rows?


14

У системному представленні sys.partitionsє стовпець "рядки", що є загальною кількістю рядків у заданому розділі. Для таблиці, яка не є розділеною (або має лише один розділ, залежно від того, як ви дивитесь на неї) цей стовпець містить кількість рядків у таблиці.

Мені цікаво, наскільки точний цей стовпець і чи можу я використовувати його замість SELECT COUNT(1) FROM TableName. Я робив кілька експериментів, коли створюю таблицю і додаю кілька тисяч рядків, видаляю кілька сотень, додаю ще кілька тисяч і т. Д. І підрахунок завжди був мертвим. Однак у мене є одна таблиця з приблизно 700 мільйонами рядків і декількома індексами. Рядок в sys.partitionsкластерному індексі знову мертвий, проте інші індекси показують незначні зміни (+ -20k).

Хтось знає, як обчислюється цей рядок і чи він настільки точний, як видається?


4
Я зараз використовую запит на основі стовпців рядків уже віками. Не спостерігали, як вона застаріла
billinkc

Відповіді:


13

Книги Інтернет заявляє, що поле рядків "вказує приблизну кількість рядків у цьому розділі." Тому я б очікував, що це буде близько, але не на 100% точно, у 100% часу.

Майкл Зільберштейн повідомляє про приклад того, sys.partitionsщо якраз некоректний в " Хочеться цвяха" . Не кажучи, що це звичайне явище, але це можливо.

sys.dm_db_index_physical_statsмістить record_countполе, яке здається більш точним, хоча слід пам’ятати, що запуск DMV може призвести до проблеми блокування REDO, якщо ви запустите його на екземплярі, який розміщує AlwaysOn Readada Secondary Replica.

Пояснення для record_countполя показує наступну інформацію:

Загальна кількість записів.

Для індексу загальна кількість записів застосовується до поточного рівня b-дерева в блоці розподілу IN_ROW_DATA.

Для купи загальна кількість записів у блоці розподілу IN_ROW_DATA.

Для купи кількість повернених записів за допомогою цієї функції може не відповідати кількості рядків, які повертаються, виконавши SELECT COUNT (*) проти купи. Це тому, що рядок може містити кілька записів. Наприклад, за деяких ситуацій оновлення, один рядок купи може мати запис переадресації та пересланий запис в результаті операції оновлення. Також більшість великих рядків LOB розділено на кілька записів у сховищі LOB_DATA. Для одиниць розподілу LOB_DATA або ROW_OVERFLOW_DATA загальна кількість записів у повній одиниці розподілу.

Дивіться також відповідь Мартіна Сміта на подібне запитання щодо Stack Overflow.


1

BOL дійсно каже, що для цього стовпця "вказується приблизна кількість рядків у цьому розділі." І приблизне дуже приблизне. Я вже бачив, що в певному розділі я мав 1 запис. sy.partitions.row вказувало 4048 рядків. Після видалення цього запису він все ще вказував 4048 рядків, навіть після відновлення всіх індексів тощо. Отже, одного висновку, якщо ви хочете покластися на нього, не варто.


Відредагуйте своє запитання, надавши посилання на джерело цієї цитати. Це покращить вашу відповідь;)
Роналду
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.