2012-01-24 10 views
5

Poiché i dati del database sono organizzati in pagine 8k in un albero B e analogamente per le informazioni di informazioni PK, dovrebbe essere possibile per ciascuna tabella del database calcolare l'altezza dell'albero B. Così rivelando quanti salti ci vuole per raggiungere determinati dati.Individuazione dell'altezza dell'albero B di una tabella in SQL Server

Dato che sia la dimensione della riga che la dimensione del PK sono di grande importanza, è difficile calcolare poiché ad es. varchar(250) non è necessario prendere 250 byte.

1) C'è un modo per ottenere le informazioni da SQL Server? 2) se no, è possibile dare una stima approssimativa usando un codice analizzando le tabelle del db?

+0

Avete anche bisogno di conoscere l'altezza? L'accesso casuale in una struttura ad albero B non è approssimativamente * 'O (log n)' * a prescindere? – Yuck

+0

Bene, ho visto esempi di chiavi primarie molto grandi .. come 2 x GUID + 2 int. Sarebbe interessante vedere la penalità in quanto è possibile memorizzare così tante chiavi in ​​meno in ciascuna pagina indice –

+1

Ricorda che solo le tabelle con indici cluster sono memorizzate come alberi B, se non c'è indice cluster la tabella viene memorizzata come mucchio. Quindi quello che vuoi veramente sapere è qual è l'altezza dell'albero B per l'indice cluster, quindi la risposta sotto per dm_db_index_physical_stats. –

risposta

9

SI! Ovviamente!

Dai un'occhiata allo DMV = dynamic management views in SQL Server: contengono una miniera di informazioni sugli indici. Il dm_db_index_physical_stats è particolarmente utile per guardando le proprietà di indice ...

Se si esegue questa query in AdventureWorks contro il tavolo più grande - Sales.SalesOrderDetails con oltre 200'000 le righe - si otterrà alcuni dati:

SELECT 
    index_depth, 
    index_level, 
    record_count, 
    avg_page_space_used_in_percent, 
    min_record_size_in_bytes, 
    max_record_size_in_bytes, 
    avg_record_size_in_bytes 
FROM 
    sys.dm_db_index_physical_stats(DB_ID(), OBJECT_ID('Sales.SalesOrderDetail'), 1, NULL, 'DETAILED') 

Otterrai l'output per tutti i livelli di indice, così potrai vedere a colpo d'occhio quanti livelli ci sono nell'indice (ho tre righe -> tre livelli nell'indice). Il livello di indice 0 è sempre il livello foglia - dove nell'indice cluster (index_id = 1) si dispone delle pagine di dati effettive.

enter image description here

Si può vedere la dimensione massima record in byte medio, minimo e una grande quantità di informazioni aggiuntive - Leggi su DMV, c'è un ottimo modo per diagnosticare e sbirciare nel funzionamento interno di SQL Server !

+0

puoi per favore consigliare quale è la dimensione dell'ordine di questo indice B Tree? E in che modo il server SQL determina la dimensione dell'ordine da utilizzare? È solo dal punto di vista della curiosità. –

3

provare questo:

SELECT INDEXPROPERTY(OBJECT_ID('table_name'), 'index_name', 'IndexDepth') 
Problemi correlati