Ich habe eine Tabelle mit einem mehrspaltigen Index, und ich habe Zweifel an der richtigen Sortierung der Indizes, um die maximale Leistung bei den Abfragen zu erzielen.
Das Szenario:
PostgreSQL 8.4, Tabelle mit ungefähr einer Million Zeilen
Werte in Spalte c1 können ungefähr 100 verschiedene Werte haben . Wir können davon ausgehen, dass die Werte gleichmäßig verteilt sind, sodass wir für jeden möglichen Wert ungefähr 10000 Zeilen haben.
Spalte c2 kann 1000 verschiedene Werte haben . Wir haben 1000 Zeilen für jeden möglichen Wert.
Bei der Suche nach Daten enthält die Bedingung immer Werte für diese beiden Spalten, sodass die Tabelle einen mehrspaltigen Index enthält, der c1 und c2 kombiniert. Ich habe darüber gelesen, wie wichtig es ist , die Spalten in einem mehrspaltigen Index richtig anzuordnen, wenn Sie bei Abfragen nur eine Spalte zum Filtern verwenden. Dies ist in unserem Szenario nicht der Fall.
Meine Frage ist diese:
Könnte ich angesichts der Tatsache, dass einer der Filter einen viel kleineren Datensatz auswählt, die Leistung verbessern, wenn der erste Index der selektivste ist (derjenige, der einen kleineren Datensatz zulässt)? Ich hatte diese Frage erst in Betracht gezogen, als ich die Grafiken aus dem Artikel sah, auf den verwiesen wurde:
Bild aus dem referenzierten Artikel über mehrspaltige Indizes .
Die Abfragen verwenden Werte aus den beiden Spalten zum Filtern. Ich habe keine Fragen mit nur einer Spalte zum Filtern. Alle von ihnen sind: WHERE c1=@ParameterA AND c2=@ParameterB
. Es gibt auch Bedingungen wie diese:WHERE c1 = "abc" AND c2 LIKE "ab%"
quelle
Wenn, wie Sie sagen, die Abfragen, die diese beiden Spalten betreffen, alle Gleichheitsprüfungen beider Spalten sind, z.
kümmere dich nicht darum. Ich bezweifle, dass es einen Unterschied geben wird, und wenn es einen gibt, wird er vernachlässigbar sein. Sie können natürlich jederzeit mit Ihren Daten und Ihren Servereinstellungen testen. Unterschiedliche Versionen eines DBMS können sich hinsichtlich der Optimierung leicht unterschiedlich verhalten.
Die Reihenfolge innerhalb des Indexes ist für andere Arten von Abfragen von Bedeutung, bei denen nur eine Spalte überprüft wird oder Ungleichheitsbedingungen oder Bedingungen für eine Spalte und die Gruppierung in der anderen usw.
Wenn ich einen der beiden Befehle wählen würde, würde ich die weniger selektive Spalte an die erste Stelle setzen. Betrachten Sie eine Tabelle mit Spalten
year
undmonth
. Es ist wahrscheinlicher, dass Sie eineWHERE year = 2000
Bedingung oder eineWHERE year BETWEEN 2000 AND 2013
oder eine benötigenWHERE (year, month) BETWEEN (1999, 6) AND (2000, 5)
.Eine Abfrage des Typs
WHERE month = 7 GROUP BY year
kann sicher gewünscht sein (Find people born on July), wäre aber seltener. Das hängt natürlich von den tatsächlich in Ihrer Tabelle gespeicherten Daten ab. Wählen Sie vorerst eine Bestellung aus, sagen Sie die(c1, c2)
und Sie können später jederzeit einen weiteren Index hinzufügen(c2, c1)
.Update nach dem Kommentar des OP:
Bei dieser Art der Abfrage handelt es sich genau um eine Bereichsbedingung für die
c2
Spalte, für die ein(c1, c2)
Index erforderlich wäre . Wenn Sie auch Anfragen vom umgekehrten Typ haben:dann wäre es gut, wenn du auch einen
(c2, c1)
index hättest .quelle