私は、クエリオプティマイザ使用されているクエリがあります:私を驚か何なぜOracleオプティマイザはJOINとWHEREによって異なる方法で結合を処理しますか?
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
は、オプティマイザは、40%以上の高速化を次のように返されたということでした。ここで
SELECT /*+ 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
は両方のための実行計画されています:
はどうということは可能ですか?私はいつもhereから
2番目のステートメントには、最初にはないオプティマイザヒント「NO_CPU_COSTING」があります。 2つが異なって最適化されていることは驚くべきことではありません。 –
それを私にもっと詳しく説明できますか? no_cpu_costingは何をしますか? – kyooryu
。 。あなたは、OracleのドキュメントでそれをGoogleに検索して調べることができます。重要な点は、オプティマイザのヒントが質問の根源となるクエリの最適化に影響することです。あなたは両方の計画を同じヒントを使って見る必要があります。 –