복붙노트

[SQL] SQL 서버 - 쿼리 단락?

SQL

SQL 서버 - 쿼리 단락?

SQL Server 지원에서 할 수있는 T-SQL 쿼리는 단락?

예를 들어, 나는 두 개의 데이터베이스를 가지고 상황을 가지고 있고 나는 일치를 통해 일부 정보를 복사하는 두 테이블간에 데이터를 비교하고있다. 하나 개의 테이블에서 "ID"필드는 항상 (예 : "000000001234"와 같은) 0을 선도하는 것, 다른 테이블에서 ID 필드는 나 ( "1234", "000000001234"을 수 또는 수) 앞에 0이있을 수도 있고 없을 수도 있습니다.

두에 맞게 내 쿼리 그래서 같은 것입니다 : 표에서 선택 * 어디 table1.ID LIKE '% 1234'

속도 일까지, 나는 또는 그와 같은 단지 말한다 전에 추가 생각 해요 : table1.ID = table2.ID 두 아이디의이 패딩 0을 가지고 동일한 경우를 처리합니다.

은 "="의 항목을 일치하고 (그것을 단락 것 등을 생략) 모든 단일 행에 대해 등을 평가하지 않음으로써 쿼리 속도를 그렇게 것인가?

해결법

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

    1.SQL Server는 NOT 짧은 곳 회로 조건을 수행합니다. 그렇지는 비용 기반의 시스템이기 때문에 할 수있는 방법 : SQL 서버 단락 WHERE 조건을 평가.

    SQL Server는 NOT 짧은 곳 회로 조건을 수행합니다. 그렇지는 비용 기반의 시스템이기 때문에 할 수있는 방법 : SQL 서버 단락 WHERE 조건을 평가.

  2. ==============================

    2.당신은 테이블에 계산 열을 추가 할 수 있습니다. 이어서, 지수 계산 열 및 열 조인의 해당 용도.

    당신은 테이블에 계산 열을 추가 할 수 있습니다. 이어서, 지수 계산 열 및 열 조인의 해당 용도.

    전의:

    Alter Table Table1 Add PaddedId As Right('000000000000' + Id, 12)
    Create Index idx_WhateverIndexNameYouWant On Table1(PaddedId)
    

    그런 다음 쿼리는 것 ...

    select * from table1 where table1.PaddedID ='000000001234'
    

    이것은 단지 신속하게 행을 반환하기 위해 만든 인덱스를 사용합니다.

  3. ==============================

    3.당신은 확실히 테이블 중 적어도 하나는 ID에 대해 실제 데이터 형식을 사용하고 있는지 그리고 가능하면 인덱스가 추구 사용할 수 있는지 확인하고 싶다. 그것은 당신의 쿼리의 선택도 및 다른 변환해야하는 하나의 결정하지만 경기의 속도에 따라 달라집니다. 당신은 전체 첫 번째 테이블을 스캔 할 것을 알고 있다면, 당신은 어쨌든 추구 사용할 수 없으며 다른 테이블의 데이터 유형에 해당 ID를 변환해야합니다.

    당신은 확실히 테이블 중 적어도 하나는 ID에 대해 실제 데이터 형식을 사용하고 있는지 그리고 가능하면 인덱스가 추구 사용할 수 있는지 확인하고 싶다. 그것은 당신의 쿼리의 선택도 및 다른 변환해야하는 하나의 결정하지만 경기의 속도에 따라 달라집니다. 당신은 전체 첫 번째 테이블을 스캔 할 것을 알고 있다면, 당신은 어쨌든 추구 사용할 수 없으며 다른 테이블의 데이터 유형에 해당 ID를 변환해야합니다.

    당신이 인덱스를 사용할 수 있는지 확인하기 위해, 또한 LIKE을 피하십시오. 예를 들어, 그것은이 훨씬 낫다 :

    WHERE
         T1.ID = CAST(T2.ID AS VARCHAR) OR
         T1.ID = RIGHT('0000000000' + CAST(T2.ID AS VARCHAR), 10)
    

    보다:

    WHERE
         T1.ID LIKE '%' + CAST(T2.ID AS VARCHAR)
    

    스티븐 A. 로우가 언급 한 바와 같이, 두 번째 쿼리가 부정확 할뿐만 아니라 수 있습니다.

    (즉 왼쪽 외부가 T2에 가입)하지만 당신은 T1에서 모든 행을 사용하려고하는 경우에 당신은 더 나을 수 있습니다 :

    WHERE
         CAST(T1.ID AS INT) = T2.ID
    

    확실하지 않은 및 가장 적합한 보면 각 방법 몇 가지 쿼리 계획을 수행하십시오.

    다른 사람이 제안하고 모든 가능한에서의 경우와 일치하도록 테이블의 데이터 유형을 변경 한으로하지만 갈 절대 최선의 경로입니다. 이 프로젝트로 인해 전에 당신이 그것을 할 수없는 경우에도, 가까운 미래에 당신의 "할"목록에 넣어.

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

    4.방법에 대한

    방법에 대한

    table1WithZero.ID = REPLICATE('0', 12-len(table2.ID))+table2.ID
    

    이 경우, 수 표에 인덱스를 사용한다

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

    5.이런 경우에는 유용 ​​믈라덴 Prajdic 응답에 링크 된 페이지의 설명에, CASE 절은 단락 회로 평가입니다.

    이런 경우에는 유용 ​​믈라덴 Prajdic 응답에 링크 된 페이지의 설명에, CASE 절은 단락 회로 평가입니다.

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

    6.ID가 (귀하의 예제와 같은) 순전히 숫자 인 경우, 내가 대신 숫자 유형에 해당 필드를 변경 (가능한 경우) 권하고있다. 데이터베이스가 사용 allready 경우는 비록 유형을 변경하기 어려울 수 있습니다.

    ID가 (귀하의 예제와 같은) 순전히 숫자 인 경우, 내가 대신 숫자 유형에 해당 필드를 변경 (가능한 경우) 권하고있다. 데이터베이스가 사용 allready 경우는 비록 유형을 변경하기 어려울 수 있습니다.

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

    7.일관성을 위해 데이터베이스를 수정

    일관성을 위해 데이터베이스를 수정

    select * from table1 where table1.ID LIKE '%1234'
    

    '1234'일치 '01234', '00000000001234'뿐만 아니라 '999991234'. LIKE 꽤 많은 보장을 인덱스 스캔을 사용하여 (table1.ID 인덱싱 가정!). 데이터를 정리하면 성능이 크게 향상됩니다.

    데이터를 정리하는 것이 가능하지 않은 경우, 예를 들어 앞의 0을 없애기 사용자 정의 기능 (UDF)를 작성

    select * from table1 where dbo.udfStripLeadingZeros(table1.ID) = '1234'
    

    (함수가 각 행에 대해 실행해야합니다 이후)이 성능이 향상되지 수 있지만 그것은 잘못된 일치를 제거하고 쿼리의 의도가 더 분명 할 것

    편집 :이 가능한 경우 정수로 CAST 톰 H의 제안이 가장 좋은 것입니다.

  8. from https://stackoverflow.com/questions/381224/sql-server-query-short-circuiting by cc-by-sa and MIT license