2010-03-05 2 views
6

Wenn ich eine Tabellenspalte mit Daten habe und einen Index für diese Spalte erstelle, nimmt der Index den gleichen Speicherplatz wie die Spalte selbst?Verwenden DB-Indizes den gleichen Speicherplatz wie Spaltendaten?

Ich bin interessiert, weil ich versuche zu verstehen, ob B-Bäume tatsächlich Kopien von Spaltendaten in Blattknoten behalten oder sie irgendwie darauf zeigen?

Entschuldigung, wenn dies eine "Wird Java XML ersetzen?" freundliche Frage.

UPDATE:

eine Tabelle mit einer einzigen GUID Spalte ohne Index erstellt, hinzugefügt 1M Reihen - 26MB

derselben Tabelle mit einem Primärschlüssel (Clustered-Index) - 25MB (noch weniger!), Indexgröße - 176KB

gleiche Tabelle mit einem eindeutigen Schlüssel (nicht gruppierten Index) - 26MB, Indexgröße - 27MB

Daher benötigen nur Nonclustered-Indizes so viel Speicherplatz wie die Daten selbst.

Alle Messungen wurden in SQL Server 2005

Antwort

3

Der B-Baum verweist auf die Zeile in der Tabelle, aber der B-Baum selbst dauert noch etwas Platz auf der Festplatte durchgeführt.

Einige Datenbank, haben spezielle Tabelle, die den Hauptindex und die Daten einbetten. In Oracle heißt es IOT - indexorganisierte Tabelle.

Jede Zeile in einer regulären Tabelle kann durch eine interne ID identifiziert werden (aber es ist datenbankspezifisch), die vom B-Tree zur Identifizierung der Zeile verwendet wird. In Oracle, ist es rowid genannt und sieht aus wie AAAAECAABAAAAgiAAA :)

Wenn ich eine Spalte der Tabelle mit Daten und einen Index auf dieser Spalte erstellen, wird der Index nimmt gleiche Menge an Platten Raum wie die Spalte selbst ?

In einem einfachen B-Tree haben Sie die gleiche Anzahl von Knoten wie die Anzahl der Elemente in der Spalte.

Betrachten 1,2,3,4:

1 
/
2 
    \ 3 
     \ 4 

Der genaue Raum noch ein bisschen anders sein kann (der Index ist wahrscheinlich etwas größer als es Verbindungen zwischen den Knoten speichern müssen, kann es nicht perfekt ausgeglichen werden, etc.) , und ich denke, Datenbank kann Optimierung verwenden, um einen Teil des Indexes zu komprimieren. Aber die Größenordnung zwischen den Index- und den Spaltendaten sollte gleich sein.

+0

Ist es eine Art Clustered-Index? – Anton

+0

Ich denke, Clustered-Indizes speichern die tatsächlichen Daten, da Clustered-Indizes auf die gleiche Weise wie Daten sortiert sind. – Valentin

+0

Ja, IOT ähnelt einem gruppierten Index. Die Zeile in der Tabelle wird physisch neu geordnet. Hervorragende Leistung, um Daten abzufragen, aber langsamer einzufügen. – ewernli

2

Ich bin mir fast sicher, es ist ziemlich abhängig von der DB, aber im Allgemeinen - ja, nehmen sie zusätzlichen Platz.Dies geschieht aus zwei Gründen:

  1. So kann man die Tatsache nutzen können die Daten in BTREE Blätter sortiert wird;

  2. Sie erhalten Nachschlaggeschwindigkeit Vorteil wie Sie müssen nicht zurück suchen und her, um notwendige Sachen zu holen.

PS überprüfte nur unseren MySQL-Server: für ein 20GB Tabellenindizes nimmt 10GB Platz :)

0

nach zu urteilen diesen article, wird es in der Tat, nimmt mindestens die gleiche Menge an Speicherplatz wie die Daten in der Spalte (in PostgreSQL sowieso). Der Artikel schlägt auch eine Strategie vor, um Festplatten- und Speicherauslastung zu reduzieren.

Eine Möglichkeit, um selbst zu überprüfen wäre, z. Derby DB, erstellen Sie eine Tabelle mit einer Million Zeilen und einer einzelnen Spalte, überprüfen Sie ihre Größe, erstellen Sie einen Index für die Spalte und überprüfen Sie ihre Größe erneut. Wenn Sie die 10-15 Minuten dazu brauchen, lassen Sie uns die Ergebnisse wissen. :)

+0

Ich dachte, es hängt davon ab, wie viele der Zeilen indiziert sind. Wenn eine Tabelle beispielsweise 30 Zeilen enthält, aber nur 2 durchsuchbar sind, benötigen Sie nur 2 B-Bäume für diese bestimmten Zeilen. Aus diesem Grund ist es wichtig ** Zeilen zu indexieren, die nicht für Nachschlagezwecke verwendet werden. –

+0

@Evan: Ich bin mir nicht sicher, ob ich folge ... meinst du "hängt davon ab, wie viele der Spalten indiziert sind"? –

+0

Ja ... ich sagte Spalten habe ich nicht;) –

Verwandte Themen