programing

Oracle에서 인덱스 사용 강제

easyjava 2023. 3. 10. 22:54
반응형

Oracle에서 인덱스 사용 강제

인터뷰에서 이 질문을 접했는데 어떻게 대답해야 할지 몰랐다.

열에 인덱스가 있는 테이블이 있으며, 다음과 같이 쿼리합니다.

select * from table_name where column_having_index="some value";

조회가 너무 오래 걸리고 인덱스가 사용되지 않는 것을 알게 됩니다.인덱스를 사용하면 쿼리 성능이 향상될 것으로 생각되면 어떻게 강제로 인덱스를 사용할 수 있습니까?

옵티마이저 힌트를 사용할 수 있습니다.

select /*+ INDEX(table_name index_name) */ from table기타...

옵티마이저 힌트 사용에 대한 자세한 내용은 http://download.oracle.com/docs/cd/B19306_01/server.102/b14211/hintsref.htm를 참조하십시오.

인덱스를 사용하지 않는 이유는 여러 가지가 있을 수 있습니다.힌트를 지정한 후에도 Oracle Optimizer가 다르게 생각하고 Index를 사용하지 않을 수 있습니다.계획 설명 부분을 검토하여 INDEX와 INDEX를 함께 사용하는 문장과 사용하지 않는 문장의 비용을 확인해야 합니다.

Oracle이 CBO를 사용한다고 가정합니다.대부분의 경우 옵티마이저가 INDEX를 사용하여 비용이 높다고 생각하는 경우 힌트로 지정하더라도 옵티마이저는 무시하고 전체 테이블 스캔을 계속합니다.첫 번째 작업은 DBA_를 확인하는 것입니다.INDEX: 통계가 LAST_ANALYZED일 때를 알 수 있습니다.분석하지 않을 경우 분석용 테이블, 인덱스를 설정할 수 있습니다.

begin 
   DBMS_STATS.GATHER_INDEX_STATS ( OWNNAME=>user
                                 , INDNAME=>IndexName);
end;

테이블용.

begin 
   DBMS_STATS.GATHER_TABLE_STATS ( OWNNAME=>user
                                 , TABNAME=>TableName);
end;

극단적인 경우에는 직접 통계 설정을 시도할 수 있습니다.

인덱스를 사용하면 쿼리 성능이 향상될 것으로 생각되면 어떻게 강제로 인덱스를 사용할 수 있습니까?

먼저 인덱스가 전체 데이터 세트를 반환하는 데 더 나은 결과를 제공했는지 확인해야 합니다.

여기서 인덱스 힌트가 핵심이지만 인덱스 이름 지정 방식이 아닌 열 이름 지정 방법을 사용하는 것이 더 최신 방법입니다.이 경우 다음을 사용합니다.

select /*+ index(table_name (column_having_index)) */ *
from   table_name
where  column_having_index="some value"; 

좀 더 복잡한 경우에는 다음과 같은 경우가 있습니다.

select /*+ index(t (t.column_having_index)) */ *
from   my_owner.table_name t,
       ...
where  t.column_having_index="some value"; 

복합 인덱스에 대해서는 모든 열을 지정할 필요는 없지만, 좋은 생각인 것 같습니다.index_spec 내의 여러 열의 지정에 대해서는 http://docs.oracle.com/cd/E11882_01/server.112/e26088/sql_elements006.htm#autoId18에서 multiple index_pec 및 index_pec의 index_pec 사용에 대한 문서를 참조하십시오.

그 으로 성능이 column_having_index는 사용하지 않았습니다.
인덱스 액세스가 도움이 되는 것을 옵티마이저가 알 수 있도록 테이블에서 통계를 수집해야 합니다.직접적인 힌트를 사용하는 것은 좋은 방법이 아닙니다.

여러 가지 포맷을 시도했지만, 그것만 작동했습니다.

select /*+INDEX(e,dept_idx)*/ * from emp e;

다음을 사용할 수 있습니다.

WITH index = ...

상세 정보

언급URL : https://stackoverflow.com/questions/1838094/force-index-use-in-oracle

반응형