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_FIELD
LIKE 버전은 인덱스를 사용할 수 있지만, 이 경우 최적화 도구의 카디널리티 추정치는 일반적으로 상당히 낮으므로 유용할 때 인덱스를 사용하지 않거나 테이블 스캔이 선호될 때 인덱스를 사용할 가능성이 높습니다.실제 식을 인덱싱하면 최적화 도구에서 작업할 수 있는 정보가 훨씬 많아지므로 인덱스를 올바르게 선택할 가능성이 훨씬 높아집니다.저보다 똑똑한 사람이 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%'
여기에는 두 가지 문제가 있습니다.
- Oracle은 어느 것에 대해 보다 정확한 카디널리티와 비용 추정치를 산출합니까?
- 어떤 방법이 잠재적인 접근 방법의 측면에서 더 유연합니까?
버전에 따라 다를 수 있지만 두 가지 모두 테스트하기가 매우 쉬우며 사용 중인 버전과 데이터에 대한 최상의 정보를 얻을 수 있습니다.
다음을 사용하여 두 쿼리에 대한 실행 계획 실행...
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
'IT' 카테고리의 다른 글
PL/SQL에서 커서를 루프하는 FETCH/FOR 간의 차이 (0) | 2023.07.07 |
---|---|
JSON을 Firebase에서 Java 개체로 전환할 때 "유형으로 바운스하지 못했습니다"가 표시되는 이유는 무엇입니까? (0) | 2023.07.02 |
DBMS_Scheduler.DROP_JOB(있는 경우에만 해당) (0) | 2023.07.02 |
치명적 오류 "안전하지 않은 저장소('/home/repon'은 다른 사용자 소유)" (0) | 2023.07.02 |
스프링 부트 및 SAML 2.0 (0) | 2023.07.02 |