2016-06-14 4 views
1

연결된 서버를 통해 조인해야하는 테이블이 두 개 있지만 현재 원본 데이터에 문제가 있습니다.다른 데이터 형식의 두 열을 비교하는 가장 빠른 방법

가입해야하는 열 이름은 각각 account_numbermember_number입니다.

내 문제가 account_numbervarchar(10)이며 항상 앞에 0으로 채워되어 있지만 member_numbervarchar(12) (마지막 2가 사용되지 않습니다 왜 요구하지 않는다)하지만, 앞에 0으로 채워되지 않습니다. 우리가 account_numberA에 있으며 member_numberB에, 나는 다음과 같은 해결책을 온 것을 말한다면

:

SELECT * FROM 
    A INNER JOIN B 
    ON CAST(A.account_number AS BIGINT) = CAST(B.member_number AS BIGINT) 

SELECT * FROM 
    A INNER JOIN B 
    ON A.account_number = RIGHT('0000000000'+B.member_number, 10) 

문제는 그들이 슈퍼 슬로우 있다는 것입니다 !

함수가 테이블 스캔을 강제해야한다는 사실이 틀림 없지만이 작업에 대해 더 이상 확신 할 수 없습니다. 이 비교를 더 빨리 할 수있는 방법이 있습니까? 어쩌면 like 또는 일부 변형이 있습니까?

+0

원격 서버의 통계에 액세스 할 수있는 권한이 충분하지 않다고 생각하십니까? 어떤 버전의 SQL Server? –

+0

@MitchWheat 이것은 SQL Server 2012 – LukeP

+0

서비스 팩입니까? ... –

답변

3

가장 빠른 방법은 동일한 유형의 계산 된 열을 만든 다음 해당 열에 인덱스를 작성하는 것입니다. 같은 뭔가 :

alter table b add account_number as (RIGHT('0000000000'+B.member_number, 10)); 

create index b_acount_number on b(account_number); 

는 다음과 같은 쿼리를 실행

아마 당신이 얻을 수있는 가장 빠른
SELECT * 
FROM A INNER JOIN 
    B 
    ON A.account_number = b.account_number; 

.

+0

계산 된 열을 유지해야합니다. – FLICKER

+2

@FLICKER. . . 부정확 한 경우에만 열을 영구적으로 선언해야합니다. 부동 소수점 숫자를 사용하지 않으므로 정확한 것으로 보이며 따라서 색인의 키로 사용할 수 있습니다. 그러나 목표가 열의 색인을 생성하는 것이라면 영구적이라고 선언해도 문제가되지 않습니다. –

+0

당신 말이 맞습니다. 나는 색인을 가지고 있다고 생각했다. 감사 – FLICKER

관련 문제