복붙노트

[SQL] SQL 대 '='성능 '과 같은'

SQL

SQL 대 '='성능 '과 같은'

어떤 약이 질문에 치마가 궁금하네요,하지만 대답은 정확히 언급하지 않습니다.

일반적으로 '='보다 빠른 와일드 카드를 사용하는 경우 '와 같은'것으로 보인다. 이는 기존의 지혜 것으로 보인다. 그러나, 나는 다른 고정 된 하드 코딩, VARCHAR 식별자의 제한된 수를 포함하는 열이, 나는 그들 중 하나와 일치하는 모든 행을 선택한다고 가정 할 수 있습니다 :

select * from table where value like 'abc%'

select * from table where value = 'abcdefghijklmn'

'같이'는 '='전체 문자열을 비교해야하는 반면, 일치하는 항목을 찾기 위해 처음 세 문자를 테스트해야한다. 이 경우 다른 모든 조건이 동일 '처럼'이점을 가지고 것을 나에게 보인다.

이것은 일반적으로, 학문 질문으로 구성, 그래서 어떤 DB를 문제가되지해야하지만, SQL 서버 2005를 사용하여 발생한다.

해결법

  1. ==============================

    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. ==============================

    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. ==============================

    3.인덱스를 무시합니다 일부 SQL의 맛을 같이 사용하는 경우도 있다는 사실을 숙지하고, 그 성능을 죽일 것이다. 당신이 당신의 예와 같이 패턴 "로 시작"를 사용하지 않는 경우에 주로 적용된다.

    인덱스를 무시합니다 일부 SQL의 맛을 같이 사용하는 경우도 있다는 사실을 숙지하고, 그 성능을 죽일 것이다. 당신이 당신의 예와 같이 패턴 "로 시작"를 사용하지 않는 경우에 주로 적용된다.

    당신은 정말 쿼리에 대한 실행 계획을보고, 가능한 한 작은 추측 무엇을하고있어 볼 수 있습니다.

    이 존재는 패턴 캔 "로 시작"과는 SQL 서버에 최적화되어있다. 이 테이블 인덱스를 사용합니다. EF 4.0이 매우 이유로 StartsWith에 대한 좋아 전환했다.

  4. ==============================

    4.값이 인덱싱되지 않은 경우, 테이블 주사 두 결과. 이 시나리오의 성능 차이는 무시할 수있을 것입니다.

    값이 인덱싱되지 않은 경우, 테이블 주사 두 결과. 이 시나리오의 성능 차이는 무시할 수있을 것입니다.

    인덱스 값이되면 다니엘 그의 의견에서 지적한 바와 같이, 상기는 = O (N 로그) 성능이다 인덱스 룩업 될 것이다. 등 것 - 인덱스의 부분 스캔 결과 (가장 가능성이 방법에 따라 선택)> = 'ABC'및 =보다 더 많은 노력을 필요 < 'ABD'.

    참고 내가 여기에 SQL 서버를 이야기하고있는 것을 - 모든 DBMS를 같은 좋은 것입니다.

  5. ==============================

    5.당신은 잘못된 질문을하고 있습니다. 데이터베이스에 문제가 항상 표현의 SARGability 및 전체 쿼리의 coverability이다 운영자 성능이 아닙니다. 운영자 자체의 성능은 크게 관계가 없습니다.

    당신은 잘못된 질문을하고 있습니다. 데이터베이스에 문제가 항상 표현의 SARGability 및 전체 쿼리의 coverability이다 운영자 성능이 아닙니다. 운영자 자체의 성능은 크게 관계가 없습니다.

    그럼, 어떻게 LIKE와 =는 SARGability의 측면에서 비교합니까? LIKE 표현식와 함께 사용하면 일정으로 시작하지 않는 (예. LIKE '% 뭔가'를 사용하는 경우) 정의 비 SARGabale입니다. 하지만 화장을한다 = 또는 LIKE '뭔가 %'스 SARGable? 대답은 텍스트의 쿼리 거짓말을하지 않는 SQL 성능에 대한 질문과 마찬가지로 번호 만 배포 된 스키마. 인덱스가 그들을 만족시키기 위해 존재하는 경우이 표현은 스 SARGable 수 있습니다.

    그래서 진실은 = 및 LIKE 사이의 작은 차이가, 이야기한다. 그러나 하나의 운영자 또는 다른 운전자가 SQL에서 '빠른'여부를 묻는 것은 질문처럼 '빠른 빨간 차 또는 파란 차를가는거야?'. 당신은 EB는 엔진 크기와 vechicle 무게에 대한 질문을해야하지 색상에 대한 ... 관계형 테이블을 최적화하는 방법에 대한 접근 질문에,보기에 장소는 일반적으로 인덱스와 WHERE 절 (및 기타 조항에 표현하지만입니다 를 Where로 시작).

  6. ==============================

    6.MySQL은 5.5을 사용하여 개인 예 : 나는 내부는 2 표, 3 백만 행 중 하나와 만 행 일 사이에 가입했다.

    MySQL은 5.5을 사용하여 개인 예 : 나는 내부는 2 표, 3 백만 행 중 하나와 만 행 일 사이에 가입했다.

    아래 (와일드 카드) 인덱스에 같은를 사용하는 경우, 그것은 30 초 걸렸다 :

    where login like '12345678'
    

    '설명'를 사용하여 내가 얻을 :

    에 '='에서 같은 쿼리를 사용하면 0.1 초 걸렸다 :

    where login ='600009'
    

    '설명'사용 내가 얻을 :

    당신이 볼 수 있듯이 쿼리가 300 배 더 많은 시간이 걸렸습니다, 그래서 등 완전히 취소 된 인덱스가 추구합니다.

  7. ==============================

    7.어쩌면 당신은 전체 텍스트 검색에 대해 찾고 있습니다.

    어쩌면 당신은 전체 텍스트 검색에 대해 찾고 있습니다.

  8. ==============================

    8.먼저 첫 번째 것들 ,

    먼저 첫 번째 것들 ,

    그들은 항상 동일하지

        select 'Hello' from dual where 'Hello  ' like 'Hello';
    
        select 'Hello' from dual where 'Hello  ' =  'Hello';
    

    일이 항상 동일하지 않을 경우, 성능에 대해 이야기하는 것은 그 관련이 없습니다.

    당신은 문자열 만 문자 변수에서 작업하는 경우, 당신은 성능에 대해 이야기 할 수 있습니다. 그러나 일반적으로 교환 할 수있는 것으로 "="를 같이 사용하지 않습니다.

    (위 및 기타 질문) 많은 글에서 본 것처럼, 경우에 그들은 패턴 매칭으로 인해 느린 등의 성능 (정렬)을 동일한 경우

  9. from https://stackoverflow.com/questions/6142235/sql-like-vs-performance by cc-by-sa and MIT license