web-dev-qa-db-fra.com

Pourquoi et quand devrais-je utiliser SPARSE COLUMN? (SQL SERVER 2008)

Après avoir parcouru quelques tutoriels sur SPARSE COLUMN, la nouvelle fonctionnalité de SQL SERVER 2008, j’ai constaté qu’il ne prend pas d’espace si la valeur de la colonne est 0 ou null, clairsemées).

Si ma compréhension est correcte, alors pourquoi y aller au moment de la conception de la base de données? Et si je l’utilise, alors dans quelle situation je le suis?

Également par curiosité, pourquoi aucun espace n'obtient de réserve si une colonne est définie comme une colonne épars (je veux dire, quelle est l'implémentation interne pour cela)

Merci d'avance

61
priyanka.sarkar

Une colonne fragmentée n'utilise pas 4x la quantité d'espace pour stocker une valeur, elle utilise un (fixe) 4 octets supplémentaires par valeur non nulle. (Comme vous l'avez déjà indiqué, une valeur NULL prend 0 espace.)

  • Ainsi, une valeur non nulle stockée dans une colonne bit serait 1 bit + 4 octets = 4.125 octets. Mais si 99% d’entre elles sont NULL, il s’agit toujours d’une économie nette.

  • Une valeur non nulle stockée dans une colonne GUID (UniqueIdentifier) ​​ correspond à 16 octets + 4 octets = 20 octets. Donc, si seulement 50% d’entre elles sont NULL, cela reste une économie nette.

Les "économies escomptées" dépendent donc fortement de la nature de la colonne dont nous parlons et du type type dont vous parlez, ainsi que de votre ratio. Les colonnes à largeur variable (varchars) sont probablement un peu plus difficiles à prévoir avec précision.

Cette page Documentation en ligne contient un tableau indiquant quel pourcentage de différents types de données doit être nul pour que vous obteniez un avantage.

Alors, quand devriez-vous utiliser une colonne fragmentée? Lorsque vous vous attendez à ce qu'un pourcentage significatif des lignes ait une valeur NULL. Quelques exemples qui me viennent à l’esprit:

  • Une colonne "Date de retour de la commande} _" dans une table de commandes. Vous espérez qu'un très faible pourcentage des ventes aboutira à des produits retournés.
  • Une ligne "4th Address} _" dans un tableau d'adresses. La plupart des adresses postales, même si vous avez besoin d'un nom de département et d'un "Entretien de", n'ont probablement pas besoin de 4 lignes séparées.
  • Une colonne "suffixe} _" dans une table client. Un pourcentage assez faible de personnes ont un "Jr." ou "III" ou "Esquire" après leur nom.
83
BradC
  • Stocker un null dans une colonne clairsemée ne prend aucun espace.

  • Pour toute application externe, la colonne se comportera de la même manière

  • Les colonnes fragmentées fonctionnent très bien avec les index filtrés, car vous souhaitez uniquement créer un index pour traiter les attributs non vides de la colonne.

  • Vous pouvez créer un ensemble de colonnes sur les colonnes fragmentées qui renvoie un clip xml de toutes les données non NULL des colonnes couvertes par l'ensemble. L'ensemble de colonnes se comporte comme une colonne elle-même. Remarque: vous ne pouvez avoir qu'un seul jeu de colonnes par table.

  • La capture de données modifiée et la réplication transactionnelle fonctionnent toutes les deux, mais pas la fonctionnalité des ensembles de colonnes.

Inconvénients

  • Si une colonne fragmentée contient des données, il faudra 4 octets de plus qu'une colonne normale, par ex. même un bit (0,125 octets normalement) correspond à 4,125 octets et l'identificateur unique s'élève de 16 octets à 20 octets.

  • Tous les types de données ne peuvent pas être clairsemés: texte, ntext, image, horodatage, type de données défini par l'utilisateur, géométrie ou géographie ou varbinray (max) avec l'attribut FILESTREAM ne peut pas être clairsemé. (Changed17/5/2009 merci Alex d'avoir remarqué la faute de frappe)

  • les colonnes calculées ne peuvent pas être rares (bien que les colonnes éparses puissent prendre part à un calcul dans une autre colonne calculée)

  • Vous ne pouvez pas appliquer de règles ou avoir des valeurs par défaut.

  • Les colonnes fragmentées ne peuvent pas faire partie d'un index clusterisé. Si vous devez le faire, utilisez une colonne calculée basée sur la colonne fragmentée et créez l'index en cluster sur celui-ci (ce qui vainc l'objet).

  • La réplication de fusion ne fonctionne pas.

  • La compression des données ne fonctionne pas.

  • L'accès (en lecture et en écriture) aux colonnes éparses est plus coûteux, mais je n'ai pas été en mesure de trouver de chiffres exacts à ce sujet.

Référence

23
rahul

Vous lisez mal - il ne faut jamais 4x l'espace. 

Plus précisément, il est indiqué 4 * (4 octets, voir la note de bas de page) et non 4x (multiplier par 4). Le seul cas où l'espace est exactement 4x est un caractère (4), ce qui permettrait de réaliser des économies si les valeurs NULL existent plus de 64% du temps.

"* La longueur est égale à la moyenne des données contenues dans le type, plus 2 ou 4 octets."

3
mbourgon
| 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)  |

Vous perdez 4 octets, pas seulement une fois par ligne; mais pour chaque cellule de la ligne, la valeur n'est pas nulle.

0
Ian Boyd