IT

Oracle에서 LIKE 'string'과 = 'string'을 사용할 때 성능에 어떤 영향을 미칩니까?

itgroup 2023. 6. 27. 22:05
반응형

Oracle에서 LIKE 'string'과 = 'string'을 사용할 때 성능에 어떤 영향을 미칩니까?

이것.

SELECT * FROM SOME_TABLE WHERE SOME_FIELD LIKE '%some_value%';

이것보다 느립니다.

SELECT * FROM SOME_TABLE WHERE SOME_FIELD = 'some_value';

하지만 이것은 어떻습니까?

SELECT * FROM SOME_TABLE WHERE SOME_FIELD LIKE 'some_value';

제가 테스트한 결과 두 번째와 세 번째 예제가 정확히 일치합니다.만약 그게 사실이라면, 제 질문은 왜 "="를 사용하는 걸까요?

데이터 웨어하우징 또는 기타 대량 데이터 작업 이외의 용도로 Oracle에서 사용해야 하는 바인딩 변수를 사용하는 경우에는 분명한 차이가 있습니다.

다음과 같은 경우:

SELECT * FROM SOME_TABLE WHERE SOME_FIELD LIKE :b1

Oracle은 :b1의 값이 '%some_value%' 또는 'some_value' 등인지 알 수 없습니다.실행 시간까지 휴리스틱을 기반으로 결과의 카디널리티를 추정하고 '%A', '%', 'A' 등과 같이 :b의 다양한 값에 적합하거나 적합하지 않을 수 있는 적절한 계획을 수립합니다.

유사한 문제는 동등한 술어에 적용될 수 있지만, 결과적으로 발생할 수 있는 기수 범위는 열 통계나 고유한 제약 조건의 존재를 기반으로 훨씬 쉽게 추정됩니다.

따라서 개인적으로 =의 대체품으로 LIKE를 사용하지는 않을 것입니다.옵티마이저는 때때로 꽤 쉽게 속습니다.

두 가지 모두에 대한 설명 계획을 확인하십시오.이들은 동일한 실행 계획을 생성하므로 데이터베이스에 대해서도 동일한 것입니다.

=를 사용하여 유사성이 아니라 동일성을 검정할 수 있습니다.비교 값을 제어하는 경우에도 큰 차이가 없습니다.사용자가 제출하는 경우 'apple'과 'apple%'는 훨씬 다른 결과를 제공합니다.

만약 그게 사실이라면, 제 질문은 왜 "="를 사용하는 걸까요?

더 나은 질문:그게 사실이라면 왜 "LIKE"를 사용하여 동등성을 테스트합니까?시프트 키를 누르는 것을 절약할 수 있고, 스크립트를 읽는 모든 사람은 혼란스러워집니다.

먹어 봤어요?테스트는 알 수 있는 유일한 확실한 방법입니다.

추가적으로, 이 문들 중 어느 것도 동일한 행을 반환하지 않을 것입니다.사용해 보십시오.

insert into some_table (some_field) values ('some_value');
insert into some_table (some_fieled) values ('1some_value2');
insert into some_table (some_field) values ('some1value');

SELECT * FROM SOME_TABLE WHERE SOME_FIELD LIKE '%some_value%';

SELECT * FROM SOME_TABLE WHERE SOME_FIELD = 'some_value';

SELECT * FROM SOME_TABLE WHERE SOME_FIELD LIKE 'some_value';

명확성과 미묘한 버그를 피하기 위해서는 와일드카드 기능이 필요하지 않는 한 LIKE를 사용하지 않는 것이 좋습니다. (물론, 애드혹 쿼리를 할 때는 괜찮을 것입니다.)

'%Whature%'와 같이 전체 인덱스 검색을 수행해야 합니다.

백분율이 없으면 동등한 역할을 합니다.

%가 한쪽 끝에 있으면 인덱스가 범위 스캔이 될 수 있습니다.

최적화 프로그램이 바인딩된 필드를 어떻게 처리하는지 잘 모르겠습니다.

like와 같은 가 없는 .$%등의 이유로 비용이 동일하다는 것을 발견하는 것은 크게 않습니다.

당신의 애플리케이션이 바인드 변수를 사용해야 하기 때문에 데이비드 앨드리지의 답변이 흥미롭다고 생각합니다.과 함께like '%foobar'인덱스에서 주문을 사용할 수 없습니다.쿼리가 사전 컴파일된 경우 더 많은 인덱스 또는 테이블 전체 검색이 발생합니다.

및버그로 수 를 들어,가 SQL이라는 사용자를 생성할 수 ).'joh$')

왜 위험을 감수합니까? '='더 명확하고 그런 문제는 없습니다.

% 및 =은(는) 서로 다른 시나리오에서 사용하도록 제작되었습니다.동일한 절에서 정확한 값으로 검색하여 원하는 결과를 얻을 수 있지만 이러한 모든 시나리오에서 =를 사용해야 합니다.따라서 검색할 정확한 값이 있을 때마다 항상 =를 사용해야 합니다.

검색 절에 %가 제공되지 않을 때마다 like 및 =의 성능:이러한 모든 경우 쿼리 최적화 도구는 같은 절을 =로 자동 변환합니다.그리고 이는 쿼리 계획에서 분명하게 확인할 수 있습니다(첨부된 스크린샷을 참조하십시오)따라서 이 경우 성능은 정확히 같아야 합니다.쿼리 옵티마이저 덕분입니다!

저는 두 쿼리의 실행 계획 스크린샷을 제공합니다. 즉, %를 제외하고 %를 포함하지 않고 %를 포함한 쿼리를 제공합니다.

like Cluase with % query execution plan

like clause without % query execution plan

언급URL : https://stackoverflow.com/questions/134456/any-performance-impact-in-oracle-for-using-like-string-vs-string

반응형