Ich versuche immer, die Ausdrücke in JOIN
einzufügen in der folgenden Reihenfolge:
joined.column = leading.column
Diese Abfrage:
SELECT t.value, d.name
FROM transactions t
JOIN
dimensions d
ON d.id = t.dimension
kann entweder wie "für jede Transaktion den entsprechenden Dimensionsnamen suchen" oder "für jede Dimension alle entsprechenden Transaktionswerte finden" behandelt werden.
Wenn ich also nach einer bestimmten Transaktion suche, gebe ich die Ausdrücke in der folgenden Reihenfolge ein:
SELECT t.value, d.name
FROM transactions t
JOIN
dimensions d
ON d.id = t.dimension
WHERE t.id = :myid
, und wenn ich nach einer Dimension suche, dann:
SELECT t.value, d.name
FROM dimensions d
JOIN
transactions t
ON t.dimension = d.id
WHERE d.id = :otherid
Die frühere Abfrage wird höchstwahrscheinlich zuerst Index-Scans auf (t.id)
verwenden , dann auf (d.id
), während letzteres Index-Scans zuerst auf (d.id)
verwendet , dann auf (t.dimension)
, und Sie können es leicht in der Abfrage selbst sehen:Die durchsuchten Felder sind auf der linken Seite.
Die Driving- und Driven-Tabellen sind in einem JOIN
möglicherweise nicht so offensichtlich , aber es ist so klar wie eine Glocke für ein CONNECT BY
Abfrage:der PRIOR
Zeile steuert, die Nicht-PRIOR
gefahren wird.
Deshalb diese Abfrage:
SELECT *
FROM hierarchy
START WITH
id = :root
CONNECT BY
parent = PRIOR id
bedeutet "alle Zeilen finden, deren parent
ist eine gegebene id
". Diese Abfrage baut eine Hierarchie auf.
Dies kann wie folgt behandelt werden:
connect_by(row) {
add_to_rowset(row);
/* parent = PRIOR id */
/* PRIOR id is an rvalue */
index_on_parent.searchKey = row->id;
foreach child_row in index_on_parent.search {
connect_by(child_row);
}
}
Und diese Abfrage:
SELECT *
FROM hierarchy
START WITH
id = :leaf
CONNECT BY
id = PRIOR parent
bedeutet "Finde die Zeilen, deren id
ist ein gegebener parent
". Diese Abfrage baut eine Ahnenkette auf.
Immer PRIOR
eingeben im rechten Teil des Ausdrucks.
Denken Sie an PRIOR column
ab sofort werden alle Ihre Zeilen durchsucht.