Wo sollte man Indizes in eine Zeitdimensionstabelle einfügen?

10

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?

Spredzy
quelle

Antworten:

7

Sie werden wahrscheinlich nicht auf Probleme mit Schreibproblemen stoßen, da ich davon ausgehe, dass dies einmal (oder einmal pro Jahr) erstellt und dann nicht berührt wird.

Die Verwendung eines Index ist jedoch wahrscheinlich ein Hindernis, wenn Sie nach Wochen suchen ... Das Problem ist, dass bei Verwendung des Index dieser möglicherweise zuerst gescannt wird und dann jeder Datensatz einzeln aus der Tabelle entnommen wird. Wenn Sie mehr als 5 bis 20% der Datensätze abrufen, ist es normalerweise schneller, einen vollständigen Tabellenscan durchzuführen und dann die Datensätze zu löschen, die Sie nicht interessieren.

Ich kenne keine wichtigen RDBMS, die sich nicht dafür optimieren, wenn es sich um gut verteilte Daten handelt. Wenn es nicht gut verteilt ist (z. B. kommt einer der Werte in einer Spalte in 95% der Fälle vor, aber es gibt auch andere mögliche Werte), müssen Sie möglicherweise Histogramme in der Tabelle berechnen und bei der Suche keinen Platzhalter für den Wert verwenden. Damit der Abfrageoptimierer den Wert hat, nach dem beim Generieren des Ausführungsplans gesucht wird.

Ich würde wahrscheinlich nicht den Wochentag indizieren. Ich würde in der Dokumentation meiner Datenbank nachsehen, wie hoch der Kompromiss zwischen indizierten Lesevorgängen und vollständigen Tabellenscans ist, um festzustellen, ob ich den Tag des Monats oder den Monat des Jahres indizieren würde. Ich würde wahrscheinlich DOY / Tag des Jahres indexieren, falls vorhanden (was sowieso so klingt, als wäre es Ihr einzigartiger Index).

Joe
quelle
5

Ein Index muss nicht eindeutig sein, um nützlich zu sein. Die Antwort hängt also davon ab . Wenn Ihre Abfragen vom Vorhandensein des Index profitieren, sind sie möglicherweise eine sinnvolle Ergänzung. Ich weiß nicht, dass es spezielle Richtlinien für Zeitspalten geben sollte. Behandeln Sie sie wie alle anderen Spalten und indizieren Sie sie basierend auf der Nützlichkeit für Abfragen.

Leigh Riffel
quelle
Hört jemand anders als ich jedes Mal die Stimme von Paul Randal, wenn er sagt oder liest, dass es in Bezug auf Datenbanken darauf ankommt? : p
AndrewSQL
3

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.

Larry Coleman
quelle
1

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 EXPLAINum 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.

Gaurav
quelle