목록튜닝 (5)
정미나닷컴
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..
징검다리 테이블 JOIN을 이용한 튜닝-- 고객의 할인혜택 조회SELECT /*+ ordered use_nl(S R) */ C.고객번호, S.서비스번호, S.서비스구분코드, S.서비스상태코드, S.서비스상태변경코드, R.할인시작일자, R.할인종료일자 FROM 고객 C, 서비스 S, 서비스요금할인 R WHERE C.주민법인등록번호 = :ctz_biz_num AND S.명의고객번호 = C.고객번호 AND R.서비스번호 = S.서비스번호 AND R.서비스상품그룹 = '3001' AND R.할인기간코드 = '15' ORDER BY R.할인종료일자 DESC, S.서비스번호; -- 인덱스 구성 고객_N1 : 주민법인등록번호서비스_N2 : 명의고객번호 + 서비스번호서비스요금할인_PK : 서비스번호 + 서비스상품그룹서..
수정 가능 JOIN View 활용- 다른 테이블과 JOIN이 필요한 경우 전통적인 방식의 UPDATE문을 사용하면 비효율 발생UPDATE 고객 C SET 최종거래일시 = (SELECT MAX(거래일시) FROM 거래 WHERE 고객번호 = C.고객번호 AND 거래일시 >= TRUNC(ADD_MONTHS(SYSDATE, -1))), 최근거래횟수 = (SELECT COUNT(*) FROM 거래 WHERE 고객번호 = C.고객번호 AND 거래일시 >= TRUNC(ADD_MONTHS(SYSDATE, -1))), 최근거래금액 = (SELECT SUM(거래금액) FROM 거래 WHERE 고객번호 = C.고객번호 AND 거래일시 >= TRUNC(ADD_MONTHS(SYSDATE, -1)))WHERE EXISTS (S..
스칼라 서브쿼리 - 함수처럼 한 레코드 당 정확히 하나의 값만을 리턴하는 서브쿼리 - 주로 select-list에서 사용, 컬럼이 올 수 있는 대부분 위치에 사용 가능 SELECT EMPNO, ENAME, SAL, HIREDATE, (SELECT D.DNAME FROM DEPT D WHERE D.DEPTNO = E.DEPTNO) DNAME FROM EMP E WHERE SAL >= 2000; -- Outer JOIN과 같은 결과 -- DEPT와 JOIN에 실패하는 EMP 레코드가 있다면 DNAME으로 NULL 값 출력 스칼라 서브쿼리의 캐싱 효과 - 오라클은 스칼라 서브쿼리의 입력 값과 출력 값을 내부 캐시(Query Execution Cache)에 저장 - 스칼라 서브쿼리가 수행될 때 일단 '입력 값'..
쿼리의 조건절에 인덱스 선두 컬럼이 사용된 경우(인덱스가 B*Tree 형태일 때)옵티마이저는 인덱스의 Root부터 탐색을 시작해 Branch를 거쳐 원하는 레코드 키값이 존재하는 Leaf 까지 도달한다. 이 때 Root -> Branch -> Leaf 에 도달하는 과정(Leaf node의 시작점을 찾는 과정)을 수직적 탐색,Leaf node의 시작점에서부터 원하는 범위까지를 scan하는 과정(인덱스는 정렬 상태이므로)을 수평적 탐색,수평적 탐색을 통해 get한 RowID를 이용해 궁극적으로 원하는 데이터가 있는(Select 절에 명시된 컬럼 데이터) 테이블까지 도달하는 과정을 Table Random Access라고 한다. 하지만 주의해야 할 점은 조건절에 인덱스 컬럼을 사용한다고 해서 무조건 인덱스 활용..