このクエリでEXPLAIN PLAN
を実行しています:
SELECT DISTINCT l.item_num, l.repl_code
FROM item_w l
JOIN item i ON l.item_num = i.item_num
LEFT JOIN item_w r ON l.item_num = r.item_num AND l.repl_code = r.whse_code
WHERE r.whse_code IS NULL
AND l.repl_code IN (SELECT DISTINCT whse_code FROM item_w)
AND i.sa_item NOT LIKE 'Z%'
ORDER BY l.item_num, l.repl_code
クエリは希望どおりに機能しますが、計画では、データベースで見つけることができないVW_DTP_F6D0ECAD
、VW_DTP_53909802
、およびVW_DTP_69531A7E
という名前のオブジェクトを使用していることが示されています。
これらのオブジェクトとは何ですか?また、どのように作成されていますか?
実行プランに表示されるVW_DTPで始まるビューは、11.2以降に使用可能なコストベースのクエリ変換の1つであるdistinct placement
。
これは、あなたと同じように、DISTINCT
句を使用するステートメントで発生します。テーブルを結合して行をフィルタリングし、その後、個別の行を見つけることは、非常に明白な実行プランとして絶対に受け入れられます。ただし、テーブルへのアクセス時に個別の行を見つける、beforeそれらを結合する方が効果的である可能性があり、データベースは推定コストに基づいてクエリを変換することを選択できます。