DB 37

Oracle 분석 함수 주의점

1. Window를 지정하지 않으면 데이터가 틀어진다. 아래 SQL을 통해 확인select ename, deptno, sal, sum(sal) over (partition by deptno) "부서별급여합계", sum(sal) over (partition by deptno order by sal) "부서별 급여오름차순누적", sum(sal) over (partition by deptno order by sal rows unbounded preceding) "부서별 급여오름차순누적", sum(sal) over (order by deptno, sal) "부서별 급여오름차순 누적", sum(sal) over (order by deptno, sal rows unbounded preceding) "부서별 급여오름..

DB 2012.07.17

Parallel Distribution 이 잘 안되는 경우에 이렇게 하기... CASE 별로 내부 힌트 확인~

상황: 테이블 크기 A >> B A = B(+) GROUP BY A B가 훨씬 작기 때문에 broadcast 해야 효율적인데 outer join 관계라 driving(outer) table이 될수 없는데... 결론부터 말하면, 1. LEADING 이나 USE_HASH 등의 테이블 지정 순서는 원래 규칙대로 한다. (outer join 이라 driving 이 될 수 없는 규칙 그대로) 2. PQ_DISTRIBUTE 에도 1번 규칙대로 inner table을 B로 하되, inner 쪽 규칙을 broadcast 로 한다. 3. swap_join_inputs 를 B로 지정하여, driving(outer) table 순서만 바꿔준다. CASE 1) OK /*+ leading(A) use_hash(B) full(..

DB 2011.12.08

Oracle Parallel SQL Tuning 정리

1. 관련 파라미터 확인 (특히 Max DOP(degree of parallelism)) For a single instance, DOP = PARALLEL_THREADS_PER_CPU x CPU_COUNT For an Oracle RAC configuration, DOP = PARALLEL_THREADS_PER_CPU x CPU_COUNT x INSTANCE_COUNT Oracle RAC 환경의 경우, Oracle RAC services를 사용해서 특별히 node 개수를 한정하지 않는한 위의 공식이 적용된다고 한다. * 자동 여부 PARALLEL_DEGREE_POLICY : manual, auto, limited 확인 PARALLEL_MIN_TIME_THRESHOLD : plan 상 예측시간 이상시 p..

DB 2011.12.08

dc_sequences

RAC 환경에서 sequence 관련 장애가 있어 분석중에 찾은 내용 (don't forget!) sequence cache의 크기를 늘리고, ORDER 보다 NOORDER 로 하는 것이 경합을 줄일 수 있다. (NOCACHE 금지) Generally, sequences can be cached with cache values as high as 200 in RAC. This is much higher than for a regular Oracle instance. If there is insufficient caching, contention can result and will show up as an increase in service times. If there are performance prob..

DB 2011.10.26

VIEW@DBLINK 와 조인할 때 JOIN 순서 조절은?

JOIN 자체를 외부 DB에서 수행하려면, /*+ DRIVING_SITE(EXT_TABLE) */ 을 사용한다. -> 보통 외부 DB의 TABLE이 큰 경우, 작은 내부 DB DATA 를 그쪽으로 보낸후 JOIN 이후의 결과를 받는 방식 LEADING 등의 힌트가 안 먹을때는? 그냥 테이블, 뷰 순서 바꾸고 ORDERED 힌트 적용하면 먹힘 -> Query Transformation 등으로 인해 Query Block 이 바뀔수 있어 명시적으로 이름을 지정하는 LEADING 힌트가 안먹을 때가 있는 것 같다. 10053 Trace 확인하면 정확한 BLOCK 명이 나오려나?

DB 2011.10.03

PUSH_SUBQ ?

SELECT * FROM A, (SELECT * FROM B, C WHERE B.ID = C.ID) E WHERE A.ID = E.ID A가 건수가 작은 상황인데 PLAN 이 잘못 풀려 INLINE VIEW 인 E 내부가 먼저 수행되어 DRIVING TABLE이 되어 지연된다고 하면, SELECT /*+ PUSH_SUBQ */ * FROM A, (SELECT * FROM B, C WHERE B.ID = C.ID) E WHERE A.ID = E.ID 위와 같이 사용하여 바깥의 WHERE 절을 E 안쪽의 조건으로 PUSH 하면 빠른 결과를 얻을 수 있다. 근데 이건 inline view 아닌가? 어찌 subquery 힌트를 먹는거지?

DB 2011.10.03