IT

Oracle에서 Substor LIKE가 더 빠릅니까?

itgroup 2023. 7. 2. 19:14
반응형

Oracle에서 Substor LIKE가 더 빠릅니까?

그럴 것이다

WHERE substr(my_field,1,6) = 'search'

또는

WHERE my_field LIKE 'search%'

Oracle 환경에서 속도가 더 빠릅니까? 아니면 차이가 없습니까?

으로 최의성능목을한이수선있상다습니택할고인적다면표로다를 선택할 입니다.SUBSTR(my_field,1,6)쿼리를 지원하는 기능 기반 인덱스를 만듭니다.

CREATE INDEX my_substr_idx
    ON my_table( substr( my_field,1,6 ) );

다른 사람들이 지적했듯이,SUBSTR(my_field,1,6)에는 정규 인덱스를 할 수 .MY_FIELDLIKE 버전은 인덱스를 사용할 수 있지만, 이 경우 최적화 도구의 카디널리티 추정치는 일반적으로 상당히 낮으므로 유용할 때 인덱스를 사용하지 않거나 테이블 스캔이 선호될 때 인덱스를 사용할 가능성이 높습니다.실제 식을 인덱싱하면 최적화 도구에서 작업할 수 있는 정보가 훨씬 많아지므로 인덱스를 올바르게 선택할 가능성이 훨씬 높아집니다.저보다 똑똑한 사람이 11g의 가상 열 통계를 사용하여 최적화 도구에 LIKE 쿼리에 대한 더 나은 정보를 제공하는 방법을 제안할 수 있습니다.

6이 변수인 경우(예: 처음 6자를 검색하고 다른 숫자를 검색하려는 경우) 해당 쿼리를 지원하는 기능 기반 인덱스를 만들지 못할 수 있습니다.이 경우, LIKE 공식을 사용하면 최적화 도구의 의사 결정의 변화에 더 잘 적응할 수 있습니다.

제공된 두 가지 옵션 중에서 확실히 좋아요.테이블의 모든 행에 대해 하위 문자열 메서드를 실행해야 합니다.LIKE를 사용하면 인덱스를 사용할 수 있습니다.

제 답변을 확인하려면 결과를 프로파일링하십시오.대낮처럼 맑아야 합니다.

my_field에 인덱스가 있다면 LIKE가 더 빠를 수 있습니다.자신만의 벤치마크를 수행합니다.

인덱스가 없으면 차이가 없습니다.오라클이 전체 테이블 검색을 수행하고 각 행에 대한 식을 평가하기 때문입니다.열에 인덱스를 붙여 두 쿼리의 속도를 높일 수 있습니다.

CREATE INDEX my_like_idx
ON my_table( my_field );

이 인덱스는 보다 유연하며 like를 사용하여 쿼리 속도를 높입니다.문자로 시작하여 마지막에 자리 표시자(%)가 있는 비교에 사용할 수 있습니다.일치하는 모든 행을 찾기 위해 Oracle이 인덱스 범위 검사를 수행하고 있습니다.

CREATE INDEX my_substr_idx
ON my_table( substr( my_field,1,6 ) );

이 인덱스는 하위 항목을 사용하여 쿼리 속도를 높입니다.하지만 이 색인은 처음 6자만 비교하는 것이 매우 특별합니다.

중간에 시작하는 부분을 문의하면 됩니다.함수 기반 인덱스를 만드는 것이 도움이 됩니다.

WHERE substr(my_field,2,5) = 'earch'
WHERE my_field like '%earch%'

여기에는 두 가지 문제가 있습니다.

  1. Oracle은 어느 것에 대해 보다 정확한 카디널리티와 비용 추정치를 산출합니까?
  2. 어떤 방법이 잠재적인 접근 방법의 측면에서 더 유연합니까?

버전에 따라 다를 수 있지만 두 가지 모두 테스트하기가 매우 쉬우며 사용 중인 버전과 데이터에 대한 최상의 정보를 얻을 수 있습니다.

다음을 사용하여 두 쿼리에 대한 실행 계획 실행...

explain plan for 
select ... from ... where my_field LIKE 'search%';

select * from table(dbms_xplan.display);

그리고.

explain plan for 
select ... from ... where substr(my_field,1,6) = 'search';

select * from table(dbms_xplan.display);

인덱스 등의 존재 여부에 따라 실행 계획에 차이가 있을 수 있지만 카디널리티 추정치를 실제 결과와 비교할 수도 있습니다.

select count(*) from ... where my_field LIKE 'search%';

두 방법 중 하나가 다른 방법보다 훨씬 정확할 수 있습니다.

둘 중 어느 것도 매우 정확하지 않고 이 쿼리가 사소한 시간 동안 실행될 것으로 예상되는 경우에는 동적 샘플링을 사용하여 추정치를 개선하는 것이 좋습니다. 잘못된 카디널리티 추정치를 사용하면 최적화 도구가 차선의 액세스 방법을 선택할 수 있기 때문입니다.

explain plan for 
select /*+ dynamic_sampling(4) */ ... from ... where substr(my_field,1,6) = 'search';

select * from table(dbms_xplan.display);

인덱스 사용에 관한 한, 두 방법 모두 인덱스 기반 액세스 방법을 사용할 수 있습니다.LIKE 서술어는 아마도 인덱스에 더 친숙할 것이며 범위 검색 또는 빠른 전체 인덱스 검색을 사용할 수 있습니다.SUSTR 방법은 확실히 빠른 전체 인덱스 스캔을 사용할 수 있지만, 최적화 프로그램이 범위 스캔을 사용자 자신의 버전에서 가장 잘 테스트할 수 있다고 생각할지는 모르겠습니다. 제 기억으로는 지금은 아니지만 미래에는 서브스트레이트(my_column,1,n)가 특별한 경우로 인식되지 않을 것이라고 누가 말할 수 있을까요?

둘 다 프로파일 할 겁니다하지만 인덱스에서 이진 검색을 사용하기 때문에 'LIKE'가 훨씬 빠를 것으로 예상됩니다(필드가 인덱스된 경우).만약 당신이 SUSTR 방법을 사용한다면, 당신은 Oracle이 함수를 한 행씩 처리해야 하기 때문에, 당신은 결국 전체 테이블 스캔을 하게 될 것입니다.

언급URL : https://stackoverflow.com/questions/1197026/is-substr-or-like-faster-in-oracle

반응형