programing

Oracle 가입 시 인덱스를 사용하지 않음

testmans 2023. 9. 7. 21:35
반응형

Oracle 가입 시 인덱스를 사용하지 않음

제가 계획을 색인하고 설명하는 것은 처음이니 참고해주세요!쿼리를 조정하려고 하는데 문제가 있습니다.

테이블이 두 개 있습니다.

SKU
------
SKUIDX (Unique index)
CLRIDX (Index)
..
..

IMPCOST_CLR
-----------
ICCIDX (Unique index)
CLRIDX (Index)
...
..

내가 할 때는.select * from SKU where clridx = 122, 설명 계획에 있는 인덱스를 사용하고 있음을 알 수 있습니다(TABLE Access라고 되어 있습니다).INDEX, OBject_NAME 아래 인덱스 이름으로 표시되며 옵션은 RANGE SCAN)입니다.

동일한 필드에 가입하려고 하면 인덱스를 사용하지 않는 것으로 나타납니다(TABLE Access라고 표시됨).해시 조인(HASH JOIN) 및 옵션 아래에는 FULL(전체)이라고 표시됩니다.

인덱스를 사용하지 않는 이유를 확인하려면 무엇을 찾아야 합니까?죄송합니다, 어떤 명령어를 입력해야 이것을 표시할 수 있는지 잘 모르니 더 많은 정보가 필요하시면 말씀해주세요.

예:
첫번째 쿼리:

  SELECT
    *
  FROM
    AP21.SKU
  WHERE
    CLRIDX = 100

enter image description here

두 번째 쿼리:

  SELECT
    *
  FROM
    AP21.IMPCOST_CLR
  WHERE
    CLRIDX = 100

enter image description here

세 번째 쿼리:

  SELECT
    *
  FROM
    AP21.SKU
  INNER JOIN
    AP21.IMPCOST_CLR ON
    IMPCOST_CLR.CLRIDX = SKU.CLRIDX

enter image description here

이 쿼리를 보십시오.

SELECT
    *
FROM
    AP21.SKU
INNER JOIN
    AP21.IMPCOST_CLR ON
    IMPCOST_CLR.CLRIDX = SKU.CLRIDX

추가 술어가 없습니다.따라서 SKU의 모든 행을 IMPCOST_CLR의 모든 행에 결합하는 것입니다.또한 두 표에서 모든 열을 선택하고 있습니다.

이는 Oracle이 두 테이블을 모두 읽어야 한다는 것을 의미합니다.가장 효율적인 방법은 Full Table Scan(전체 테이블 스캔)을 사용하고, 다중 블록 읽기의 모든 행을 퍼올리고, 결합 값과 일치하도록 해싱을 사용하는 것입니다.

기본적으로 이는 SQL이 매우 잘 수행하는 반면 인덱스된 읽기는 RBAR가 더 높습니다.다음과 같은 추가 술어를 포함하도록 세 번째 쿼리를 변경한 경우

WHERE SKU.CLRIDX = 100

액세스 경로가 INDEX RANGE SCAN으로 되돌아가는 것을 볼 수 있습니다. 비교 가능한 소수의 행만 선택하기 때문에 인덱스된 읽기가 다시 한 번 더 효율적인 경로입니다.


"내가 튜닝하려는 쿼리는 수백 개가 훨씬 더 길지만, 그것을 분해하고 단계적으로 진행합니다!"

이것은 좋은 기술이지만 Oracle optimizer가 어떻게 작동하는지 이해해야 합니다.설명 계획서에는 많은 정보가 있습니다.자세히 알아보세요.의 가치에 주목해야 합니다.Rows각 단계에 대한 열입니다.Optimizer가 작업에서 얻을 수 있는 행 수를 알려줍니다.처음 두 쿼리의 값은 세 번째 쿼리와 비교하여 매우 다른 값을 볼 수 있습니다.

동일한 필드에 가입하려고 하면 인덱스를 사용하지 않는 것으로 나타납니다(TABLE Access라고 표시됨).해시 조인(HASH JOIN) 및 옵션 아래에는 FULL(전체)이라고 표시됩니다.

해시 조인(HASH JOIN)이 조인 술어에 (필요한) 인덱스를 사용하지 않기 때문입니다.

http://use-the-index-luke.com/sql/join/hash-join-partial-objects

언급URL : https://stackoverflow.com/questions/17666331/oracle-not-using-index-when-joining

반응형