Quanto è precisa la colonna sys.partition.rows?


13

La vista di sistema sys.partitionsha una colonna "righe" che è il numero totale di righe in una determinata partizione. Per una tabella che non è partizionata (o ha solo una partizione a seconda di come la si guarda) questa colonna fornisce il numero di righe nella tabella.

Sono curioso di sapere quanto sia precisa questa colonna e se posso usarla al posto di a SELECT COUNT(1) FROM TableName. Ho fatto alcuni esperimenti in cui creare una tabella e aggiungere alcune migliaia di righe, eliminare alcune centinaia, aggiungere alcune migliaia di altre ecc. E il conteggio è sempre stato morto. Tuttavia ho una tabella con circa 700 milioni di righe e diversi indici. La riga sys.partitionsper l'indice cluster è di nuovo morta, tuttavia gli altri indici mostrano alcune lievi variazioni (+ -20k).

Qualcuno sa come viene calcolata questa riga e se è accurata come appare?


4
Sto usando una query basata sulla colonna delle righe da anni. Non ho notato che è obsoleto
Billinkc

Risposte:


13

Books Online afferma che il campo righe "indica il numero approssimativo di righe in questa partizione". Mi aspetto quindi che sia vicino, ma non preciso al 100%, il 100% delle volte.

Michael Zilberstein riporta un esempio di sys.partitionsessere selvaggiamente errato in Per mancanza di un chiodo . Non dire che è un evento comune, ma è possibile.

sys.dm_db_index_physical_statscontiene un record_countcampo che sembra essere più accurato, anche se tenere presente che l'esecuzione del DMV può comportare un problema di blocco REDO se lo si esegue su un'istanza che ospita una replica secondaria leggibile sempre.

La spiegazione per il record_countcampo mostra le seguenti informazioni:

Numero totale di record.

Per un indice, il numero totale di record si applica al livello corrente dell'albero b nell'unità di allocazione IN_ROW_DATA.

Per un heap, il numero totale di record nell'unità di allocazione IN_ROW_DATA.

Per un heap, il numero di record restituiti da questa funzione potrebbe non corrispondere al numero di righe restituite eseguendo SELECT COUNT (*) contro l'heap. Questo perché una riga può contenere più record. Ad esempio, in alcune situazioni di aggiornamento, una singola riga di heap può avere un record di inoltro e un record inoltrato a seguito dell'operazione di aggiornamento. Inoltre, la maggior parte delle righe LOB di grandi dimensioni sono suddivise in più record nella memoria LOB_DATA. Per le unità di allocazione LOB_DATA o ROW_OVERFLOW_DATA, il numero totale di record nell'unità di allocazione completa.

Vedi anche la risposta di Martin Smith a una domanda simile su Stack Overflow.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.