목록oracle (56)
정미나닷컴
SELECT * FROM ORD E WHERE ORD_DT='20120112' AND BRANCH_CD='BR00000199';위와 같은 쿼리가 있을 때 ORD 테이블이 [ORD_DT+BRANCH_CD] 컬럼으로 이루어진 결합인덱스를 갖고 있다면 정말 Perfect 하겠지만 ORD_X01 > ORD_DT ORD_X02 > BRANCH_CD 이렇게 각각의 단일 인덱스만을 갖고 있다면 우리는 둘 중 어떤 인덱스를 타게 하는 것이 좋을지 고민하지 않을 수 없다. (물론 대부분의 경우 그냥 옵티마이저의 판단에 맡길테지만..) 이런 경우 Index Combine을 사용하면 고민할 필요 없이 두 개의 인덱스를 모두 사용할 수 있다.SELECT /*+ index_combine(e ord_x01 ord_x02) */ ..
2012년 1월에 팔린 상품의 일별 상품별 판매수량과 판매금액 및 각각의 랭킹을 구하고 일별, 월별 총계 구하기 * 결과값::: * 쿼리1SELECT CASE WHEN GROUPING(O.ORD_DT)=1 AND GROUPING(I.ITEM_ID)=1 THEN '201201' ELSE O.ORD_DT END ORD_DT, I.ITEM_ID, CASE WHEN GROUPING(O.ORD_DT)=1 AND GROUPING(I.ITEM_ID)=1 THEN '합계' WHEN GROUPING(I.ITEM_ID)=1 THEN '소계' ELSE I.ITEM_NM END ITEM_NM, SUM(O.ORD_ITEM_QTY) QTY, SUM(O.ORD_ITEM_QTY*P.PRICE) PRICE, CASE WHEN GROU..
Direct Path I/O오라클 DB Buffer Cache를 경유하지 않고 곧바로 데이터 블록을 읽고 쓸 수 있도록 제공되는 기능* Conventional Path I/O : DB Buffer Cache를 경유하는 일반적인 I/O 작업 Direct Path I/O가 작동하는 경우① Direct Path Read/Write Temp 대량의 데이터 정렬 시 PGA의 Sort Area가 부족할 경우 Temp 테이블 스페이스 이용→ Sort Area에 정렬된 데이터를 Temp 테이블 스페이스에 쓰고 이를 다시 읽을 때 Direct Path I/O 발생② Direct Path Read병렬 쿼리로 Full Scan 수행 시 Direct Path Read 발생→ 병렬도를 2로 주고 병렬쿼리 수행 시 쿼리 수행 속..
Prefetch - 디스크 블록을 읽을 때 곧이어 읽을 가능성이 높은 블록을 미리 읽어오는 기능 - 한번에 여러개 Single Block I/O를 병렬 방식으로 동시 수행 * Multi Block I/O가 한 익스텐트에 속한 인접한 블록들을 한꺼번에 읽는 방식이라면 Prefetch는 멀리 떨어져있는 블록들을 한꺼번에 읽는 방식 (서로 다른 익스텐트에 위치한 블록을 배치 방식으로 미리 적재) * db file parallel read 대기 이벤트로 측정 Sequential 액세스 성능 향상 - Multiblock I/O, 인덱스 Prefetch Random 액세스 성능 향상 - 버퍼 Pinning, 테이블 Prefetch 인덱스 Prefetch - Branch Block에서 앞으로 읽게 될 Leaf Blo..
조건절 이행- 『(A = B) 이고 (B = C) 이면 (A = C) 이다』는 추론을 통해 새로운 조건절을 내부적으로 생성해 주는 쿼리변환- 『(A > B) 이고 (B > C) 이면 (A > C) 이다』와 같은 추론도 가능- A 테이블에 사용된 필터 조건이 JOIN 조건절을 타고 반대편 B 테이블에 대한 필터 조건으로 이행- 한 테이블 내에서도 두 컬럼간 관계정보를 이용해 조건절 이행SELECT * FROM MINA.DEPT D, MINA.EMP E WHERE E.JOB = 'MANAGER' AND E.DEPT_NO = '10' AND D.DEPT_NO = E.DEPT_NO;-------------------------------------------------------------------------..
조건절 Pushing - 뷰를 참조하는 쿼리 블록의 조건절을 뷰 쿼리 블록 안으로 Pushing하는 기능(옵티마이저가 어떤 이유에서 뷰 Merging에 실패했을 때 2차적으로 시도) 조건절 (Predicate) Pushdown- 쿼리 블록 밖에 있는 조건들을 쿼리 블록 안쪽으로 밀어 넣음SELECT DEPTNO, AVG_SAL FROM (SELECT DEPTNO, AVG(SAL) AVG_SAL FROM EMP GROUP BY DEPTNO) A WHERE DETPNO = 30;Execution Plan-------------------------------------------------------------------------------- 0 SELECT STATEMENT Optimizer=ALL_RO..
☑ 쿼리 변환이란?뷰 MergingSELECT * FROM (SELECT * FROM EMP WHERE JOB = 'SALESMAN') A,(SELECT * FROM DEPT WHERE LOC = 'CHICAGO') BWHERE A.DEPTNO = B.DEPTNO;▼SELECT * FROM EMP A, DEPT BWHERE A.DEPTNO = B.DEPTNO AND A.JOB = 'SALESMAN' AND B.LOC = 'CHICAGO';- 뷰 Merging을 통해 옵티마이저는 더 다양한 access 경로를 조사 대상으로 삼게 됨 단순 뷰(Simple View) Merging- 단순 뷰 : 조건절과 JOIN문만을 포함, no_merge 힌트를 사용하지 않는 한 언제든 Merging 발생-- 조건절 하나만..
쿼리 변환 (Query Transformation)- 쿼리 옵티마이저가 SQL을 분석해 의미적으로 동일(같은 결과를 리턴)하면서도 더 나은 성능이 기대되는 형태로 재작성① 휴리스틱 쿼리 변환결과만 보장된다면 무조건 쿼리 변환 수행 (일종의 Rule-based 최적화 기법)② 비용기반 쿼리 변환변환된 쿼리의 비용이 더 낮을 때만 쿼리 변환 수행 서브쿼리의 분류- 인라인 뷰 (Inline View) : from 절에 나타나는 서브쿼리- 중첩된 서브쿼리 (Nested Subquery) : 결과집합을 한정하기 위해 where 절에 사용된 서브쿼리 * 서브쿼리가 메인쿼리에 있는 컬럼을 참조하는 형태를 '상관관계 있는 서브쿼리'라고 함- 스칼라 서브쿼리 (Scalar Subquery) : 한 레코드당 정확히 하나의..