Oracle Optimizer가 동일한 SELECT에서 여러 힌트를 사용합니까?
쿼리 성능을 최적화하기 위해 최적화 도구 힌트를 사용해야 했습니다.하지만 옵티마이저가 한 번에 하나 이상의 힌트를 사용하는지는 배운 적이 없습니다.
예.
SELECT /*+ INDEX(i dcf_vol_prospect_ids_idx)*/
/*+ LEADING(i vol) */
/*+ ALL_ROWS */
i.id_number,
...
FROM i_table i
JOIN vol_table vol on vol.id_number = i.id_number
JOIN to_a_bunch_of_other_tables...
WHERE i.solicitor_id = '123'
AND vol.solicitable_ind = 1;
설명 계획서에는 같은 비용이 나와 있지만, 그건 그냥 견적서인 것으로 알고 있습니다.
모든 테이블 및 인덱스 통계가 계산되었다고 가정하십시오.참고로 인덱스 dcf_vol_prospect_ids_idx는 i.solicitor_id 열에 있습니다.
감사해요.
스튜
훌륭한 Oracle 문서(http://download.oracle.com/docs/cd/B19306_01/server.102/b14211/hintsref.htm) 의 이 예에 나와 있는 것처럼 모든 힌트를 하나의 주석 블록으로 지정해 보십시오.
16.2.1 전체 힌트 세트 지정
경우에 따라 힌트를 사용할 때 최적의 실행 계획을 보장하기 위해 전체 힌트 집합을 지정해야 할 수도 있습니다.예를 들어, 많은 테이블 조인으로 구성된 매우 복잡한 쿼리가 있고 지정된 테이블에 INDEX 힌트만 지정한 경우 최적화 도구는 사용할 나머지 액세스 경로와 해당 조인 방법을 결정해야 합니다.따라서 INDEX 힌트를 주었더라도 Optimizer가 해당 힌트를 사용하지 않을 수 있습니다. Optimizer가 Optimizer에서 선택한 조인 방법 및 액세스 경로로 인해 요청된 인덱스를 사용할 수 없다고 판단했을 수 있기 때문입니다.
예 16-1에서, 선행 힌트는 사용할 정확한 조인 순서를 지정하고, 다른 테이블에 사용할 조인 방법도 지정합니다.
예 16-1 전체 힌트 집합 지정
SELECT /*+ LEADING(e2 e1) USE_NL(e1) INDEX(e1 emp_emp_id_pk)
USE_MERGE(j) FULL(j) */
e1.first_name, e1.last_name, j.job_id, sum(e2.salary) total_sal
FROM employees e1, employees e2, job_history j
WHERE e1.employee_id = e2.manager_id
AND e1.employee_id = j.employee_id
AND e1.hire_date = j.start_date
GROUP BY e1.first_name, e1.last_name, j.job_id ORDER BY total_sal;
Oracle 19c는 힌트 사용량 보고 기능을 도입했습니다.
EXPLAIN PLAN FOR
SELECT /*+ INDEX(i dcf_vol_prospect_ids_idx)*/
/*+ LEADING(i vol) */
/*+ ALL_ROWS */
i.id_number,
...
FROM i_table i
JOIN vol_table vol on vol.id_number = i.id_number
JOIN to_a_bunch_of_other_tables...
WHERE i.solicitor_id = '123'
AND vol.solicitable_ind = 1;
SELECT * FROM table(DBMS_XPLAN.DISPLAY(FORMAT=>'BASIC +HINT_REPORT'));
--============
다른 섹션을 보여줍니다.Hint Report
:
Hint Report (identified by operation id / Query Block Name / Object Alias):
Total hints for statement: ...
---------------------------------------------------
...
실제로 비용 기반 Oracle Fundamentals의 저자인 Jonathan Lewis는 CBO가 올바른 계획을 찾지 못할 경우 CBO의 작업을 인계받아 힌트를 "레이어인"해야 한다고 권장합니다. 즉, 쿼리에서 테이블당 평균 2개의 힌트를 제공합니다.
그 이유는 하나의 힌트가 CBO가 도움을 받지 못하는 것보다 더 나쁜 또 다른 나쁜 계획으로 이어질 수 있기 때문입니다.만약 CBO가 틀렸다면, 당신은 단지 올바른 방향으로 밀고 나가는 것이 아니라 전체 계획을 제시할 필요가 있습니다.
언급URL : https://stackoverflow.com/questions/421973/will-oracle-optimizer-use-multiple-hints-in-the-same-select
'programing' 카테고리의 다른 글
Python을 사용하여 ssh를 통해 명령 수행 (0) | 2023.06.25 |
---|---|
스프링 데이터 탄력적 검색을 사용한 탄력적 검색 Rest 클라이언트 (0) | 2023.06.25 |
SQL Server를 사용하여 폴더 내의 파일을 나열하는 방법 (0) | 2023.06.25 |
Springboot : BeanDefinitionStore 예외:구성 클래스를 구문 분석하지 못했습니다. (0) | 2023.06.25 |
트랜잭션 범위가 너무 일찍 완료됨 (0) | 2023.06.25 |