--------------------------------------------------------------------- PARAMETER SERVER 1... SERVER 2... --------------------------------------------------------------------- db_cache_size = 25,165,824 | 2,097,152,000 db_file_multiblock_read_count = 16 | 128 shared_pool_size = 115,343,360 | 1,048,576,000 pga_aggregate_target = 25,165,824 | 524,288,000 sort_area_size = 524,288 | 20,971,520 --------------------------------------------------------------------- SQL> set autotrace traceonly SQL> select * from class 2 start with class_cd = 'A00000' 3 connect by prior class_cd = upper_class_cd ;
40907 rows selected.
Execution Plan ---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE 1 0 CONNECT BY (WITH FILTERING) 2 1 NESTED LOOPS 3 2 INDEX (UNIQUE SCAN) OF 'CLASS_PK' (UNIQUE) 4 2 TABLE ACCESS (BY USER ROWID) OF 'CLASS' 5 1 NESTED LOOPS 6 5 BUFFER (SORT) 7 6 CONNECT BY PUMP 8 5 TABLE ACCESS (BY INDEX ROWID) OF 'CLASS' 9 8 INDEX (RANGE SCAN) OF 'CLASS_IDX1' (NON-UNIQUE)
#################### SERVER 1... ################################### Statistics ---------------------------------------------------------- 0 recursive calls f0000> 80531 db block gets 51093 consistent gets f0000> 20479 physical reads 0 redo size 4183602 bytes sent via SQL*Net to client 30652 bytes received via SQL*Net from client 2729 SQL*Net roundtrips to/from client 10 sorts (memory) f0000> 3 sorts (disk) 40907 rows processed 응답속도 : 약 10 sec
#################### SERVER 2... ################################### Statistics ---------------------------------------------------------- 0 recursive calls 0 db block gets 51093 consistent gets 0 physical reads 0 redo size 4183602 bytes sent via SQL*Net to client 30652 bytes received via SQL*Net from client 2729 SQL*Net roundtrips to/from client 13 sorts (memory) 0 sorts (disk) 40907 rows processed 응답속도 : 약 1 sec ####################################################################
위 parameter를 가진 server1,2에서 위 query를 수행하였을 경우, 같은 plan의 다른 trace file 이다.
Question 1 > SERVER1에서 db block gets 과 physical reads 가 생기는 것은
오직 sorts(disk) 때문인지요? Question 2 > SERVER1에서 PGA_AGGREGATE_TARGET,SORT_AREA_SIZE를 약간 늘려주었더니
disk sort 3 -> 1 로 줄고, physical reads 도 줄었는데, db block gets은 오히려
증가하고, 속도도 오히려 느려졌습니다. 원인은? Question 3 > 일반 sort query에서는 이렇게까지 차이를 느끼지 못했는데
유독 start with,connect by 절을 사용할 경우 많은 차이를 느낍니다.
위 구문이 특별히 다른 sort와 다르게 풀리는 무엇이 있는지요? Question 4 > db cache size 가 작아서 memory sort 가 안되는 거라면 해당 query의
memory sort를 위해 필요한 cache size를 측정하는 방법이 있나요?
** server1, 2 모두 hit ratio등 tuning guide에 나와있는
모든 통계치의 권장값 이상으로 유지되고 있습니다.
** 현재는 server1의 설정값을 server2와 맞춰서 문제를 해결했지만,
정답을 알고 싶습니다. 덧붙여,
고수님들도 요즘 질문들이 약해서 심심하신것 같고해서 공부할겸 대화할겸 올렸습니다. ^^
|