2009-09-09 18 views
56

Dopo aver eseguito alcune esercitazioni sulla nuova funzionalità di SQL SERVER 2008 SPARSE COLUMN, ho rilevato che non occupa spazio se il valore della colonna è 0 o null ma quando è presente un valore, sono necessari 4 volte lo spazio contiene una colonna regolare (non sparsa).Why & When dovrei usare SPARSE COLUMN? (SQL SERVER 2008)

Se la mia comprensione è corretta, allora perché andrò a farlo al momento della progettazione del database? E se lo uso, allora in che situazione sono?

anche per curiosità, come mai riserva alcuno spazio di ottenere quando una colonna è definito come colonna di tipo sparse (voglio dire, qual è l'implementazione interna per questo)

Grazie in anticipo

+0

Questo collegamento da [MSDN] (https://msdn.microsoft.com/en-us/library/cc280604.aspx) presenta dettagli tabulari che mostrano risparmi di spazio. ogni tipo di dati. Può essere un ottimo indicatore in questo senso. – RBT

+0

Un'ottima lettura su colonne sparse in generale [qui] (https://www.simple-talk.com/sql/t-sql-programming/null-friendly-using-sparse-columns-and-column-sets- in-sql server /). – RBT

risposta

74

Una colonna sparse non usa 4x la quantità di spazio per memorizzare un valore, esso utilizza un (fisso) 4 extra byte a valore non nullo. (Come si è già detto, un NULL prende 0 spazio.)

  • Quindi un valore non nullo memorizzato in una colonna dipo 'sarebbe 1 bit + 4 byte = 4.125 byte. Ma se il 99% di questi è NULL, è ancora un risparmio netto.

  • Un valore non nullo memorizzato in una colonna GUID (UniqueIdentifier) ​​ è di 16 byte + 4 byte = 20 byte. Quindi se solo il 50% di questi è NULL, si tratta comunque di un risparmio netto.

Così i "risparmi attesi" dipende fortemente su quale tipo di colonna di cui stiamo parlando, e la vostra stima di ciò che il rapporto sarà nullo vs non nullo. Le colonne a larghezza variabile (varchar) sono probabilmente un po 'più difficili da prevedere con precisione.

Questo Books Online Page ha una tabella che mostra quale percentuale di di tipi di dati diversi deve essere nullo per poter ottenere un vantaggio.

Quindi quando si dovrebbe utilizzare una colonna sparsa? Quando si prevede che una percentuale significativa delle righe abbia un valore NULL. Alcuni esempi che vengono in mente:

  • A "Order data di ritorno" colonna in una tabella ordine. Spereresti che una percentuale molto piccola delle vendite risultasse in prodotti restituiti.
  • Una riga "4th Address" in una tabella Indirizzo. La maggior parte degli indirizzi postali, anche se hai bisogno di un nome di dipartimento e di "Care Of", probabilmente non hanno bisogno di 4 linee separate.
  • Una colonna "Suffisso" in una tabella clienti. Una percentuale abbastanza bassa di persone ha un "Jr." o "III" o "Esquire" dopo il loro nome.
+3

C'era una modifica suggerita che si tratta di 4 byte extra per campo non nullo * *. Non è corretto, l'ho riportato indietro per dire * riga *. Per chiarire con un esempio: se abbiamo una tabella di 100 righe con un campo GUID, 10 righe di cui hanno valori, 90 righe sono NULL. Un campo GUID è normalmente 16 byte, quindi un GUID normale (non sparse) sarebbe 16 * 100 = 1600 byte. Se rendessimo questo campo sparse, lo spazio utilizzato sarebbe invece solo (16 + 4) * 10 = 200 byte, non (16 * 10) +4 = 164 byte. La penalità di 4 byte si applica a ogni riga popolata. – BradC

+3

Ma sicuramente, se ci sono più campi sparsi in una riga, la penalità di 4 byte si applica a ciascuno dei * campi * separatamente? In tal caso sarebbe più naturale dire * per campo * (che in realtà significherebbe * per campo per riga *). In realtà mi ci è voluto un po 'per capire che la tua comprensione di * per campo * era * per campo per tabella *. – GSerg

+0

Sì, dovresti calcolare la penalità prevista separatamente per più campi sparsi nella stessa tabella. Immagino che sarebbe opportuno valutarli insieme se ci si aspetta che coincidano (come se ci fossero 5 campi che vengono compilati solo se un prodotto viene restituito o qualcosa del genere). – BradC

21
  • La memorizzazione di un valore null in una colonna sparsa non richiede affatto spazio.

  • Per qualsiasi applicazione esterna la colonna si comporterà gli stessi

  • colonne di tipo sparse funzionano davvero bene con gli indici filtrati come si vogliono solo creare un indice a che fare con gli attributi non vuoti nella colonna.

  • È possibile creare un set di colonne sulle colonne sparse che restituisce una clip xml di tutti i dati non nulli dalle colonne coperte dal set. Il set di colonne si comporta come una colonna stessa. Nota: puoi avere solo un set di colonne per tabella.

  • Change Data Capture e Replica transazionale funzionano entrambe, ma non la funzione di set di colonne.

Inconvenienti

  • Se una colonna sparso presenta dati in esso richiederà più 4 byte di una colonna normale esempio anche un po '(0.125 byte normalmente) è 4.125 byte e l'identificatore univoco aumenta da 16 byte a 20 byte.

  • Non tutti i tipi di dati possono essere sparsi: testo, ntext, immagine, data/ora, tipo di dati definiti dall'utente, geometria o area geografica o varbinray (max) con l'attributo FILESTREAM non possono essere sparsi. (Changed17/5/2009 Grazie Alex per individuare l'errore di battitura)

  • colonne calcolate non possono essere sparso (sebbene colonne sparse possono partecipare a un calcolo in un'altra colonna calcolata)

  • Non è possibile applicare regole o hanno valori predefiniti.

  • Le colonne sparse non possono far parte di un indice cluster. Se è necessario, utilizzare una colonna calcolata basata sulla colonna sparsa e creare l'indice cluster su quello (il tipo di sconfigge l'oggetto).

  • La replica di unione non funziona.

  • La compressione dei dati non funziona.

  • L'accesso (lettura e scrittura) alle colonne sparse è più costoso, ma non sono stato in grado di trovare cifre esatte su questo.

Reference

+0

Grazie .. Ho già coperto quel sito. Ma anche in quel sito non è stato possibile rispondere alle domande che ho posto qui. In quale situazione dovrei andare con la colonna sparsa quando occorrono 4 volte più spazio! –

3

Stai leggendo male, non richiede mai lo spazio di 4x.

In particolare, dice 4 * (4 byte, vedi nota), non 4x (moltiplicato per 4). L'unico caso in cui è esattamente 4x lo spazio è un char (4), che vedrebbe un risparmio se i NULL esistessero più del 64% delle volte.

"* La lunghezza è uguale alla media dei dati contenuti nel tipo, più 2 o 4 byte."

-2

Da SQL SERVER – 2008 – Introduction to SPARSE Columns – Part 2 da Pinal Dave:

Tutte le colonne di tipo sparse vengono memorizzati come una colonna XML nel database. Lasciaci vedere alcuni dei vantaggi e svantaggi della colonna SPARSE.

Vantaggi della colonna SPARSE sono:

  • INSERT, UPDATE e DELETE possono fare riferimento alle colonne sparse per nome. La colonna SPARSE può funzionare anche come una colonna XML.

  • La colonna SPARSE può sfruttare gli indici filtrati, in cui i dati vengono compilati nella riga.

  • La colonna SPARSE consente di risparmiare molto spazio del database quando nel database sono presenti valori nulli o nulli.

Svantaggi di colonna di tipo sparse sono:

  • colonna di tipo sparse non ha identità o proprietà ROWGUIDCOL.

  • La colonna SPARSE non può essere applicata a testo, ntext, immagine, timestamp, geometria, geografia o tipi di dati definiti dall'utente.

  • La colonna SPARSE non può avere valore predefinito o regola o colonna calcolata.

  • L'indice cluster o un indice di chiave primaria univoco non possono essere applicati colonna SPARSE. La colonna SPARSE non può far parte della chiave di indice cluster.

  • La tabella contenente la colonna SPARSE può avere la dimensione massima di 8018 byte invece dei normali 8060 byte. Un'operazione di tabella che coinvolge la colonna SPARSE subisce un calo delle prestazioni rispetto alla colonna normale.

+4

Lo straripamento dello stack non è un luogo per lunghe discussioni .. in aggiunta, hai risposto piuttosto tardi, in sostanza, solo riassumendo le informazioni che erano già ben riassunte e accettate. Non lo rimuoverò, poiché risponde alla domanda, ma la comunità potrebbe reagire negativamente ad essa. –

+2

http://blog.sqlauthority.com/2008/07/14/sql-server-2008-introduction-to-sparse-columns-part-2/ –

+0

Ho intenzione di revocare questo. La spiegazione di tutti i campi sparsi che si tengono in un campo XML cancella un po 'le cose nella mia testa. Nessun altro ha menzionato questo. – Brain2000

0
| datetime NULL  | datetime SPARSE NULL | datetime SPARSE NULL | 
|--------------------|----------------------|----------------------| 
| 20171213 (8 bytes) | 20171213 (12 bytes) | 20171213 (12 bytes) | 
| NULL  (8 bytes) | 20171213 (12 bytes) | 20171213 (12 bytes) | 
| 20171213 (8 bytes) | NULL  (0 bytes) | NULL  (0 bytes) | 
| NULL  (8 bytes) | NULL  (0 bytes) | NULL  (0 bytes) | 

Si perde 4 byte non solo una volta per riga; ma per ogni cella della riga che non è nulla.

Problemi correlati