Ich habe eine Abfrage, die eine lange Zeit zur Ausführung dauert. Ich habe ungefähr 10 Minuten gewartet und es ist immer noch nicht fertig ausgeführt.Beschleunigen einer Abfrage mit INNER JOIN
Die Abfrage sieht wie folgt aus:
SELECT
one.ID,
two.NAME,
two.STATUS,
four.KEY,
four.VALUE,
count(one.ID) as num
FROM TABLE_ONE one, TABLE_TWO two, TABLE_THREE three, TABLE_FOUR four
WHERE one.STATE='RED'
AND (two.STATUS='ON' OR two.STATUS='OFF')
AND (
four.KEY='FINAL'
OR four.KEY='LIMIT'
OR (
four.KEY='MODE'
AND (
four.VALUE='T'
OR four.VALUE='R')))
GROUP BY one.ID, two.NAME, two.STATUS, four.KEY, four.VALUE
ORDER BY group_name ASC;
Ich habe noch eine Abfrage, die äquivalent ist aber führt sehr schnell (etwa 1 Sekunde auszuführen). Hier
ist diese Abfrage:
SELECT
one.ID,
two.NAME,
two.STATUS,
four.KEY,
four.VALUE,
count(one.ID) as num
FROM TABLE_ONE one
INNER JOIN TABLE_TWO two
ON one.ID=two.ID
INNER JOIN TABLE_THREE three
ON two.ID=three.GROUP_ID
INNER JOIN TABLE_FOUR four
ON three.ID=four.ID
WHERE one.STATE='RED'
AND (two.STATUS='ON' OR two.STATUS='OFF')
AND (
four.KEY='FINAL'
OR four.KEY='LIMIT'
OR (
four.KEY='MODE'
AND (
four.VALUE='T'
OR four.VALUE='R')))
GROUP BY one.ID, two.NAME, two.STATUS, four.KEY, four.VALUE
ORDER BY group_name ASC;
Ich bin ein bisschen verwirrt, warum die Abfrage mit INNER JOIN
wirklich schnell ausführt (ca. 1 Sekunde) und die man ohne eine lange Zeit in Anspruch nimmt (warteten ca. 10 Minuten und noch nicht fertig ausgeführt).
Gibt es irgendetwas, was ich mit der Abfrage ohne INNER JOIN
tun kann, um die Ausführungszeit zu beschleunigen?
Ich verwende ORACLE.
Sie sollten sich den Ausführungsplan ansehen (oder "Plan erklären"). Meine Vermutung ist, dass die 'Inner Join'-Version Indizes verwendet, um die Leistung zu erhöhen, während die Version mit den Join-Kriterien zusammen mit Filterkriterien aus irgendeinem Grund keine Indizes verwendet. Oder ein anderer Unterschied, der offensichtlich sein sollte, wenn Sie den Ausführungsplan betrachten. – SlimsGhost