실험 A조 여러분! 어제 잠시 스터디에서 얘기했던 내용에 11g의 Nested Loop Join에 대한 정리가 되어있네요..
2011.06.08 01:05
지난 주 자료를 작성하면서.. Plan이 조금 이상하게 나온다고 생각이 되었는데..
불행히도 불참을 하게되어 ㅜㅜ 죄송한 맘을 어찌할 바를 모르겠지만..
어제 모임에서 다행인지 불행인지 누군가에 의해서 질문이 다시 올라와서 몇자 적어봅니다.
예제에 있던 SQL입니다.
select /*+ leading(d) use_nl(e) index(e yhn_emp_idx) */
count(e.empno), count(d.dname)
from yhn_emp e, dept d
where d.deptno = e.deptno
and e.sal <= 2900;
-- 11g
---------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 52 | 3236 (1)| 00:00:23 |
| 1 | SORT AGGREGATE | | 1 | 52 | | |
| 2 | NESTED LOOPS | | | | | |
| 3 | NESTED LOOPS | | 1 | 52 | 3236 (1)| 00:00:23 |
| 4 | TABLE ACCESS FULL | DEPT | 4 | 52 | 4 (0)| 00:00:01 |
|* 5 | INDEX RANGE SCAN | YHN_EMP_IDX | 10063 | | 26 (0)| 00:00:01 |
|* 6 | TABLE ACCESS BY INDEX ROWID| YHN_EMP | 1 | 39 | 808 (1)| 00:00:06 |
---------------------------------------------------------------------------------------------
Outline Data
-------------
/*+
BEGIN_OUTLINE_DATA
NLJ_BATCHING(@"SEL$1" "E"@"SEL$1")
USE_NL(@"SEL$1" "E"@"SEL$1")
LEADING(@"SEL$1" "D"@"SEL$1" "E"@"SEL$1")
INDEX(@"SEL$1" "E"@"SEL$1" ("YHN_EMP"."SAL"))
FULL(@"SEL$1" "D"@"SEL$1")
OUTLINE_LEAF(@"SEL$1")
ALL_ROWS
DB_VERSION('11.2.0.1')
OPTIMIZER_FEATURES_ENABLE('11.2.0.1')
IGNORE_OPTIM_EMBEDDED_HINTS
END_OUTLINE_DATA
*/
Why? NL 조인이 두번 나오게 되는가...?
-- 10g
--------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 52 | 3236 (1)| 00:00:23 |
| 1 | SORT AGGREGATE | | 1 | 52 | | |
|* 2 | TABLE ACCESS BY INDEX ROWID| YHN_EMP | 1 | 39 | 808 (1)| 00:00:06 |
| 3 | NESTED LOOPS | | 1 | 52 | 3236 (1)| 00:00:23 |
| 4 | TABLE ACCESS FULL | DEPT | 4 | 52 | 4 (0)| 00:00:01 |
|* 5 | INDEX RANGE SCAN | YHN_EMP_IDX | 10063 | | 26 (0)| 00:00:01 |
--------------------------------------------------------------------------------------------
Outline Data
-------------
/*+
BEGIN_OUTLINE_DATA
NLJ_PREFETCH(@"SEL$1" "E"@"SEL$1")
USE_NL(@"SEL$1" "E"@"SEL$1")
LEADING(@"SEL$1" "D"@"SEL$1" "E"@"SEL$1")
INDEX(@"SEL$1" "E"@"SEL$1" ("YHN_EMP"."SAL"))
FULL(@"SEL$1" "D"@"SEL$1")
OUTLINE_LEAF(@"SEL$1")
ALL_ROWS
DB_VERSION('11.2.0.1')
OPTIMIZER_FEATURES_ENABLE('10.2.0.4')
IGNORE_OPTIM_EMBEDDED_HINTS
END_OUTLINE_DATA
*/
-- 9i
----------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost |
----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 52 | 46 |
| 1 | SORT AGGREGATE | | 1 | 52 | |
|* 2 | TABLE ACCESS BY INDEX ROWID| YHN_EMP | 102 | 3978 | 11 |
| 3 | NESTED LOOPS | | 408 | 21216 | 46 |
| 4 | TABLE ACCESS FULL | DEPT | 4 | 52 | 2 |
|* 5 | INDEX RANGE SCAN | YHN_EMP_IDX | 74 | | 1 |
----------------------------------------------------------------------------
Outline Data
-------------
/*+
BEGIN_OUTLINE_DATA
NLJ_PREFETCH(@"SEL$1" "E"@"SEL$1")
USE_NL(@"SEL$1" "E"@"SEL$1")
LEADING(@"SEL$1" "D"@"SEL$1" "E"@"SEL$1")
INDEX(@"SEL$1" "E"@"SEL$1" ("YHN_EMP"."SAL"))
FULL(@"SEL$1" "D"@"SEL$1")
OUTLINE_LEAF(@"SEL$1")
ALL_ROWS
DB_VERSION('11.2.0.1')
OPTIMIZER_FEATURES_ENABLE('9.2.0.8')
IGNORE_OPTIM_EMBEDDED_HINTS
END_OUTLINE_DATA
*/
차이는 NLJ_PREFETCH와 NLJ_BATCHING에 있었습니다.
사족을 좀 달아보고 싶지만.. 정리가 너무 잘되어 있는 자료를 알려드리는게 더욱 효과적이고
지금 1시가 다되어 저도 꿈나라로 가야할 듯 합니다.
이와 관련된 자료를 Link합니다.
http://scidb.tistory.com/entry/Nested-Loop-Join-성능향상과-관련된-2가지-원리
정말 슬픈 사실은... 위의 글중 아래의 오동규씨 내용은 예전에 읽었다는 것입니다..ㅜㅜ
머리가 나쁘다는 걸 예전부터 알고 있었지만.. 오늘 다시 한번 확인을 하니..
정말로 많이 슬프군요..
이 슬픔 조만간 누군가가.. 촉촉한 소맥으로 달래주지 않을까 싶네요.. ㅜㅜ
번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|
4 | 문자열(CHAR과 VARCHAR에서 공백비교), CTAS 문에서 제약유지(mssql실험) | balto | 2012.03.23 | 42915 |
» | A조 여러분! 어제 잠시 스터디에서 얘기했던 내용에 11g의 Nested Loop Join에 대한 정리가 되어있네요.. [1] | 멋진넘 | 2011.06.08 | 34179 |
2 | MERGE 문에서 DELETE CLAUSE에서 참조열 | darkbeom | 2011.05.09 | 43394 |
1 | 빈로우가_선택되었을시에_대체방법 [2] | darkbeom | 2011.05.03 | 38274 |
좋은정보 감사합니다.. 이러한 이유가 있었군요! 큰형님의 햇빛으로 무럭무럭 자라나겠습니다 ㅎㅎ
저녁도 못드시고 피곤하실텐데 이러한 정보까지 대단하시네요. 열공하겠습니다.