[SQL] SQL 대 '='성능 '과 같은'
SQLSQL 대 '='성능 '과 같은'
어떤 약이 질문에 치마가 궁금하네요,하지만 대답은 정확히 언급하지 않습니다.
일반적으로 '='보다 빠른 와일드 카드를 사용하는 경우 '와 같은'것으로 보인다. 이는 기존의 지혜 것으로 보인다. 그러나, 나는 다른 고정 된 하드 코딩, VARCHAR 식별자의 제한된 수를 포함하는 열이, 나는 그들 중 하나와 일치하는 모든 행을 선택한다고 가정 할 수 있습니다 :
select * from table where value like 'abc%'
과
select * from table where value = 'abcdefghijklmn'
'같이'는 '='전체 문자열을 비교해야하는 반면, 일치하는 항목을 찾기 위해 처음 세 문자를 테스트해야한다. 이 경우 다른 모든 조건이 동일 '처럼'이점을 가지고 것을 나에게 보인다.
이것은 일반적으로, 학문 질문으로 구성, 그래서 어떤 DB를 문제가되지해야하지만, SQL 서버 2005를 사용하여 발생한다.
해결법
-
==============================
1.https://web.archive.org/web/20150209022016/http://myitforum.com/cs2/blogs/jnelson/archive/2007/11/16/108354.aspx 참조
https://web.archive.org/web/20150209022016/http://myitforum.com/cs2/blogs/jnelson/archive/2007/11/16/108354.aspx 참조
거기에서 견적 :
-
==============================
2.그것은 측정 가능한 차이이다.
그것은 측정 가능한 차이이다.
다음을 실행합니다 :
Create Table #TempTester (id int, col1 varchar(20), value varchar(20)) go INSERT INTO #TempTester (id, col1, value) VALUES (1, 'this is #1', 'abcdefghij') GO INSERT INTO #TempTester (id, col1, value) VALUES (2, 'this is #2', 'foob'), (3, 'this is #3', 'abdefghic'), (4, 'this is #4', 'other'), (5, 'this is #5', 'zyx'), (6, 'this is #6', 'zyx'), (7, 'this is #7', 'zyx'), (8, 'this is #8', 'klm'), (9, 'this is #9', 'klm'), (10, 'this is #10', 'zyx') GO 10000 CREATE CLUSTERED INDEX ixId ON #TempTester(id)CREATE CLUSTERED INDEX ixId ON #TempTester(id) CREATE NONCLUSTERED INDEX ixTesting ON #TempTester(value)
그때:
SET SHOWPLAN_XML ON
그때:
SELECT * FROM #TempTester WHERE value LIKE 'abc%' SELECT * FROM #TempTester WHERE value = 'abcdefghij'
첫 번째 작업의 비용은 LIKE 비교, 약 10 배 이상 비싼 = 비교보다 것을 그 결과 실행 계획을 보여줍니다.
당신이 = 비교를 사용할 수 있다면 그렇게하십시오.
-
==============================
3.인덱스를 무시합니다 일부 SQL의 맛을 같이 사용하는 경우도 있다는 사실을 숙지하고, 그 성능을 죽일 것이다. 당신이 당신의 예와 같이 패턴 "로 시작"를 사용하지 않는 경우에 주로 적용된다.
인덱스를 무시합니다 일부 SQL의 맛을 같이 사용하는 경우도 있다는 사실을 숙지하고, 그 성능을 죽일 것이다. 당신이 당신의 예와 같이 패턴 "로 시작"를 사용하지 않는 경우에 주로 적용된다.
당신은 정말 쿼리에 대한 실행 계획을보고, 가능한 한 작은 추측 무엇을하고있어 볼 수 있습니다.
이 존재는 패턴 캔 "로 시작"과는 SQL 서버에 최적화되어있다. 이 테이블 인덱스를 사용합니다. EF 4.0이 매우 이유로 StartsWith에 대한 좋아 전환했다.
-
==============================
4.값이 인덱싱되지 않은 경우, 테이블 주사 두 결과. 이 시나리오의 성능 차이는 무시할 수있을 것입니다.
값이 인덱싱되지 않은 경우, 테이블 주사 두 결과. 이 시나리오의 성능 차이는 무시할 수있을 것입니다.
인덱스 값이되면 다니엘 그의 의견에서 지적한 바와 같이, 상기는 = O (N 로그) 성능이다 인덱스 룩업 될 것이다. 등 것 - 인덱스의 부분 스캔 결과 (가장 가능성이 방법에 따라 선택)> = 'ABC'및 =보다 더 많은 노력을 필요 < 'ABD'.
참고 내가 여기에 SQL 서버를 이야기하고있는 것을 - 모든 DBMS를 같은 좋은 것입니다.
-
==============================
5.당신은 잘못된 질문을하고 있습니다. 데이터베이스에 문제가 항상 표현의 SARGability 및 전체 쿼리의 coverability이다 운영자 성능이 아닙니다. 운영자 자체의 성능은 크게 관계가 없습니다.
당신은 잘못된 질문을하고 있습니다. 데이터베이스에 문제가 항상 표현의 SARGability 및 전체 쿼리의 coverability이다 운영자 성능이 아닙니다. 운영자 자체의 성능은 크게 관계가 없습니다.
그럼, 어떻게 LIKE와 =는 SARGability의 측면에서 비교합니까? LIKE 표현식와 함께 사용하면 일정으로 시작하지 않는 (예. LIKE '% 뭔가'를 사용하는 경우) 정의 비 SARGabale입니다. 하지만 화장을한다 = 또는 LIKE '뭔가 %'스 SARGable? 대답은 텍스트의 쿼리 거짓말을하지 않는 SQL 성능에 대한 질문과 마찬가지로 번호 만 배포 된 스키마. 인덱스가 그들을 만족시키기 위해 존재하는 경우이 표현은 스 SARGable 수 있습니다.
그래서 진실은 = 및 LIKE 사이의 작은 차이가, 이야기한다. 그러나 하나의 운영자 또는 다른 운전자가 SQL에서 '빠른'여부를 묻는 것은 질문처럼 '빠른 빨간 차 또는 파란 차를가는거야?'. 당신은 EB는 엔진 크기와 vechicle 무게에 대한 질문을해야하지 색상에 대한 ... 관계형 테이블을 최적화하는 방법에 대한 접근 질문에,보기에 장소는 일반적으로 인덱스와 WHERE 절 (및 기타 조항에 표현하지만입니다 를 Where로 시작).
-
==============================
6.MySQL은 5.5을 사용하여 개인 예 : 나는 내부는 2 표, 3 백만 행 중 하나와 만 행 일 사이에 가입했다.
MySQL은 5.5을 사용하여 개인 예 : 나는 내부는 2 표, 3 백만 행 중 하나와 만 행 일 사이에 가입했다.
아래 (와일드 카드) 인덱스에 같은를 사용하는 경우, 그것은 30 초 걸렸다 :
where login like '12345678'
'설명'를 사용하여 내가 얻을 :
에 '='에서 같은 쿼리를 사용하면 0.1 초 걸렸다 :
where login ='600009'
'설명'사용 내가 얻을 :
당신이 볼 수 있듯이 쿼리가 300 배 더 많은 시간이 걸렸습니다, 그래서 등 완전히 취소 된 인덱스가 추구합니다.
-
==============================
7.어쩌면 당신은 전체 텍스트 검색에 대해 찾고 있습니다.
어쩌면 당신은 전체 텍스트 검색에 대해 찾고 있습니다.
-
==============================
8.먼저 첫 번째 것들 ,
먼저 첫 번째 것들 ,
그들은 항상 동일하지
select 'Hello' from dual where 'Hello ' like 'Hello'; select 'Hello' from dual where 'Hello ' = 'Hello';
일이 항상 동일하지 않을 경우, 성능에 대해 이야기하는 것은 그 관련이 없습니다.
당신은 문자열 만 문자 변수에서 작업하는 경우, 당신은 성능에 대해 이야기 할 수 있습니다. 그러나 일반적으로 교환 할 수있는 것으로 "="를 같이 사용하지 않습니다.
(위 및 기타 질문) 많은 글에서 본 것처럼, 경우에 그들은 패턴 매칭으로 인해 느린 등의 성능 (정렬)을 동일한 경우
from https://stackoverflow.com/questions/6142235/sql-like-vs-performance by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] VARCHAR에 캐스트 INT (0) | 2020.04.10 |
---|---|
[SQL] 어떻게 2005 SQL Server의 쉼표로 구분 된 목록으로 여러 행을 결합 할 수 있습니다? (0) | 2020.04.10 |
[SQL] 행의 끝에 '^ M'문자 (0) | 2020.04.10 |
[SQL] 조건 고유 제한 조건 (0) | 2020.04.10 |
[SQL] 나는 SELECT 쿼리에서 계산 필드를 다시 사용할 수 있습니까? (0) | 2020.04.09 |