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 및 =의 성능:이러한 모든 경우 쿼리 최적화 도구는 같은 절을 =로 자동 변환합니다.그리고 이는 쿼리 계획에서 분명하게 확인할 수 있습니다(첨부된 스크린샷을 참조하십시오)따라서 이 경우 성능은 정확히 같아야 합니다.쿼리 옵티마이저 덕분입니다!
저는 두 쿼리의 실행 계획 스크린샷을 제공합니다. 즉, %를 제외하고 %를 포함하지 않고 %를 포함한 쿼리를 제공합니다.
언급URL : https://stackoverflow.com/questions/134456/any-performance-impact-in-oracle-for-using-like-string-vs-string
'IT' 카테고리의 다른 글
CSS 삼각형은 어떻게 작동합니까? (0) | 2023.06.27 |
---|---|
명령행에서 직접 iOS 기기에서 반응 네이티브 애플리케이션을 실행하시겠습니까? (0) | 2023.06.27 |
조건부 JOIN 문 SQL Server (0) | 2023.06.27 |
Gitrebase 치명적:단일 수정본 필요함 (0) | 2023.06.27 |
여러 행을 하나의 열로 쉼표로 구분할 수 있습니까? (0) | 2023.06.27 |