[SQL] SQL 서버 - 쿼리 단락?
SQLSQL 서버 - 쿼리 단락?
SQL Server 지원에서 할 수있는 T-SQL 쿼리는 단락?
예를 들어, 나는 두 개의 데이터베이스를 가지고 상황을 가지고 있고 나는 일치를 통해 일부 정보를 복사하는 두 테이블간에 데이터를 비교하고있다. 하나 개의 테이블에서 "ID"필드는 항상 (예 : "000000001234"와 같은) 0을 선도하는 것, 다른 테이블에서 ID 필드는 나 ( "1234", "000000001234"을 수 또는 수) 앞에 0이있을 수도 있고 없을 수도 있습니다.
두에 맞게 내 쿼리 그래서 같은 것입니다 : 표에서 선택 * 어디 table1.ID LIKE '% 1234'
속도 일까지, 나는 또는 그와 같은 단지 말한다 전에 추가 생각 해요 : table1.ID = table2.ID 두 아이디의이 패딩 0을 가지고 동일한 경우를 처리합니다.
은 "="의 항목을 일치하고 (그것을 단락 것 등을 생략) 모든 단일 행에 대해 등을 평가하지 않음으로써 쿼리 속도를 그렇게 것인가?
해결법
-
==============================
1.SQL Server는 NOT 짧은 곳 회로 조건을 수행합니다. 그렇지는 비용 기반의 시스템이기 때문에 할 수있는 방법 : SQL 서버 단락 WHERE 조건을 평가.
SQL Server는 NOT 짧은 곳 회로 조건을 수행합니다. 그렇지는 비용 기반의 시스템이기 때문에 할 수있는 방법 : SQL 서버 단락 WHERE 조건을 평가.
-
==============================
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.당신은 확실히 테이블 중 적어도 하나는 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.방법에 대한
방법에 대한
table1WithZero.ID = REPLICATE('0', 12-len(table2.ID))+table2.ID
이 경우, 수 표에 인덱스를 사용한다
-
==============================
5.이런 경우에는 유용 믈라덴 Prajdic 응답에 링크 된 페이지의 설명에, CASE 절은 단락 회로 평가입니다.
이런 경우에는 유용 믈라덴 Prajdic 응답에 링크 된 페이지의 설명에, CASE 절은 단락 회로 평가입니다.
-
==============================
6.ID가 (귀하의 예제와 같은) 순전히 숫자 인 경우, 내가 대신 숫자 유형에 해당 필드를 변경 (가능한 경우) 권하고있다. 데이터베이스가 사용 allready 경우는 비록 유형을 변경하기 어려울 수 있습니다.
ID가 (귀하의 예제와 같은) 순전히 숫자 인 경우, 내가 대신 숫자 유형에 해당 필드를 변경 (가능한 경우) 권하고있다. 데이터베이스가 사용 allready 경우는 비록 유형을 변경하기 어려울 수 있습니다.
-
==============================
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의 제안이 가장 좋은 것입니다.
from https://stackoverflow.com/questions/381224/sql-server-query-short-circuiting by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 위한 SQL 구문 용어 WHERE (COL1, COL2) <(VAL1, val2만큼) ' (0) | 2020.05.27 |
---|---|
[SQL] 포스트 그레스 테이블 컬럼의 디폴트 값을 얻을? (0) | 2020.05.27 |
[SQL] 입력 매개 변수의 개수 함수 (0) | 2020.05.27 |
[SQL] 어떻게 엑셀 VBA에서 두 개의 서로 다른 데이터 소스에서 생성 된 두 개의 레코드를 가입 (0) | 2020.05.27 |
[SQL] 매개 변수를 사용하여 ASP.NET ODBC 쿼리 (0) | 2020.05.27 |