¿Qué tan precisa es la columna sys.partition.rows?

13

La vista del sistema sys.partitionstiene una columna "filas" que es el número total de filas en una partición dada. Para una tabla que no está particionada (o que solo tiene una partición dependiendo de cómo la mire), esta columna proporciona el número de filas en la tabla.

Tengo curiosidad por saber qué tan precisa es esta columna y si puedo usarla en lugar de a SELECT COUNT(1) FROM TableName. He realizado algunos experimentos en los que crear una tabla y agregar algunos miles de filas, eliminar algunos cientos, agregar algunos miles más, etc. y el conteo siempre ha sido inexacto. Sin embargo, tengo una tabla con aproximadamente 700 mil filas y varios índices. La fila sys.partitionspara el índice agrupado está nuevamente activada, sin embargo, los otros índices muestran algunas ligeras variaciones (+ -20k).

¿Alguien sabe cómo se calcula esta fila y si es tan precisa como parece?

Kenneth Fisher
fuente
44
He estado usando una consulta basada en la columna de filas durante años. No he observado que esté desactualizado
billinkc

Respuestas:

13

Books Online indica que el campo de filas "indica la aproximación número de filas en esta partición". Por lo tanto, esperaría que fuera cercano, pero no 100% preciso, el 100% del tiempo.

Michael Zilberstein informa un ejemplo de sys.partitionsser muy incorrecto en Por falta de un clavo . No digo que es un hecho común, pero es posible.

sys.dm_db_index_physical_statscontiene un record_countcampo que parece ser más preciso, aunque tenga en cuenta que ejecutar el DMV puede provocar un problema de bloqueo de REDO si lo ejecuta en una instancia que aloja una réplica secundaria legible AlwaysOn.

La explicacion del record_countcampo muestra la siguiente información:

Número total de registros.

Para un índice, el número total de registros se aplica al nivel actual del árbol b en la unidad de asignación IN_ROW_DATA.

Para un montón, el número total de registros en la unidad de asignación IN_ROW_DATA.

Para un montón, el número de registros devueltos por esta función podría no coincidir con el número de filas que se devuelven ejecutando un SELECT COUNT (*) contra el montón. Esto se debe a que una fila puede contener múltiples registros. Por ejemplo, en algunas situaciones de actualización, una única fila de montón puede tener un registro de reenvío y un registro reenviado como resultado de la operación de actualización. Además, la mayoría de las filas LOB grandes se dividen en múltiples registros en el almacenamiento LOB_DATA. Para las unidades de asignación LOB_DATA o ROW_OVERFLOW_DATA, el número total de registros en la unidad de asignación completa.

Vea también la respuesta de Martin Smith a una pregunta similar sobre Stack Overflow.

Max Vernon
fuente