Skip to Main Content

Japanese

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

Interested in getting your voice heard by members of the Developer Marketing team at Oracle? Check out this post for AppDev or this post for AI focus group information.

実行計画の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
This post has been answered by hatahata on Jun 29 2011
Jump to Answer
Comments
Locked Post
New comments cannot be posted to this locked post.
Post Details
Locked on Aug 17 2011
Added on Jun 15 2011
14 comments
9,053 views