Ik probeer altijd de uitdrukkingen in JOIN
te zetten is in de volgende volgorde:
joined.column = leading.column
Deze vraag:
SELECT t.value, d.name
FROM transactions t
JOIN
dimensions d
ON d.id = t.dimension
kan worden behandeld als "vind voor elke transactie de bijbehorende dimensienaam", of "vind voor elke dimensie alle bijbehorende transactiewaarden".
Dus als ik naar een bepaalde transactie zoek, plaats ik de uitdrukkingen in de volgende volgorde:
SELECT t.value, d.name
FROM transactions t
JOIN
dimensions d
ON d.id = t.dimension
WHERE t.id = :myid
, en als ik naar een dimensie zoek, dan:
SELECT t.value, d.name
FROM dimensions d
JOIN
transactions t
ON t.dimension = d.id
WHERE d.id = :otherid
De vorige zoekopdracht zal hoogstwaarschijnlijk eerst indexscans gebruiken op (t.id)
, dan op (d.id
), terwijl de laatste indexscans eerst zal gebruiken op (d.id)
, dan op (t.dimension)
, en je kunt het gemakkelijk zien in de zoekopdracht zelf:de gezochte velden staan links.
De drijvende en gereden tabellen zijn misschien niet zo duidelijk in een JOIN
, maar het is zo duidelijk als een bel voor een CONNECT BY
vraag:de PRIOR
rij rijdt, de niet-PRIOR
wordt gereden.
Daarom deze vraag:
SELECT *
FROM hierarchy
START WITH
id = :root
CONNECT BY
parent = PRIOR id
betekent "vind alle rijen waarvan de parent
is een gegeven id
". Deze zoekopdracht bouwt een hiërarchie op.
Dit kan als volgt worden behandeld:
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);
}
}
En deze vraag:
SELECT *
FROM hierarchy
START WITH
id = :leaf
CONNECT BY
id = PRIOR parent
betekent "vind de rijen waarvan id
is een gegeven parent
". Deze zoekopdracht bouwt een vooroudersketen op.
Zet altijd PRIOR
in het rechtergedeelte van de uitdrukking.
Denk aan PRIOR column
vanaf een constante worden al uw rijen doorzocht.