それぞれ6100万レコードを超える2つのテーブルを処理するクエリがあります。数百万行のクエリ処理のパフォーマンスチューニング
- WB_YH_BCUPDATE_FULL_BASE:テーブル含む顧客や、彼らがアクティブになっていたすべての月。 (2014年から今まで)
CUSTOMERNUMBER | CAR MONTH
99999 | 201401
99999 | 201402
99999 | 201403
....
- WB_YH_BCUPDATE_MATCH_MONTH:テーブル含む顧客とCAR_MONTH + 6ヶ月を含む架空の余分なフィールド+でアクティブであったすべての月。
CUSTOMERNUMBER | CAR_MONTH | MATCH_MONTH_6
99999 | | 201401 | 201407
99999 | 201402 | 201408
99999 | 201403 | 201409
...
今私は6ヶ月後(=彼らはテーブルに表示されます)、彼らはまだアクティブであった場合はすべての顧客とそれに対応するCAR_MONTHSのすべてをチェックしたいです。このために、作成したフィールドをMATCH_MONTH_6にする必要があります。
私は次のクエリを使用しています:
select distinct a.CUSTOMERNUMBER
, a.CAR_MONTH
, b.MATCH_MONTH_6
, CASE WHEN b.CUSTOMERNUMBER is null then 0
ELSE 1
END FL_MATCH_6
from WB_YH_BCUPDATE_FULL_BASE a left join WB_YH_BCUPDATE_MATCH_MONTH b
on a.CUSTOMERNUMBER = b.CUSTOMERNUMBER
and a.CAR_MONTH = b.CAR_MONTH
and b.MATCH_MONTH_6 in (
select CAR_MONTH
from WB_YH_BCUPDATE_FULL_BASE
where customernumber = a.customernumber
);
次実行計画から見ることができるように私のクエリのパフォーマンスが本当に悪い:
Plan Hash Value : 3376431373
-----------------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost | Time |
-----------------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 25897713 | 673340538 | 371846479 | 02:56:04 |
| 1 | HASH UNIQUE | | 25897713 | 673340538 | 371846479 | 02:56:04 |
| 2 | NESTED LOOPS OUTER | | 61874441 | 1608735466 | 371674345 | 02:55:59 |
| 3 | TABLE ACCESS STORAGE FULL | WB_YH_BCUPDATE_FULL_BASE | 61874441 | 742493292 | 3225 | 00:00:01 |
| 4 | VIEW | | 1 | 14 | 6 | 00:00:01 |
| 5 | NESTED LOOPS | | 1 | 31 | 6 | 00:00:01 |
| 6 | NESTED LOOPS | | 24 | 31 | 6 | 00:00:01 |
| * 7 | TABLE ACCESS BY INDEX ROWID | WB_YH_BCUPDATE_MATCH_MONTH | 1 | 19 | 3 | 00:00:01 |
| * 8 | INDEX RANGE SCAN | WB_YH_BCUPDATE_MATCH_MONTH_IND | 24 | | 2 | 00:00:01 |
| * 9 | INDEX RANGE SCAN | WB_YH_BCUPDATE_FULL_BASE_IND | 24 | | 2 | 00:00:01 |
| * 10 | TABLE ACCESS BY INDEX ROWID | WB_YH_BCUPDATE_FULL_BASE | 1 | 12 | 3 | 00:00:01 |
-----------------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
------------------------------------------
* 7 - filter("A"."CAR_MONTH"="B"."CAR_MONTH")
* 8 - access("A"."CUSTOMERNUMBER"="B"."CUSTOMERNUMBER")
* 9 - access("CUSTOMERNUMBER"="A"."CUSTOMERNUMBER")
* 10 - filter("CAR_MONTH"=TO_NUMBER("B"."MATCH_MONTH_6"))
は君たちがどんな考えを持っていますかどのように私はこのクエリを最適化することができますか、または私はどのようにこのクエリをより効率的に書き換えることができますか?
敬具、
テーブルにインデックスが必要です。 'join '条件は開始するのに適しています。 –
したがって、 'WB_YH_BCUPDATE_MATCH_MONTH'には' WB_YH_BCUPDATE_FULL_BASE'と同じデータが含まれますが、追加の列が1つありますか? – SQB
フィールドCUSTOMERNUMBERの両方のテーブルにインデックスがあります。そして@SQB;それは正しいですが、私は2つのテーブルにデータを複製せずに別の方法で結果を得ることはできませんでした。 – wbaeckelmans