문서의 선택한 두 판 사이의 차이를 보여줍니다.
양쪽 이전 판 이전 판 다음 판 | 이전 판 | ||
study:oracle:datadb:4week_2:chap7 [2010/05/26 17:26] zummaz |
study:oracle:datadb:4week_2:chap7 [2010/05/27 14:38] (현재) zummaz |
||
---|---|---|---|
줄 1: | 줄 1: | ||
====3.3.7. 퀴리형태 변형(Query Transformation)을 위한 힌트==== | ====3.3.7. 퀴리형태 변형(Query Transformation)을 위한 힌트==== | ||
+ | *앞서서 옵티마이져의 최적화 단계에서 살펴본 " | ||
===USE_CONCAT=== | ===USE_CONCAT=== | ||
- | 조건절에 있는 OR 연산자 조건(또는 IN 연산자 조건)을 별도의 실행단위로 분리하여 각각의 최적의 액세스 경로를 수립하여 이를 연결(Concatenation)하는 실행계획을 수립하도록 유도하는 힌트이다. | + | *조건절에 있는 OR 연산자 조건(또는 IN 연산자 조건)을 별도의 실행단위로 분리하여 각각의 최적의 액세스 경로를 수립하여 이를 연결(Concatenation)하는 실행계획을 수립하도록 유도하는 힌트이다. |
- | 반드시 처리주관 조건이 OR로 나누어졌을 때 적용해야 하며, 잘못 사용하면 비효율이 발생할 수 잇으므로 주의해야 한다. | + | *반드시 처리주관 조건이 OR로 나누어졌을 때 적용해야 하며, 잘못 사용하면 비효율이 발생할 수 잇으므로 주의해야 한다. |
- | 예) SELECT /*+ USE_CONCAT */.... | + | |
FROM emp | FROM emp | ||
WHERE job = ' | WHERE job = ' | ||
===NO_EXPAND=== | ===NO_EXPAND=== | ||
- | 조건절에 있는 OR연산자 조건(또는 IN 연산자 조건)을 | + | *조건절에 있는 OR연산자 조건(또는 IN 연산자 조건)을 |
+ | *USE_CONCAT의 반대 개념이다. | ||
- | 예) SELECT /*+ NO_EXAPND */.... | + | |
FROM CUSTOMER | FROM CUSTOMER | ||
WHERE CUST_TYPE IN (' | WHERE CUST_TYPE IN (' | ||
===REWRITE=== | ===REWRITE=== | ||
- | 대량의 데이터를 대상으로 하는 조인이나 그룹함수 사용하여 가공집합을 얻고자할 때 수행속도 향상을 위해 미리 생성된 실체뷰(Materialized View)를 생성할수 있다. 우리가 어떤 쿼리를 수행하였을 때 옵티마이져는 원래의 테이블을 액세스하는 방법과 실체뷰를 액세스하는 방법 중에서 유리한 것을 선택하도록 쿼리를 변형할수 있다. 이것을 ' | + | *대량의 데이터를 대상으로 하는 조인이나 그룹함수 사용하여 가공집합을 얻고자할 때 수행속도 향상을 위해 미리 생성된 실체뷰(Materialized View)를 생성할수 있다. |
- | 만약, 힌트내에 특정 실체뷰가 지정되어 있으면 비용에 상관없이 해당 실체뷰를 사용하게 된다. 이 때 힌트 내에 포함되지 않는 실체뷰는 고려대상이 아니다. 만약 힌트내에 실체뷰를 지정하지 않으면 적용 가능한 실체뷰를 찾아서 비용에 상관없이 그 실체뷰를 사용한다. | + | *우리가 어떤 쿼리를 수행하였을 때 옵티마이져는 원래의 테이블을 액세스하는 방법과 실체뷰를 액세스하는 방법 중에서 유리한 것을 선택하도록 쿼리를 변형할수 있다. 이것을 ' |
+ | *만약, 힌트내에 특정 실체뷰가 지정되어 있으면 비용에 상관없이 해당 실체뷰를 사용하게 된다. 이 때 힌트 내에 포함되지 않는 실체뷰는 고려대상이 아니다. | ||
+ | *만약 힌트내에 실체뷰를 지정하지 않으면 적용 가능한 실체뷰를 찾아서 비용에 상관없이 그 실체뷰를 사용한다. | ||
예) SELECT /*+ REWRITE (sales_mv) */ | 예) SELECT /*+ REWRITE (sales_mv) */ | ||
줄 28: | 줄 32: | ||
===NO_REWRITE=== | ===NO_REWRITE=== | ||
- | 이 힌트는 | + | *QUERY_REWRITE_ENABLED 파라메터가 TRUE로 정의되어 있더라도 이를 무시하고 쿼리 블록에 대한 쿼리 재생성를 하지 않도록 유도한다. |
- | 예) SELECT /*+ NOREWRITE */ sum(s.amount_sold) AS dollars | + | |
FROM sales s, times t | FROM sales s, times t | ||
WHERE s.time_id = t.time_id | WHERE s.time_id = t.time_id | ||
GROUP BY t.calendar_month_desc; | GROUP BY t.calendar_month_desc; | ||
- | 이것은 | + | |
+ | \\ | ||
+ | *실체뷰를 통해 쿼리 수행결과를 미리 저장하고 있는 경우에는 원래의 테이블로부터 직접 재계산을 유도함으로써 최신의 값으로 결과를 출력하도록 할 때 유용하게 사용된다. 버전에 따라 NO_REWRITE로 사용되기도 한다. | ||
===MERGE=== | ===MERGE=== | ||
- | 뷰나 인라인뷰의 액세스를 최적화기 위해서는 뷰쿼리에 사용된 원래의 테이블을 최적으로 액세스하도록 문장을 변환시켜야 한다. 이 과정을 뷰병합이라고 하며, 주어진 상황에 따라 다양한 현상이 나타난다. 이 힌트는 뷰병합이 가능함에도 불구하고 뷰병합이 일어나지 않을 때 적용할수 있다. 주로 복잡한 뷰나 인라인 뷰일 때 가끔 적용해 보면 상당한 효과를 얻는 경우가 많이 있다. | + | *뷰나 인라인뷰의 액세스를 최적화기 위해서는 뷰쿼리에 사용된 원래의 테이블을 최적으로 액세스하도록 문장을 변환시켜야 한다. 이 과정을 뷰병합이라고 하며, 주어진 상황에 따라 다양한 현상이 나타난다. |
+ | *이 힌트는 뷰병합이 가능함에도 불구하고 뷰병합이 일어나지 않을 때 적용할수 있다. | ||
+ | *주로 복잡한 뷰나 인라인 뷰일 때 가끔 적용해 보면 상당한 효과를 얻는 경우가 많이 있다. | ||
- | 예) SELECT /*+ MERGE(table_name) */....... | + | |
===NO_MERGE=== | ===NO_MERGE=== | ||
- | 뷰쿼리 병합이 일어나지 않도록 요구하는 힌트이다. 주어진 조건이나 처리형태에 따라 뷰 병합을 하지 않고 먼저 뷰를 수행한 결과를 이용해 다음 처리를 하는 것이 유리한 경우도 많이 있다. 이러한 경우에 뷰 병합을 방지하기위해 사용하는 힌트 이다. | + | *뷰쿼리 병합이 일어나지 않도록 요구하는 힌트이다. |
+ | *주어진 조건이나 처리형태에 따라 | ||
예) SELECT /*+ NO_MERGE(table_name) */ | 예) SELECT /*+ NO_MERGE(table_name) */ | ||
===STAR_TRANSFORMATION=== | ===STAR_TRANSFORMATION=== | ||
- | 스카 변형 조인(Star transformation join)을 수행하도록 요구하는 힌트이다. 이조인은 소량의 데이터를 가진여러 개의 디멘전 테이블과 팩트 테이블의 개별 비트맵 인덱스를 이용하여 처리범위를 줄이는 조인방식이다. 이 조인은 내부적으로 옵티마이져가 질의를 변형하여 실행계획을 생성하게 한다. | + | *스카 변형 조인(Star transformation join)을 수행하도록 요구하는 힌트이다. 이조인은 |
- | 참고: 이 조인에 대한 상세내용은 [ 제2부 조인의 최적화' | + | *참고: 이 조인에 대한 상세내용은 [ 제2부 조인의 최적화' |
- | 예) SELECT /*+ STAR_TRANSFORMATION */ | + | |
d.dept_name, | d.dept_name, | ||
SUM(s.amount), | SUM(s.amount), | ||
줄 61: | 줄 70: | ||
AND p.product_name IN (' | AND p.product_name IN (' | ||
GROUP BY d.dept_name, | GROUP BY d.dept_name, | ||
- | NO_STAR_TRANSFORMATION 힌트는 옵티마이져로 하여금 스타변형 조인을 하지 않도록 유도한다. | + | |
+ | |||
+ | \\ | ||
+ | *NO_STAR_TRANSFORMATION 힌트는 옵티마이져로 하여금 스타변형 조인을 하지 않도록 유도한다. | ||
===FACT=== | ===FACT=== | ||
- | 스타변형 조인에서 팩트 테이블을 지정하기 위해서는 사용하는 힌트이다. 대부분의경우는 옵티마이져에게 맡기는 것이 바람직하지만 팩트 테이블 선정에 오류가 있어서 원하지 않는 실행계획이 나타났을때 사용할수 있다. NO_FACT힌트는 지정한 테이블을 팩트 테이블로 인정하지 말아달라는 요구를 하는 힌트이다. | + | *스타변형 조인에서 팩트 테이블을 지정하기 위해서는 사용하는 힌트이다. 대부분의경우는 옵티마이져에게 맡기는 것이 바람직하지만 팩트 테이블 선정에 오류가 있어서 원하지 않는 실행계획이 나타났을때 사용할수 있다. |
- | NO_FACT 힌트는 STAR_TRANSFORMATION 상황에서 옵티마이져가 지정한 테이블을 FACT테이블로 고려하지 않도록 유도한다. | + | *NO_FACT힌트는 지정한 테이블을 팩트 테이블로 인정하지 말아달라는 요구를 하는 힌트이다. NO_FACT 힌트는STAR_TRANSFORMATION 상황에서 옵티마이져가 지정한 테이블을 FACT테이블로 고려하지 않도록 유도한다. |
===UNNEST=== | ===UNNEST=== | ||
- | 서브쿼리와 메인쿼리를 합쳐 조인 형태로 변형하도록 하는 실행계획을 생성하도록 유도하는 힌트이다. | + | *서브쿼리와 메인쿼리를 합쳐 조인 형태로 변형하도록 하는 실행계획을 생성하도록 유도하는 힌트이다. |
- | 예) SELECT /*+ UNNEST(@qb) */ | + | |
FROM emp e | FROM emp e | ||
WHERE e.deptno IN (SELECT /*+ QB_NAME(qb) */ d.deptno | WHERE e.deptno IN (SELECT /*+ QB_NAME(qb) */ d.deptno | ||
FROM dept d | FROM dept d | ||
WHERE d.loc = ' | WHERE d.loc = ' | ||
- | NO_UNNEST힌트는 UNNESTING을 하지 않도록 유도한다. | + | \\ |
+ | *NO_UNNEST힌트는 UNNESTING을 하지 않도록 유도한다. | ||