Hash-Join mit IN-Klausel und Unterabfrage in Spanner vermeiden

8

Ich habe das folgende Abfrageoptimierungsproblem in Spanner, und hoffe, dass es einen Trick gibt, den ich vermisse, der mir helfen wird, den Abfrageplaner zu meinem Willen zu biegen.

Hier ist das vereinfachte Schema:

%Vor%

Und eine Abfrage mit einer Unterabfrage in einer IN -Klausel:

%Vor%

Dies erzeugt einen 10-Elemente-Satz über einen Hash-Join von T0 gegen die Ausgabe der Unterabfrage:

%Vor%

Beachten Sie, dass die Unterabfrage zwar komplex ist, aber tatsächlich eine sehr kleine Menge erzeugt. Unglücklicherweise scannt es auch die Gesamtheit von T1, um sie dem Hash-Join zuzuführen, was sehr langsam ist.

Wenn ich jedoch die Ausgabe der Unterabfrage in T1 nehme und sie manuell in die IN -Klausel schiebe:

%Vor%

Es ist dramatisch schneller, vermutlich, weil es den Index von T0 nur einmal pro Eintrag trifft und keinen Hash-Join für den gesamten Inhalt verwendet:

%Vor%

Ich könnte einfach zwei Abfragen ausführen, und das ist mein bisher bester Plan. Aber ich hoffe, dass ich einen Weg finden kann, Spanner dazu zu bringen, zu entscheiden, dass es das ist, was es mit der Ausgabe der Unterabfrage im ersten Beispiel machen soll. Ich habe alles ausprobiert, was mir einfällt, aber das kann in SQL überhaupt nicht ausgedrückt werden.

Auch: Ich habe das noch nicht ganz bewiesen, aber in manchen Fällen befürchte ich, dass die Ausgabe der 10-Elemente-Unterabfrage auf einige tausend Elemente explodieren könnte (T1 wird mehr oder weniger ohne Grenzen wachsen, leicht zu Millionen). Ich habe manuell mit ein paar hundert Elementen in der aufgeplusterten IN -Klausel getestet und es scheint akzeptabel zu funktionieren, aber ich bin ein wenig besorgt, dass es außer Kontrolle geraten könnte.

Beachten Sie, dass ich auch einen Join für die Unterabfrage ausprobiert habe:

%Vor%

Aber es hat etwas wirklich Schreckliches im Abfrageplaner getan, das ich hier nicht einmal versuchen werde zu erklären.

    
Joel Webber 08.06.2017, 19:22
quelle

1 Antwort

1

Verwendet Ihre tatsächliche Unterabfrage in der IN -Klausel irgendwelche Variablen aus T0 ? Wenn nicht, was passiert, wenn Sie Ihre Join-Abfrage mit den neu geordneten Tabellen versuchen (und eine eindeutige Ergänzung für die Korrektheit, es sei denn, Sie wissen, dass die Werte verschieden sind)?

%Vor%     
Mike Curtiss 12.06.2017, 21:56
quelle

Tags und Links