Was bedeutet es, mehrere sortkey Spalten?
Rotverschiebung ermöglicht die Ausweisung mehrere Spalten als SORTKEY
Spalten, aber die meisten der best-practices-Dokumentation geschrieben ist, als gäbe es nur eine einzige SORTKEY.
Wenn ich eine Tabelle erstellen mit SORTKEY (COL1, COL2)
werden, bedeutet das, dass alle Spalten gespeichert sind, sortiert nach dem SP1, dann SP2? Oder vielleicht, da es eine säulenartige store, jede Spalte wird gespeichert in einer anderen Reihenfolge? I. e. In COL1 COL1 um, COL2 in COL2 um, und die anderen Spalten ungeordnet?
Meine situation ist, dass ich eine Tabelle mit (unter anderem) ein type_id und eine timestamp-Spalte. Daten kommt in etwa in chronologischer Reihenfolge. Die meisten Abfragen verbunden sind, gegen /eingeschränkt durch beide type_id und timestamp. In der Regel die type_id Klauseln spezifischer sind, also ein viel größerer Prozentsatz von Zeilen können ausgeschlossen werden, indem man die type_id Klausel als durch den Blick auf die timestamp-Klausel. type_id ist die DISTKEY aus diesem Grund. Ich versuche zu verstehen, die vor-und Nachteile von SORTKEY (type_id)
, SORTKEY (stamp)
, SORTKEY (type_id,stamp)
, SORTKEY (stamp,type_id)
.
Dank.
- Wenn Sie möchten, dass Ihre Ergebnisse sortiert von mehr als einer Spalte (ORRDER VON 1.2.3...), Sortieren Sie Ihre Daten entsprechend.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie erklären
SORTKEY(COL1, COL2)
alle Spalten sortiert werden, indemCOL1
, dannCOL2
als wennORDER BY (COL1, COL2)
gemacht wurde.Wenn Sie
SORTKEY
zu beschleunigen, ist eine VERKNÜPFUNG, AFAIU ist es egal, so lange wie Sie die gleichenSORTKEY
auf die Tabellen, die verbunden werden soll, was da passiert, ist ein merge-join.Wenn
COL1
hoch selektiv wie Ihretype_id
es bedeutet, es gibt nur eine kleine Anzahl von Zeilen, welche die gleichetype_id
. Daher, obwohl Sie können eine weitere Spalte hinzufügen SORTKEY, Ihr nutzen ist begrenzt, da die meisten der Zeile Beseitigung bereits geschehen ist.Wenn
COL1
ist nicht sehr selektiv, wie Ihrestamp
(das ist ein bisschen komisch, btw; ich hätte erwartet, dass es selektiver ist alstype_id
? Anyways..), es bedeutet, dass eine Filterung mitstamp
nicht beseitigen, dass viel Zeilen. Es macht also mehr Sinn, zu erklären, eine zweite Art Schlüssel. Dies ist jedoch weniger effizient als die andere Weise herum, wie die Beseitigung Zeilen früher wäre billiger. Wenn Sie manchmal-filter vonstamp
aber nicht durchtype_id
kann es sinnvoll dies zu tun wenn.Sind wir auch mit Rotverschiebung und wir haben über 2 Milliarden Datensätze (+20 Millionen jeden Tag), und ich muss sagen, die weniger selektiv die sort_key ist, desto mehr Vorsprung sollte es in der sort_key Liste.
In unserem Fall (und bitte beachten, zu analysieren, wie Sie/Abfrage, eigene Daten), die wir verwendet Zeitstempel als ersten sort_key. Das problem mit diesem ist, dass es auch innerhalb von 1 Sekunde, die wir aufnehmen über 200 Zeilen, welche Ergebnisse unsere 1MB-Blöcke enthalten nur ein paar Sekunden, und jede Art von Daten in die einzelnen Blocks. Bedeutung, obwohl timestamp ist hoch selektiv, nachdem wir nicht wirklich filtern weiter, wir haben alle Arten von Daten in jedem block.
Kürzlich haben wir die umgekehrte Reihenfolge der sort_keys. Der erste hat über 15 verschiedene Werte, die zweite hat über 30, etc... und der Zeitstempel der letzten jetzt, aber immer noch, ein block ist noch in Sekunden gemessen.
Diese Ergebnisse, (seit wir die ersten zwei sort_keys als Filter sehr Häufig) die folgenden:
Alte Lösung: Ein Jahr der Daten, wählen Sie einen Monat, lässt es 91% der Blöcke, aber nachdem es Sie alle zu öffnen, auch wenn wir wollen-filter weiter.
Die neue Lösung fällt ungefähr 14/15 der Blöcke in dem ersten Schritt, unabhängig von dem Datum, dann etwa 95% der verbliebenen und timestamp noch Tropfen 91% der verbliebenen.
Wir haben es getestet und gründlich mit zwei 800 Millionen Datensätze von Tabellen, die waren die gleichen, außer die Reihenfolge der Sortierschlüssel. Je höher der Zeit-Zeit in der 'where' - Klausel war, desto bessere Ergebnisse haben wir bekommen. Es wurde noch deutlicher im Falle von joins offensichtlich.
Also mein Vorschlag ist, kennen Ihre Datenbank und welche Art von Abfragen, die Häufig ausgeführt werden, da die meisten selektiven Spalte möglicherweise nicht die beste erste sort_key. Genau wie Enno Shioji gesagt, es hängt alles davon ab, was Sie filtern.
Ich werde sagen, dass die Bestellung für
sort_key
solltedie Allgemeine Regel: niedriger Kardinalität die erste Stelle setzen, wenn gleiche Ebene.