Est-ce que les indices DB prennent même quantité d'espace disque que les données de la colonne?

StackOverflow https://stackoverflow.com/questions/2385611

Question

Si j'ai une colonne de table avec les données et créer un index sur cette colonne, sera l'indice de prendre même quantité d'espace disque que la colonne elle-même?

Je suis intéressé parce que je suis en train de comprendre si b arbres gardent en fait des copies de données de la colonne dans les noeuds de feuilles ou ils pointent en quelque sorte à elle?

Désolé si cela a "Java XML remplacer?" question genre.

Mise à jour:

a créé une table sans index avec une seule colonne GUID, a ajouté des lignes 1M - 26Mo

même table avec une clé primaire (index cluster) - 25MB (encore moins!), La taille de l'index - 176KB

même table avec une clé unique (index non cluster) - 26Mo , la taille de l'index - 27MB

Alors que les index non ordonnés en clusters prennent autant de place que les données lui-même.

Toutes les mesures ont été effectuées dans SQL Server 2005

Était-ce utile?

La solution

Les points B-Tree à la ligne de la table, mais le B-Tree se prend encore un peu d'espace sur le disque.

Certaines base de données, ont table spéciale qui embarquent l'index principal et les données. Dans Oracle, il est appelé IOT - Table organisée index

.

Chaque ligne d'une table ordinaire peut être identifié par un identifiant interne (mais il est base de données spécifique) qui est utilisé par le B-Tree pour identifier la ligne. Dans Oracle, il est appelé rowid et ressemble AAAAECAABAAAAgiAAA:)

  

Si j'ai une colonne de table avec des données et   créer un index sur cette colonne, sera   l'indice prend même quantité de disque   espace que la colonne elle-même?

Dans un B-Tree de base, vous avez le même nombre de noeuds que le nombre d'élément de la colonne.

Considérez 1,2,3,4:

    1 
  / 
2
   \ 3 
      \ 4

L'espace exact peut encore être un peu différent (l'indice est probablement un peu plus car il besoin de stocker des liens entre les nœuds, il ne peut pas être parfaitement équilibré, etc.), et je suppose que la base de données peut utiliser l'optimisation pour compresser une partie de l'indice. Mais l'ordre de grandeur entre l'index et les données de colonne doit être le même.

Autres conseils

Je suis presque sûr que c'est assez dépendant DB, mais en général - oui, ils prennent plus d'espace. Cela se produit à cause de deux raisons:

  1. De cette façon, vous pouvez utiliser le fait les données de feuilles BTREE triées;

  2. Vous gagnez un avantage de vitesse de recherche comme     vous n'avez pas à chercher en arrière et     vient chercher des choses neccessary.

PS juste vérifié notre serveur MySQL: pour un index de table 20GB prennent 10 Go d'espace:)

A en juger par cette article , il sera, en fait, prendre au moins la même quantité d'espace que les données de la colonne (en PostgreSQL, de toute façon). L'article va également proposer une stratégie pour réduire le disque et de mémoire.

Une façon de vérifier vous-même serait d'utiliser par exemple DB derby, créez une table avec un million de lignes et une seule colonne, vérifiez sa taille, créez un index sur la colonne et vérifiez sa taille à nouveau. Si vous prenez les 10-15 minutes pour le faire, laissez-nous savoir les résultats. :)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top