Qual é a precisão da coluna sys.partition.rows?

13

A visualização do sistema sys.partitionspossui uma coluna "linhas" que é o número total de linhas em uma determinada partição. Para uma tabela que não é particionada (ou possui apenas uma partição, dependendo de como você a vê), esta coluna fornece o número de linhas na tabela.

Estou curioso para saber como essa coluna é precisa e se posso usá-la em vez de a SELECT COUNT(1) FROM TableName. Eu fiz algumas experiências em que cria uma tabela e adiciona alguns milhares de linhas, exclui algumas centenas, adiciona mais alguns milhares etc. No entanto, tenho uma tabela com cerca de 700 mil linhas e vários índices. A linha sys.partitionspara o índice em cluster está novamente desativada, no entanto, os outros índices mostram algumas pequenas variações (+ -20k).

Alguém sabe como essa linha é calculada e se é tão precisa quanto parece?

Kenneth Fisher
fonte
4
Estou usando uma consulta com base na coluna de linhas há muito tempo. Já não observou-se estar fora de data
billinkc

Respostas:

13

O Books Online declara que o campo de linhas "indica o valor aproximado número de linhas nesta partição". Portanto, eu esperaria que fosse próximo, mas não 100% exato, 100% do tempo.

Michael Zilberstein relata um exemplo de sys.partitionsestar descontroladamente incorreto em Por falta de uma unha . Não estou dizendo que é uma ocorrência comum, mas é possível.

sys.dm_db_index_physical_statscontém um record_countcampo que parece ser mais preciso, embora esteja ciente de que a execução do DMV pode resultar em um problema de bloqueio de REDO se você o executar em uma instância que hospeda uma réplica secundária legível AlwaysOn.

A explicação para o record_countcampo mostra as seguintes informações:

Número total de registros.

Para um índice, o número total de registros se aplica ao nível atual da árvore b na unidade de alocação IN_ROW_DATA.

Para um heap, o número total de registros na unidade de alocação IN_ROW_DATA.

Para um heap, o número de registros retornados dessa função pode não corresponder ao número de linhas retornadas executando uma SELECT COUNT (*) no heap. Isso ocorre porque uma linha pode conter vários registros. Por exemplo, em algumas situações de atualização, uma única linha de heap pode ter um registro de encaminhamento e um registro encaminhado como resultado da operação de atualização. Além disso, a maioria das linhas LOB grandes é dividida em vários registros no armazenamento LOB_DATA. Para unidades de alocação LOB_DATA ou ROW_OVERFLOW_DATA, o número total de registros na unidade de alocação completa.

Veja também a resposta de Martin Smith para uma pergunta semelhante no Stack Overflow.

Max Vernon
fonte