Nachdem ich die Fragen und Antworten dieser Website zu Indizes gelesen hatte, kam mir eine Frage in den Sinn.
Was ist, wenn eine Zeitdimensionstabelle verwendet wird, wobei die niedrigere Granularität der Tag ist? Wo soll man die Indizes platzieren?
Randy Melder in der Frage: Was bedeutet "Index" für RDBMS? sagte :
Stellen Sie sich einen Index als "Inhaltsverzeichnis" vor ... das ist eine geordnete Liste von Zeigern auf Positionen in einer Datei, auch Offsets genannt
Im Fall der Zeitdimension können die meisten Datenrecherchen entweder für einen bestimmten Tag, eine bestimmte Woche, einen bestimmten Monat oder ein bestimmtes Quartal durchgeführt werden, wenn der Zeitplan den ganzen Tag für ein bestimmtes Jahr speichert .
Meine Frage ist: Sollte man Indizes für all diese Felder setzen?
Der Tag soll einzigartig sein, daher verstehe ich für diesen Tag die Verwendung von Indizes perfekt. Aber eine Wochen-ID hat 7 Vorkommen , eine Monats-ID hat 30/31 Vorkommen , eine Viertel-ID hat mehr oder weniger 120 Vorkommen .
- Sollte man noch Indizes für diese Felder setzen?
- Wird es noch nützlich sein?
Ich frage Sie das, weil David Spillett in derselben Frage sagte:
Das Hinzufügen zu vieler Indizes kann natürlich eine schlechte Optimierung sein, da der zusätzliche Speicherplatz zum Speichern der Indizes (und die E / A-Last zum Verwalten dieser Indizes, wenn Ihre Datenbank viele Schreibvorgänge sieht) möglicherweise ein schlimmeres Problem darstellt als die etwas weniger optimalen Leseabfragen , übertreibe es also nicht.
Was wären die besten Überlegungen für den Fall der Zeitdimension?
quelle
Die allgemeine Regel lautet: Je selektiver der Index ist (Selektivität wird definiert als die Anzahl der eindeutigen Werte in einer Spalte geteilt durch die Anzahl der Zeilen in der Tabelle), desto wahrscheinlicher ist es, dass die Engine den Index bei einer Abfrage verwendet verwendet die Spalte in einer where-Klausel.
Wenn Sie eine Spalte indizieren möchten, können Sie durch Ausführen einer Abfrage, die die indizierte Spalte vor und nach dem Ausführen auswählt und die Ausführungspläne überprüft, feststellen, ob der Index verwendet wird und wenn ja, wie viel der Index hilft. Im Idealfall wird die Abfrage, die Sie für den Test verwenden, von Ihrer Anwendung verwendet.
quelle
Bisher bestand meine Faustregel darin, überhaupt keine Indizes in meine Entwicklungsdatenbanken aufzunehmen, während ich daran arbeite. Da die Produktion Datenbank größer wird, verwende ich die Datenbankprotokollierung und
EXPLAIN
um herauszufinden , was die Indizierung muss, und dann auch nur die erforderliche Indizes erstellen. Dies funktioniert einwandfrei, solange die Datenbanknutzung allmählich zunimmt und die Indexanzahl niedrig bleibt.Bei der Analyse von Daten in der Datenbank muss ich normalerweise zusätzliche Indizes hinzufügen, um Anforderungen zu beschleunigen, die in der Produktion nicht üblich sind. Ich mache das immer auf Kopien der Produktionsdatenbank, daher werden diese Indizes niemals selbst zur Produktion hinzugefügt.
quelle