Una colonna sparsa non utilizza 4 volte la quantità di spazio per memorizzare un valore, utilizza un (fisso) 4 byte extra per valore non nullo. (Come hai già affermato, un NULL occupa 0 spazio.)
-
Quindi un valore non null memorizzato in un bit la colonna sarebbe 1 bit + 4 byte =4,125 byte. Ma se il 99% di questi è NULL, è comunque un risparmio netto.
-
Un valore non null memorizzato in un GUID (UniqueIdentifier) la colonna è 16 byte + 4 byte =20 byte. Quindi, se solo il 50% di questi è NULL, si tratta comunque di un risparmio netto.
Quindi il "risparmio atteso" dipende fortemente dal tipo della colonna di cui stiamo parlando e la tua stima di quale rapporto sarà nullo e non nullo. Le colonne a larghezza variabile (varchar) sono probabilmente un po' più difficili da prevedere con precisione.
Questa pagina di libri in linea ha una tabella che mostra quale percentuale di tipi di dati diversi dovrebbe essere nullo per ottenere un vantaggio.
Quindi quando dovresti usare una colonna sparsa? Quando si prevede che una percentuale significativa delle righe abbia un valore NULL. Alcuni esempi che mi vengono in mente:
- Una "Data di restituzione dell'ordine " in una tabella degli ordini. Spereresti che una percentuale molto piccola delle vendite si traduca in prodotti restituiti.
- Un "4° indirizzo " riga in una tabella degli indirizzi. La maggior parte degli indirizzi postali, anche se hai bisogno di un nome di reparto e di un "Care Of", probabilmente non hanno bisogno di 4 righe separate.
- Un "Suffisso colonna " in una tabella cliente. Una percentuale abbastanza bassa di persone ha un "Jr." o "III" o "Esquire" dopo il proprio nome.