1

内部結合する必要がある 2 つのテーブルがあり、一方のテーブルのレコード数はもう一方のテーブルに比べて比較的少なくなっています。小さなテーブルに文字列操作を適用する必要があります。私の質問は、結合後に文字列関数を適用できますか、それともサブクエリでそれらを適用してから、サブ選択を大きなテーブルに結合する必要がありますか?

例は次のようになります。

オプション1:

SELECT SUBSTR("SMALL_TABLE"."COL_NAME",x,y) "NEW_COL" FROM "BIG_TABLE"
JOIN "SMALL_TABLE" ON ...

オプション 2:

SELECT "NEW_COL"
FROM "BIG_TABLE"
JOIN 
(
SELECT SUBSTR("SMALL_TABLE"."COL_NAME",x,y) "NEW_COL" FROM "SMALL_TABLE"
) "T"
ON ...

パフォーマンス オプション 1 と 2 では、どちらが優れていますか? 私はオラクル11gを使用しています。

4

2 に答える 2

3

クエリの構造に関係なく、Oracle のオプティマイザは、結合の前後で関数を自由に評価できます。文字列操作がプロジェクション ステップの一部としてのみ行われると仮定すると (つまり、節でのみ行われ、SELECT節で述語として使用されない)、使用した場合、テーブルを結合する前にWHEREOracle が を適用すると予想されます。SUBSTRどちらの定式化も、関数をより少ない行に適用する必要があるためです (ただしSUBSTR、結合後に関数を適用する場合は、決定論的呼び出しとして処理し、結果をキャッシュすることができます)。

クエリ最適化の質問と同様に、最初のステップは常にクエリ プランを生成し、さまざまなクエリが実際にさまざまなプランを生成するかどうかを確認することです。計画は同一であり、したがって、パフォーマンスも同一であると予想されます。しかし、オプティマイザの統計や初期化パラメータなどを考慮して、2 つのオプションのいずれかがシステム上で異なる計画を生成する理由はいくつかあります。

于 2013-11-04T06:56:28.190 に答える
-1

結合を実行する前に操作を適用し、結合して最終結果を照会することをお勧めします。これは、クエリの最適化と呼ばれます。あなたの質問に対してそうすることで、「結合」するときに実行する操作が少なくなり、不要な行が事前に削除されます。
ここにたくさんの例があります: http://beginner-sql-tutorial.com/sql-query-tuning.htm
そしてこれは私が見つけることができる最高のものです: http://www.cse.iitb.ac.in/~sudarsha /db-book/slide-dir/ch14.ppt

于 2013-11-04T06:44:32.477 に答える