A と B というように、結合する 2 つのテーブルがあります。A は 10k レコードで小さく、B は数百万レコードです。結合は Aa = Bb にあります。a にも b にもインデックスはありません。小さいテーブルは変更できますが、大きいテーブルは変更できません。そして、結合のために Bb のデータ型を変換する必要があります。クエリの実行に時間がかかります。パフォーマンスを向上させる方法はありますか?
2 に答える
最高のパフォーマンスを得るための最も可能性の高い結合方法はハッシュ結合であるため、インデックスは使用されません。
変換する列は、小さいテーブルの結合列になりますが、それはおそらく必要な CPU サイクルが少ないためです。
小さい方のテーブルから作成されたハッシュ テーブルが PGA メモリに収まる限り、クエリには 2 つのテーブルのフル テーブル スキャンとほぼ同じ時間がかかります。クエリの実行中に v$sql_workarea_active をチェックして、テーブルと一時テーブルスペースにスピルするかどうか。
可能であれば、代わりに小さなテーブルで変換を行い、大きなテーブルにインデックスを追加することをお勧めします (変換によってインデックスが使用できなくなるため)。
なんらかの理由でこれを行うことができない場合、または大きなテーブルの大部分 (たとえば約 15% 以上) を返したい場合は、テーブル全体のスキャンが最も効率的なオプションです。詳細はこちら ( http://asktom.oracle.com/pls/apex/f?p=100:11:0::::p11_question_id:9422487749968 )。
上記の結果から、完全なテーブル スキャンが問題ない (または単に必要である) と結論付けた場合、そのためのハードウェアがあれば、クエリ内の並列ヒントが役立つ可能性があります。
select /*+ parallel(B,default) */ <columns here> ...
上記のコードで、B は並列ヒントを適用するテーブルのエイリアス (大きいテーブル) であり、デフォルトは使用するコアの数です。必要に応じて、代わりにここで数値を指定できます。
クエリの構文を見ないと、他に利点があるかどうかを判断できません。