Oracle 실행 계획의 액세스 및 필터 술어
Oracle 실행 계획에서 Access와 Filter 술어의 차이점은 무엇입니까?제가 제대로 이해했다면, 어떤 데이터 블록을 읽어야 하는지 결정하기 위해 "access"를 사용하고, 블록을 읽은 후에는 "filter"를 적용합니다.따라서 필터링은 "악"입니다.
아래 실행 계획의 술어 정보 섹션의 예에서:
10 - access("DOMAIN_CODE"='BLCOLLSTS' AND "CURRENT_VERSION_IND"='Y')
filter("CURRENT_VERSION_IND"='Y')
액세스 및 필터 섹션에서 모두 "CURRENT_VERSION_IND"가 반복되는 이유는 무엇입니까?
해당 작업은 INDEX RANGE 스캔 온 인덱스로 필드(DOMAIN_CODE, CODE_VALUE, CURRENT_VERSION_IND, DECODE_DISPLAY)에 정의됩니다.
CURRENT_VERSION_IND가 인덱스의 두 번째 열이 아니기 때문에 Access 단계에서 Oracle이 이 열을 사용할 수 없습니다.따라서 DOMAIN_CODE 열로 인덱스에 액세스하여 모든 블록을 가져온 다음 CURRENT_VERSION_IND로 필터링합니다.내 말이 맞니?
아니요. 이 예제의 액세스 술어는 인덱스가 둘 다에 의해 순회되고 있음을 나타냅니다.DOMAIN_CODE
그리고.CURRENT_VERSION_IND
.
중복되는 것으로 보이는 필터 술어에 대해서는 걱정하지 않습니다. 설명 계획의 이상한 점인 것 같습니다. 인덱스에 대해 일종의 건너뛰기 스캔을 수행해야 한다는 사실과 관련이 있을 수 있습니다(첫 번째 열에서 범위 스캔을 수행한 다음 건너뛰기 스캔을 수행합니다).CODE_VALUE
, 일치하는 항목 검색CURRENT_VERSION_IND
s)아, 아.
인덱스를 수정해야 하는지, 다른 인덱스를 만들어야 하는지는 완전히 별개의 문제입니다.
또한 사소한 오해를 바로잡기 위해서는 "액세스" 또는 "필터" 단계를 실행하든 간에 블록을 인덱스에서 가져와야 합니다.테이블에서 블록을 가져오는 것을 언급하는 경우, "아니오"라는 대답도 있습니다. 필터 술어 "10"이 테이블 액세스가 아니라 인덱스 액세스에 있다고 하셨고, 어쨌든 Oracle이 필터를 평가할 수 없는 이유는 없습니다.CURRENT_VERSION_IND
인덱스에서 - 인덱스에 포함되지 않은 다른 열이 필요하지 않는 한 테이블에 전혀 액세스할 필요가 없습니다.
Oracle이 무엇을 하고 있는지에 대한 평가는 맞지만 필터 단계(또는 다른 옵티마이저 선택)가 항상 "악"하다고 말하는 것은 틀립니다.질의할 수 있는 모든 가능한 열 조합을 완전히 색인화하는 것은 의미가 없으므로 필터링이 자주 필요합니다.
그러나 이 경우 인덱스의 두 번째 열로 CURRENT_VERSION_IND를 추가하면 자주 실행되는 쿼리의 성능이 크게 향상되고 다른 쿼리의 성능을 해치지 않는 것이 좋습니다.
언급URL : https://stackoverflow.com/questions/1464469/access-and-filter-predicates-in-oracle-execution-plan
'IT' 카테고리의 다른 글
WooCommerce 아카이브 페이지의 상품 제목 아래에 사용자 정의 필드 값 추가 (0) | 2023.10.30 |
---|---|
mysql에서 방금 삭제된 행을 복구하는 방법? (0) | 2023.10.30 |
자바스크립트에서 '정의'란 무엇에 쓰이는가? (0) | 2023.10.30 |
Memcpy(&a + 1, &b + 1, 0)가 C11에 정의되어 있습니까? (0) | 2023.10.30 |
C 언어의 새 행 문자는 무엇입니까?\r 또는 \n? (0) | 2023.10.30 |