Woher weiß ich, welche Indizes für eine Tabelle erstellt werden müssen?

33

Kann ich herausfinden, wie ich am besten weiß, welche Indizes für eine Tabelle erstellt werden müssen?

Nick Ginanto
quelle
11
Es gibt. Versuchen Sie zum Beispiel use-the-index-luke.com .
Dezso
Die Antwort, die ich am häufigsten gesehen habe, ist, dass Sie Primärschlüssel und Spalten indizieren sollten, die Sie in WHEREKlauseln verwenden.
Oskar Persson
Bitte tu das nicht. Ein Primärschlüssel definiert, wie die Daten in der Tabelle physisch sortiert sind, und hat eigene Überlegungen. Sie müssen den Primärschlüssel sehr sorgfältig auswählen, da er auch in allen anderen Indizes verwendet wird. Siehe: sqlskills.com/blogs/kimberly/…
Ali Razeghi
4
@AliRazeghi Das (physische Sortierung) gilt in bestimmten DBMS (unter bestimmten Umständen) und nicht in anderen. Zum Beispiel nicht wahr in PostgreSQL.
Dezso
Voting wieder auf!
Ali Razeghi

Antworten:

29

Kurze Faustregeln. (Einige davon werden automatisch erstellt, aber möglicherweise später manuell gelöscht werden kann, auf dem dbms abhängig. Gehen Sie nicht davon werden Sie immer Arbeit auf PostgreSQL.)

  • Indizieren Sie jeden Primärschlüssel.
  • Indizieren Sie jeden Fremdschlüssel.
  • Indizieren Sie jede Spalte, die in einer JOIN-Klausel verwendet wird.
  • Indizieren Sie jede in einer WHERE-Klausel verwendete Spalte.
  • Lesen Sie Ihre Dokumentation, um zu erfahren, welche "esoterischen" Indizierungsoptionen Ihre Datenbank unterstützt.

Jeder Primärschlüssel bedeutet, dass mehrspaltige Primärschlüssel einen einzigen Index haben sollten, der alle Spalten abdeckt. PostgreSQL erstellt diesen Index automatisch, wenn Sie einen mehrspaltigen Primärschlüssel deklarieren.

In vielen Fällen erzielen Sie mit einem einzelnen mehrspaltigen Index eine bessere Leistung als mit mehreren einspaltigen Indizes. Überwachen Sie langsame Abfragen und führen Sie Tests durch, um herauszufinden, welche welche sind.

Angenommen, Änderungen an der Indizierung verbessern einige Datenbankaktivitäten und beeinträchtigen andere. Ich finde es hilfreich, eine Reihe von SQL-Anweisungen zu haben, die ich vor und nach Änderungen an Indizes profilieren kann. Dieser Satz enthält die Anweisungen SELECT, INSERT, UPDATE und DELETE.

Es gibt keinen Ersatz für das Studium der Dokumente für Ihre speziellen Datenbanken.

  • INDEX ERSTELLEN
  • Indizes (Beachten Sie insbesondere die Abschnitte zur Indizierung von Ausdrücken, zu Teilindizes und zur Überprüfung der Indexverwendung)
Mike Sherrill 'Cat Recall'
quelle
14

Zusätzlich zu dem, was @Catcall bereits zur Verfügung gestellt hat , und um eine kleine Korrektur hinzuzufügen:

In dieser eng verwandten Antwort zu SO habe ich kürzlich auch einige Grundlagen behandelt .

Bisherige Antworten scheinen darauf hinzudeuten, dass Sie Indizes für Primärschlüssel erstellen müssen, aber dies ist in PostgreSQL nicht der Fall (teilweise Ausnahmen). Ich zitiere das Handbuch hier :

PostgreSQL erstellt automatisch einen eindeutigen Index, wenn eine eindeutige Einschränkung oder ein eindeutiger Primärschlüssel für eine Tabelle definiert wird. Der Index deckt die Spalten ab, aus denen der Primärschlüssel oder die eindeutige Einschränkung besteht (ggf. ein mehrspaltiger Index) und ist der Mechanismus, der die Einschränkung erzwingt.

Meine kühne Betonung.

Möglicherweise möchten Sie zusätzliche Indizes für die zweite oder spätere Spalte eines mehrspaltigen Index erstellen , aber der erste wird im Allgemeinen von einem mehrspaltigen Index gut abgedeckt - es sei denn, zusätzliche Spalten vergrößern den Index erheblich. Wir haben das unter dieser verwandten Frage ausführlich besprochen:

Ist ein zusammengesetzter Index auch für Abfragen im ersten Feld geeignet?

Mehrspaltige Indizes , Teilindizes und Indizes für Ausdrücke sind in PostgreSQL besonders leistungsstarke Werkzeuge. Seit PostgreSQL 9.2 gibt es auch Index-Only-Scans , die in anderen RDBMS "Indizes abdecken". Dies ist kein anderer Indextyp, sondern eine neue Funktion des RDBMS mit vorhandenen Indextypen.

Jeder Index ist mit spezifischen Kosten verbunden , sodass Grundkenntnisse für eine wirkliche Optimierung der Indexierung nicht ausreichen. Das einfache Erstellen von mehr Indizes kann mehr schaden als nützen. Insbesondere können Indizes verhindern, dass HOT-Updates die Leistung verbessern.

Im Allgemeinen werden Schreiboperationen ( DELETE, UPDATE) teurer (können aber auch von Vorteil sein!), Während Leseoperationen ( SELECT) im Allgemeinen nur von Vorteil sind. Zu viele Indizes können den Cache - Speicher erschöpft , so dass auch Leseoperationen können leiden.

Schließlich enthält diese Postgres-Wiki-Seite zur Indexverwaltung Tools zum Auffinden doppelter oder nicht verwendeter Indizes (unter anderem).

Erwin Brandstetter
quelle
Wenn ich mich recht erinnere, wird der automatische Index über PK auch auf Oracle v.> = 10 und SQL Server> = 2008
EAmez
1

Es gibt zwei Möglichkeiten.

  1. Tun sie es.
  2. Technologie macht es.

Die Antwort, es selbst zu tun, ist hier ziemlich ausführlich dokumentiert. Schauen wir uns also etwas anderes an.

Pghero

Pghero kann Ihnen möglicherweise behilflich sein, wenn Sie eine automatisierte Beratung wünschen.

Das heißt, es hat einige Mängel.

  1. Es funktioniert nur auf WHEREund ORDER BYnein JOINS.
  2. Es werden nur Statistiken zu Prozent NULL und eindeutigen Werten verwendet.

Weitere Informationen finden Sie in diesem Video .

Evan Carroll
quelle