venerdì 24 giugno 2011

Basato su colonne di archiviazione in SQL Server 2011

da InfoQ

Come la maggior parte delle principali banche dati, SQL Server normalmente memorizzare una tabella come B-tree se hanno un indice cluster, altrimenti lo usa Heap . Entrambi i metodi sono essenzialmente basati fila, dove il numero di righe per pagina varia a seconda delle dimensioni fila complessiva. A partire da SQL Server 2011 una terza opzione diventa disponibile. Applicando un " Indice Columnstore ", SQL Server memorizza i dati in termini di colonne invece delle righe.

Quando si utilizza una tabella con 1 TB di dati e 1.44 miliardi di righe, la Microsoft sostiene che la colonna orientata query visto una velocità di 16X-up in tempo di CPU e di un miglioramento enorme 455X nel tempo trascorso. In termini reali, questo significa una query che ha preso 501 secondi in origine è stata ridotta a solo 1,1 secondi. Questo test è stato eseguito su un 32-logico macchina processore con 256 GB di RAM.

Questo miglioramento stupefacente è ottenuto isolando ogni colonna per il proprio insieme di pagine. Quando una query viene eseguita solo le colonne del set di risultati vengono caricati dal disco. Le pagine contenenti le altre colonne vengono semplicemente ignorati.

Questo è molto come avere un indice di copertura per ogni possibile combinazione di colonne. Ma invece di costi enormi quantità di spazio su disco rigido, ci vogliono in realtà meno di un tavolo tradizionale. Dal momento che la compressione di SQL Server si verifica a livello di pagina, e una colonna è più probabilità di avere dati ripetuti di fila, le tabelle con gli indici columnstore ci si aspetta che i livelli di compressione più elevato.

La decisione di utilizzare un indice columnstore non può essere presa alla leggera. In primo luogo, non sono aggiornabili. Una volta che l'indice columnstore è stato creato senza nuovi inserti, aggiornamenti o eliminazioni sono consentiti contro il tavolo. Microsoft si aspetta maggior parte dei negozi di usare un ciclo giornaliero di aggiornamento e altrimenti trattare i dati in sola lettura. Durante il ciclo di aggiornare l'indice è sceso, i dati vengono aggiornati, e quindi l'indice è riapplicato. Poiché questo è certamente un'operazione costosa, si potrebbero usare partizionamento verticale per limitare l'abbandono di un sottoinsieme della tabella logica.

L'uso di indici columnstore può anche tradursi in degrado delle prestazioni. Se si lavora con la maggior parte o tutte le colonne, ricombinando le righe può essere molto costoso. Questo significa OLTP stile query deve essere evitato in favore di query OLAP stile. O in altre parole, se vi trovate a scrivere "SELECT *" o tirando indietro di una riga alla volta poi columnstore non è appropriato per voi.


Nessun commento:

Posta un commento