본문 바로가기

반응형

전체 글

oracle - [Hint]조인 방법 변경(LEADING) [Hint]조인 방법 변경(LEADING) LEADING 힌트는 두 테이블 조인 시 드라이빙 테이블을 인자로 사용하며 ORDERED와 같이 FROM절 뒤에 오는 테이블의 위치가 중요 합니다. 참고로 ORDERED 힌트는 주로 USE_NL/USE_MERGE/USE_HASH 힌트와 같이 사용되는데 USE_NL/USE_MERGE/USE_HASH 인자로 사용되는 테이블은 FROM절에서 두 번째로 나타나는 테이블 이어야 하며 FROM절에서 처음 나타나는 테이블이 드라이빙 테이블(OUTER/DRIVING TABLE)이 되고 나중에 나타나는 테이블이 PROBED TABLE(INNER TABLE)이 됩니다. [9i]SQL>SELECT /*+ LEADING(E) USE_NL(D) */ E.ENAME, D.DNAME FR.. 더보기
oracle - [Hint]조인 방법 변경(HASH_SJ) [Hint]조인 방법 변경(HASH_SJ) 세미 조인은 보통 EXISTS를 사용하는 서브쿼리의 형태로 나타나며 이러한 경우 서브 쿼리에 인덱스가 존재하지 않는다면 상당히 비효율적인데 이러한 서브 쿼리에 인덱스가 없는 경우 SEMI-JOIN이 일어나도록 유도한다면 성능의 향상을 꽤할 수 있습니다. 즉 인덱스가 없는 EXISTS를 사용하는 쿼리라면 HASH_SJ or MERGE_SJ 힌트 구분을 이용해서 세미 조인이 일어나도록 푸는 것이 좋습니다. 주로 서브 쿼리의 컬럼에 인덱스가 존재하지 않는 Correlated Exists 쿼리에 사용되는 힌트 구문으로 세미조인을 해시 조인을 이용하도록 하는 힌트 구문으로 Outer Table의 ROW수가 많은 경우에 더 효율적 입니다. 아래의 질의는 EMP 테이블에서 .. 더보기
oracle - [Hint]조인 방법 변경(HASH_AJ) [Hint]조인 방법 변경(HASH_AJ) ANTI 조인은 테이블의 레코드를 추출하는 경우 조인의 대상이 되는 테이블과 일치하지 않는 데이터를 추출하는 연산 입니다. SQL연산에서 NOT IN, NOT EXISTS, MINUS등이 해당되며 이러한 안티 조인은 MERGE ANTI-JOIN or HASH ANTI_JOIN으로 풀리도록 할 수 있는데 HASH_AJ에 대해 살펴보도록 하죠,,., 주로 NOT IN등의 SQL문에 이용되며 힌트 구문은 다음과 같이 서브 쿼리에 명시해야 하며 서브 쿼리의 WHERE절에 NOT NULL 조건도 명시해줘야 합니다,,, 잊지 마세요! [형식]/*+ HASH_AJ(table) */ [9i]SQL> SELECT ENAME, SAL FROM EMP WHERE EMPNO IS N.. 더보기
oracle - [Hint]조인 방법 변경(DRIVING_SITE) [Hint]조인 방법 변경(DRIVING_SITE) 분산환경(DB Link를 이용하는 경우)에서 쿼리를 사용하는 경우 일반적으로 SQL 실행의 주체는 해당 Query를 실행시킨 로컬데이터 베이스가 됩니다. 즉 원격지의 DEPT 테이블의 데이터를 로컬로 가져와서 조인을 하는 것은 로컬에서 하게 되구요… 참고로 이 힌트의 경우 Cost-Based Optimizer 또는 Rule-Based Optimizer환경 모두에서 사용 가능 합니다. [형식]/*+ DRIVING_SITE ( table ) */ SQL>select e.empno, e.ename, e.sal, d.dname, d.loc from emp e, dept@remote_db d ? 요기 DB Link 사용했습니다. where e.deptno = d.. 더보기
oracle - [Hint]옵티마이저(Optimizer) 개요 [Hint]옵티마이저(Optimizer) 개요 옵티마이저(Optimizer) 개요 옵티마이저(Optimizer)를 SQL문장을 실행하는데 가정 적절한 데이터 추출 경로(실행경로)를 결정하는 판단기 또는 내부 아키텍처라고 할 수 있는데 동일한 외형의 SQL문장일지라도 결과는 같지만 옵티마이저의 목표(Goal)에 따라 처리하는 내부 실행 경로는 다를 수 있습니다. 오라클은 CBO(Cost-Based Optimizer)와 RBO(Rule-Based Optimizer)를 지원하며 CBO의 경우 오라클7부터 도입된 권장되는 방법이며 RBO의 경우 간단한 몇 가지 규칙을 통해서만 실행계획을 수립하는 방법입니다. CBO의 경우 테이블이나 인덱스의 통계 정보를 바탕으로 가장 현실적이며 융통성을 가지는 실행 계획을 만들.. 더보기
oracle - [Hint]오라클 힌트란? [Hint]오라클 힌트란? [Hint]오라클 힌트란? 힌트는 SQL 튜닝의 핵심부분으로 일종의 지시구문이며 SQL에 포함되어 쓰여져 Optimizer의 실행 계획을 원하는 대로 바꿀 수 있게 해줍니다. 오라클 Optiomizer라고 해서 항상 최선의 실행 계획을 수립할 수는 없으므로 테이블 이나 인덱스의 잘못된 실행 계획을 개발자가 직접 바꿀 수 있도록 도와주는 것이 Hint 입니다. 사용자는 특정 SQL 문장에서 어떤 인덱스가 선택도가 높은지에 대해 알고 있는데 이 경우 오라클 서버의 Optimizer에 의존하여 나온 실행 계획보다 훨씬 효율적인 실행계획을 사용자가 구사할 수 있다는 것입니다. 힌트를 사용하게 되면 액세스 경로, 조인의 순서, Optiomizer의 목표(Goal)를 변경 가능하며 SQL.. 더보기
oracle - [Hint]비용기반 옵티마이저(Cost-Based Optmizer) [Hint]비용기반 옵티마이저(Cost-Based Optmizer) 비용기반 옵티마이저(Cost-Based Optimizer) 비용기반 옵티마이저(CBO)는 실제로 가장 빠르게 실행되는 방법의 Cost를 계산하여 실행 경로를 선택하는 방법인데 DB 의 버전이 높아질수록 더욱 정교하게 발전되고 있는 방법이며 오라클에서 권장 하고 있습니다. 하지만 옵티마이저가 가장 최선의 실행 경로를 찾기 위해서는 ANALYZE 명령으로 테이블의 크기, 레코드수,컬럼값의 분포도와 같은 부가적인 정보를 제공해 주어야 정상적으로 잘 동작한다고 할 수 있는데 테이블이나 인덱스에 통계 정보가 있는지에 대한 여부는 DBA_TABLES, DBA_INDEXED와 같은 뷰의 last_analyzed 컬럼의 값을 통해 알 수 있는데 NUL.. 더보기
oracle - [Hint]병렬처리(PARALLEL_INDEX) [Hint]병렬처리(PARALLEL_INDEX) Partition인덱스에 대해 인덱스 범위 스캔을 병렬로 처리하도록 하는 힌트 입니다. 형식은 다음과 같은데 처음 인수를 제외하고는 모두 생략가능 하며 세번째 인수는 병렬도, 네번째 인수값과 세번째 인수의 곱이 해당 쿼리의 최종적인 병렬도 값을 나타냅니다. [형식]/*+ PARALLEL_INDEX ( table [index [, index]...] [{ , integer | , DEFAULT | , } [ , integer | , DEFAULT ]] ) */ [예]Select /*+ parallel_index(emp, idx_ename, 3, 2) */ *From empWhere ename = ‘홍길동’; 파티션된 테이블이 아니더라도 아래처럼 index_f.. 더보기
oracle - [Hint]병렬처리(PARALLEL) [Hint]병렬처리(PARALLEL) Parallel 힌트에서 지정한 병렬도로 쿼리를 처리할 수 있게 해줍니다.query에 포함된 table의 degree를 설정할 수 있는데 테이블이나 인덱스 생성시 degree는 기본이 1이며 다음과 같이 확인 가능 합니다. 참고로 degree는 병렬도를 이야기 하는데 해당 SQL을 몇 개의 작업으로 분할하여 동시에 처리할 것인가를 나타내는 값입니다. 하나의 일을 동시에 여러 프로세스가 나누어서 처리하므로 빨리 할 수 있겠지만 무작정 성능이 좋은 것은 아닙니다. SQL>SELECT DEGREE FROM USER_TABLES 2 WHERE TABLE_NAME = ‘EMP’ DEGREE------1 만약 다음과 같이 테이블을 만든다면 degree 는 2가 되겠죠… Crea.. 더보기
oracle - [Hint]병렬처리(NOPARALLEL) [Hint]병렬처리(NOPARALLEL) 이 힌트는 Query가 병렬로 실행되는 것을 막아 주며 10g에서는 NO_PARALLEL로 사용됩니다. 원래 EMP TABLE의 병렬도는 1이 기본값 인데… 만약 아래와 같이 EMP 테이블의 degree를 2로 주고 Query를 실행 한다면… SQL>alter table emp parallel(degree 2); SQL>select * from emp; Execution Plan--------------------------------------------------------------------SELECT STATEMENT Optimizer=CHOOSE TABLE ACCESS (FULL) OF ‘EMP’ :Q188888 1 PARALLEL_TO_SERIAL S.. 더보기

반응형