実行計画のbuffer sortについて
868951Jun 15 2011 — edited Jul 20 2011以下のクエリの実行計画について、buffer sort(id=6)のcostが膨大で
結果が返ってきません。
ネットでBUFFER SORTを調べても詳しい情報が見つかりませんでした。
なぜこんな実行計画になってしまうのかわかりません。
ちなみにこのカウントの結果は5000件程度です。
---------------
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0
■CUST.CUST_NOはPK
■テーブルのデータ件数
CUST_TABLE 20万件
WORK_TABLE 60万件
INFO_TABLE 50万件
TASK_TABLE 100件
■AGE列は本来数値型であるべきが
VARCHAR2で宣言されているため、TO_NUMBERを使用して、BETWEENにとおしている
---------------
以下、対象のsqlと実行計画↓
SELECT COUNT(*)
FROM
INFO_TABLE INFO,
CUST_TABLE CUST,
WORK_TABLE WORK
WHERE
-- 結合条件 --
CUST.CUST_NO = WORK.CUST_NO AND
CUST.TEL= INFO.TEL AND
-- 結合条件終わり --
WORK.WORK_CODE IN ( SELECT WORK_CODE FROM TASK_TABLE) AND
WORK.WORK_TIME NOT LIKE '99999999%' AND -- YYYYMMDD
TO_NUMBER(INFO.AGE) BETWEEN 0 AND 39
-----------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 63 | 9925 (1)| 00:02:00 |
| 1 | SORT AGGREGATE | | 1 | 63 | | |
|* 2 | HASH JOIN | | 1 | 63 | 9925 (1)| 00:02:00 |
| 3 | NESTED LOOPS | | 160 | 6400 | 2095 (1)| 00:00:26 |
| 4 | MERGE JOIN CARTESIAN | | 160 | 2880 | 1775 (1)| 00:00:22 |
|* 5 | TABLE ACCESS FULL | INFO_TABLE | 1374 | 19236 | 1472 (1)| 00:00:18 |
| 6 | BUFFER SORT | | 160 | 640 | 18E(100)| |
| 7 | SORT UNIQUE | | 160 | 640 | 0 (0)| 00:00:01 |
| 8 | INDEX FAST FULL SCAN | PK_TASK_TABLE | 160 | 640 | 0 (0)| 00:00:01 |
| 9 | TABLE ACCESS BY INDEX ROWID| CUST_TABLE | 1 | 22 | 2 (0)| 00:00:01 |
|* 10 | INDEX UNIQUE SCAN | UK_CUST_KEY | 1 | | 1 (0)| 00:00:01 |
|* 11 | TABLE ACCESS FULL | WORK_TABLE | 238K| 5355K| 7829 (1)| 00:01:34 |
-----------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("CUST"."CUST_NO"="WORK"."CUST_NO" AND "WORK"."WORK_CODE"="WORK_CODE")
5 - filter(TO_NUMBER("INFO"."AGE")>=0 AND TO_NUMBER("INFO"."AGE")<=39)
10 - access("CUST"."TEL"="INFO"."TEL")
11 - filter("WORK"."WORK_CODE" IS NOT NULL AND "WORK"."WORK_TIME" NOT LIKE
'99999999%')
Edited by: user13489399 on 2011/06/14 22:16