database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 24096 게시물 읽기
No. 24096
select insert구문시 plan변경현상을 다시 질문드립니다.
작성자
현실긍정(ceylone)
작성일
2005-09-14 18:36
조회수
1,801

안녕하세요.

9/9일에 질문올렸는데 아무도 답글을 해주지 않으셔서 다시 질문 드립니다.

 

질문의 요지는 아래와 같습니다...

select 시에는 5~10초 정도에 결과가 보여지는 query가 있는데,

그 query 문위에 insert문을 넣으면 plan이 변경되면서 수행결과가 15분정도 소요된다는 것입니다.

이현상의 원인과 해결방법을 좀 알고 싶습니다.

(아시는 분들은 답글 좀 해주세요...ㅜ.ㅜ)

 

아래는 9/9 일날 올린 글을 조금 수정해서 다시 적어봤습니다.

=======================================================

현재 환경은 AIX5.2 , oracle9.2.0.5 이며 주기적으로 통계정보를 생성하고 있습니다.

 

특정select 을 수행했을 경우 그 결과가 5초안에 보여지지만..

그 특정select 문 위에 insert문을 넣어서 select/insert문장을 만들어 주면 plan이 완전히 달라져 버려서 수행시간이 15분 정도 소요됩니다.

참고로,

1.문제의 select문내의 table은 cascade option을 주고 full로 통계정보를 생성했으며,

2. select 건수는 2000건 전후 이며,

3. insert table에 제약조건이나 index는 없습니다.

 

제 생각으로는 select 해서 바로 insert해 버리기 때문에 plan에 영향이 없이 수초 않에 끝이나야

정상일것 같은데..

왜 이런현상이 발생하는 것인지요?

그리고 해결책에는 어떤것이 있을까요?

(query문을 올리려고 했으나.. 너무 길어서 오히려 못한결과를 보일것 같아서 생략했습니다.)

 

답변에 미리 감사드리며 글을 줄입니다.

그럼 수고하세요.

 

p.s 아시는 분은 답글좀 올려주세요. ㅜ.ㅜ

 

아래는 각각의 경우를 trace해본 결과 입니다.


********************************************************************************

*** 단순 select 구문

********************************************************************************

call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.06 0.07 0 0 0 0
Execute 1 0.00 0.00 0 0 0 0
Fetch 113 5.99 5.93 19479 96802 0 1671
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 115 6.05 6.01 19479 96802 0 1671

Misses in library cache during parse: 1
Optimizer goal: CHOOSE
Parsing user id: 5

Rows Row Source Operation
------- ---------------------------------------------------
1671 VIEW
1671 UNION-ALL
1218 HASH JOIN OUTER
1218 VIEW
1218 UNION-ALL
614 HASH JOIN OUTER
605 HASH JOIN
7 TABLE ACCESS BY INDEX ROWID PDW_LOG_WEEK_INFO
7 INDEX RANGE SCAN PDW_LOG_WEEK_INFO_N2 (object id 37694)
22884 TABLE ACCESS FULL PDW_ODS_PO_SUGG
431 VIEW
431 FILTER
480 SORT GROUP BY
578 TABLE ACCESS BY INDEX ROWID PDW_ODS_PO_INFO
1059 NESTED LOOPS
480 TABLE ACCESS BY INDEX ROWID PDW_ODS_PO_INFO
2766 INDEX RANGE SCAN PDW_ODS_PO_INFO_N8 (object id 41333)
578 INDEX RANGE SCAN PDW_ODS_PO_INFO_N3 (object id 38582)
604 HASH JOIN
677 TABLE ACCESS BY INDEX ROWID PDW_ODS_PO_INFO
2766 INDEX RANGE SCAN PDW_ODS_PO_INFO_N8 (object id 41333)
183195 VIEW
183195 SORT GROUP BY
245159 TABLE ACCESS FULL PDW_ODS_PO_INFO
1748 VIEW
1748 SORT GROUP BY
2414 HASH JOIN OUTER
2414 HASH JOIN OUTER
2414 HASH JOIN OUTER
2414 TABLE ACCESS BY INDEX ROWID PDW_ODS_SALES_ORDER
2448 INDEX RANGE SCAN PDW_ODS_SALES_ORDER_N4 (object id 41327)
177 VIEW
177 SORT GROUP BY
375 HASH JOIN
304 TABLE ACCESS BY INDEX ROWID PDW_ODS_SALES_ORDER
2352 INDEX RANGE SCAN PDW_ODS_SALES_ORDER_N4 (object id 41327)
117484 TABLE ACCESS FULL PDW_ODS_FWD_DETAIL
130 VIEW
130 SORT GROUP BY
260 HASH JOIN
304 TABLE ACCESS BY INDEX ROWID PDW_ODS_SALES_ORDER
2352 INDEX RANGE SCAN PDW_ODS_SALES_ORDER_N4 (object id 41327)
113441 TABLE ACCESS FULL PDW_ODS_TXN_SHIPPING
6716 VIEW
6716 SORT GROUP BY
8382 TABLE ACCESS BY INDEX ROWID PDW_LOG_ALLOC_ORDER_RESULTS
8389 NESTED LOOPS
6 VIEW
6 SORT GROUP BY
23838 INDEX FAST FULL SCAN PDW_LOG_ALLOC_ORDER_RESULTS_N5 (object id 40660)
8382 INDEX RANGE SCAN PDW_LOG_ALLOC_ORDER_RESULTS_N1 (object id 37831)
453 SORT GROUP BY
496 VIEW
496 UNION-ALL
245 SORT GROUP BY
304 HASH JOIN OUTER
304 HASH JOIN OUTER
304 HASH JOIN OUTER
304 TABLE ACCESS BY INDEX ROWID PDW_ODS_SALES_ORDER
2352 INDEX RANGE SCAN PDW_ODS_SALES_ORDER_N4 (object id 41327)
177 VIEW
177 SORT GROUP BY
375 HASH JOIN
304 TABLE ACCESS BY INDEX ROWID PDW_ODS_SALES_ORDER
2352 INDEX RANGE SCAN PDW_ODS_SALES_ORDER_N4 (object id 41327)
117484 TABLE ACCESS FULL PDW_ODS_FWD_DETAIL
130 VIEW
130 SORT GROUP BY
260 HASH JOIN
304 TABLE ACCESS BY INDEX ROWID PDW_ODS_SALES_ORDER
2352 INDEX RANGE SCAN PDW_ODS_SALES_ORDER_N4 (object id 41327)
113441 TABLE ACCESS FULL PDW_ODS_TXN_SHIPPING
6716 VIEW
6716 SORT GROUP BY
8382 TABLE ACCESS BY INDEX ROWID PDW_LOG_ALLOC_ORDER_RESULTS
8389 NESTED LOOPS
6 VIEW
6 SORT GROUP BY
23838 INDEX FAST FULL SCAN PDW_LOG_ALLOC_ORDER_RESULTS_N5 (object id 40660)
8382 INDEX RANGE SCAN PDW_LOG_ALLOC_ORDER_RESULTS_N1 (object id 37831)
251 SORT GROUP BY
251 TABLE ACCESS BY INDEX ROWID PDW_LOG_INF_COMM_SEND
1379 INDEX RANGE SCAN PDW_LOG_INF_COMM_SEND_N5 (object id 39762)

********************************************************************************

*** select / insert 구문

********************************************************************************
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.06 0.06 0 0 0 0
Execute 1 775.21 758.84 4975683 5405679 259 1671
Fetch 0 0.00 0.00 0 0 0 0
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 2 775.27 758.90 4975683 5405679 259 1671

Misses in library cache during parse: 1
Optimizer goal: CHOOSE
Parsing user id: 5

Rows Row Source Operation
------- ---------------------------------------------------
1671 VIEW
1671 UNION-ALL
1218 HASH JOIN OUTER
1218 VIEW
1218 UNION-ALL
614 NESTED LOOPS OUTER
605 HASH JOIN
7 TABLE ACCESS BY INDEX ROWID PDW_LOG_WEEK_INFO
7 INDEX RANGE SCAN PDW_LOG_WEEK_INFO_N2 (object id 37694)
22884 TABLE ACCESS FULL PDW_ODS_PO_SUGG
422 VIEW PUSHED PREDICATE
422 HASH JOIN
471 TABLE ACCESS BY INDEX ROWID PDW_ODS_PO_INFO
475 INDEX RANGE SCAN PDW_ODS_PO_INFO_N5 (object id 39782)
76732096 VIEW
76732096 SORT GROUP BY
102395916 TABLE ACCESS FULL PDW_ODS_PO_INFO
604 HASH JOIN
677 TABLE ACCESS BY INDEX ROWID PDW_ODS_PO_INFO
2766 INDEX RANGE SCAN PDW_ODS_PO_INFO_N8 (object id 41333)
183195 VIEW
183195 SORT GROUP BY
245159 TABLE ACCESS FULL PDW_ODS_PO_INFO
1748 VIEW
1748 SORT GROUP BY
2414 HASH JOIN OUTER
2414 HASH JOIN OUTER
2414 HASH JOIN OUTER
2414 TABLE ACCESS BY INDEX ROWID PDW_ODS_SALES_ORDER
2448 INDEX RANGE SCAN PDW_ODS_SALES_ORDER_N4 (object id 41327)
177 VIEW
177 SORT GROUP BY
375 HASH JOIN
304 TABLE ACCESS BY INDEX ROWID PDW_ODS_SALES_ORDER
2352 INDEX RANGE SCAN PDW_ODS_SALES_ORDER_N4 (object id 41327)
117484 TABLE ACCESS FULL PDW_ODS_FWD_DETAIL
130 VIEW
130 SORT GROUP BY
260 HASH JOIN
304 TABLE ACCESS BY INDEX ROWID PDW_ODS_SALES_ORDER
2352 INDEX RANGE SCAN PDW_ODS_SALES_ORDER_N4 (object id 41327)
113441 TABLE ACCESS FULL PDW_ODS_TXN_SHIPPING
6716 VIEW
6716 SORT GROUP BY
8382 TABLE ACCESS BY INDEX ROWID PDW_LOG_ALLOC_ORDER_RESULTS
8389 NESTED LOOPS
6 VIEW
6 SORT GROUP BY
23838 INDEX FAST FULL SCAN PDW_LOG_ALLOC_ORDER_RESULTS_N5 (object id 40660)
8382 INDEX RANGE SCAN PDW_LOG_ALLOC_ORDER_RESULTS_N1 (object id 37831)
453 SORT GROUP BY
496 VIEW
496 UNION-ALL
245 SORT GROUP BY
304 HASH JOIN OUTER
304 HASH JOIN OUTER
304 HASH JOIN OUTER
304 TABLE ACCESS BY INDEX ROWID PDW_ODS_SALES_ORDER
2352 INDEX RANGE SCAN PDW_ODS_SALES_ORDER_N4 (object id 41327)
177 VIEW
177 SORT GROUP BY
375 HASH JOIN
304 TABLE ACCESS BY INDEX ROWID PDW_ODS_SALES_ORDER
2352 INDEX RANGE SCAN PDW_ODS_SALES_ORDER_N4 (object id 41327)
117484 TABLE ACCESS FULL PDW_ODS_FWD_DETAIL
130 VIEW
130 SORT GROUP BY
260 HASH JOIN
304 TABLE ACCESS BY INDEX ROWID PDW_ODS_SALES_ORDER
2352 INDEX RANGE SCAN PDW_ODS_SALES_ORDER_N4 (object id 41327)
113441 TABLE ACCESS FULL PDW_ODS_TXN_SHIPPING
6716 VIEW
6716 SORT GROUP BY
8382 TABLE ACCESS BY INDEX ROWID PDW_LOG_ALLOC_ORDER_RESULTS
8389 NESTED LOOPS
6 VIEW
6 SORT GROUP BY
23838 INDEX FAST FULL SCAN PDW_LOG_ALLOC_ORDER_RESULTS_N5 (object id 40660)
8382 INDEX RANGE SCAN PDW_LOG_ALLOC_ORDER_RESULTS_N1 (object id 37831)
251 SORT GROUP BY
251 TABLE ACCESS BY INDEX ROWID PDW_LOG_INF_COMM_SEND
1379 INDEX RANGE SCAN PDW_LOG_INF_COMM_SEND_N5 (object id 39762)

********************************************************************************

이 글에 대한 댓글이 총 3건 있습니다.

저도 며칠 전에 질문글을 보았는데 딱히 생각나는 부분이 없군요.

트레이스를 보여주셨으니 뭔가 나올 수 있을 거 같은데..

넘 보기가 힘듭니다. 텍스트 파일로 다시 올려주시면 보기가 좋을 것

같습니다. ^^

m님이 2005-09-15 01:37에 작성한 댓글입니다. Edit

안녕하세요. 장석문 입니다.

 

동일 SQL이라 하더도 Rule-based optimizer 상황에서는 실행 계획이 고정되었지만 Cost-based optimizer 상황에서는 실행계획이 고정되지 않습니다. 

 

옵티마이저 모드를 Choose로 하셨지만 통계정보를 생성하셨기 때문에 기본적으로 옵티마이저 모드는 Cost-based로 보셔야 합니다.

 

그리고 예전에는 옵티마이져가 SQL문을 주어진 그대로 실행하였으나  최근 옵티마이져는 SQL을 Trasformation하여 수행하기 때문에 실행계획이 많이 변경될수 있습니다.

 

특히 단순 select 문과 DML에 포함된 select문간의 실행계획은 많이 다를수 있습니다. 

 

해결책이라고 말씀드리기는 어렵지만

SQL문을 의도한 플랜으로 실행하기 위해서

  . Hint문을 사용하여 의도한 플랜으로 유도

  . View(In-line)를 최소화 할수 있도록 SQL을 수정

    (SQL을 Trasformation의 오해 소지를 줄이기 위함)

 

지금 생각나는 것은 이정도네요. 도움이 되셨으면 합니다. 

 

즐거운 하루되세요.

장석문(math90)님이 2005-09-15 09:34에 작성한 댓글입니다.

네. 두분 답글 감사합니다.

 

sql문과 trace결과를 txt로 올려드리고 싶은데, 파일 올리는 기능이 없네요.. ^^;

(select..insert구문은 약 600라인 정도 됩니다.)

 

결론은..

옵티마이저는 select 구문과 같은 select가 포함된DML구문이 서로 다르게 실행계획이 풀린다는 말씀이네요..

 

일반적으로 긴select..insert구문을 짤때는 select를 먼저 완성해 놓고 insert를 추가하지 않나요? 이렇게 될때마다 plan이 바뀌게 되면 실컷 select구문 튜닝을 해 놓고도 도로 마이타불이 될 경우가 많이 발생할수 있다는 말씀이네요..

 

에고.. 득도의 길은 멀군요..

 

옵티마이저 바부. ㅡ.ㅡ;;

 

 

현실긍정(ceylone)님이 2005-09-15 15:41에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
24100저기...mview가 뭔가요? [1]
궁금이
2005-09-15
1632
24098new system에 oracle 탑재에 관한 질문 [3]
짱장군
2005-09-15
1030
24097장진주님 재질문 [2]
퓨쳐
2005-09-14
1478
24096select insert구문시 plan변경현상을 다시 질문드립니다. [3]
현실긍정
2005-09-14
1801
24094세션 트레이스 시 [1]
이은주
2005-09-14
1107
24092[질문]테이블 컬럼을 동적으로 가져오기 [2]
아더
2005-09-14
1697
24091[질문]리눅스용 오라클817 공공기관에서 학습용으로 사용해도 되나요? [1]
이창재
2005-09-14
881
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다