Ich habe eine Abfrage, auf das ich Abfrage-Optimierer verwendet:Warum behandelt Orakel-Optimierer Join durch JOIN und WHERE anders?
SELECT res.studentid,
res.examid,
r.percentcorrect,
MAX(attempt) AS attempt
FROM tbl res
JOIN (SELECT studentid,
examid,
MAX(percentcorrect) AS percentcorrect
FROM tbl
GROUP BY studentid, examid) r
ON r.studentid = res.studentid
AND r.examid = res.examid
AND r.percentcorrect = res.percentcorrect
GROUP BY res.studentid, res.examid, r.percentcorrect
ORDER BY res.examid
Was ich war überrascht, dass die optimiser folgend als mehr als 40% schneller zurückgegeben:
für beideSELECT /*+ NO_CPU_COSTING */ res.studentid,
res.examid,
r.percentcorrect,
MAX(attempt) AS attempt
FROM tbl res,
(SELECT studentid,
examid,
MAX(percentcorrect) AS percentcorrect
FROM tbl
GROUP BY studentid, examid) r
WHERE r.studentid = res.studentid
AND r.examid = res.examid
AND r.percentcorrect = res.percentcorrect
GROUP BY res.studentid, res.examid, r.percentcorrect
ORDER BY res.examid
Hier sind die Ausführungspläne :
Wie ist das möglich? Ich dachte immer, die optimiser Leckereien in der optimierten Abfrage genau wie der WHERE-Klausel JOIN ...
Ihre zweite Anweisung hat einen Optimiererhinweis 'NO_CPU_COSTING', den der erste nicht hat. Es ist nicht überraschend, dass die beiden unterschiedlich optimiert sind. –
Können Sie mir das näher erklären? Was macht no_cpu_costing? – kyooryu
. . Sie können das Google und in der Oracle-Dokumentation nachschlagen. Der wichtige Punkt ist, dass Optimizer-Hinweise die Optimierung der Abfrage beeinflussen, die die Wurzel Ihrer Frage ist. Sie müssen die Pläne beider mit den gleichen Hinweisen betrachten. –