원격서버와 조인 할 때 loop join 을 반드시 해야하고, join predicate 를 원격서버로 넘겨주고자 할때는 inner remote join 이라고 명시적으로 힌트를 기술하면 된다. 이 힌트는 inner remote loop join 등과 같이 join 방식(loop, merge, hash)을 명시하지 못한다. 왜냐하면 loop join 으로만 풀리기 때문이다. 자세한 내용은 bol 을 참고하길 바란다.
http://technet.microsoft.com/ko-kr/library/ms173815.aspx
데이터 생성 스크립트 remotedb
WITH TEMP AS
(
SELECT TOP 1000000
CAST(ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS INT) IDX
, 'PNAME_'+RIGHT(REPLICATE('0',7)+CAST(CAST(ABS(CHECKSUM(NEWID())) % 1000 AS INT) AS VARCHAR(10)),7)+CHAR(ASCII('A') + ABS(CHECKSUM(NEWID()))%10) PRODUCTNAME
FROM SYS.OBJECTS A1
CROSS JOIN SYS.OBJECTS A2
CROSS JOIN SYS.OBJECTS A3
CROSS JOIN SYS.OBJECTS A4
CROSS JOIN SYS.OBJECTS A5
)
SELECT IDX, PRODUCTNAME, CAST(SUBSTRING(PRODUCTNAME,7,7) AS INT) PRODUCTID
, CAST(ABS(CHECKSUM(NEWID())) % 100 AS INT) SHOPID
, CAST(ABS(CHECKSUM(NEWID())) % 1000000 AS INT) PRICE
, DATEADD(MINUTE, CAST(ABS(CHECKSUM(NEWID())) % 20000 AS INT) * -1, GETDATE()) INSERTTIME
INTO TBLX
FROM TEMP
GO
localdb 데이터 생성 시나리오는 위 쿼리에서 tblx ,y,z 로 이름만 바꾸어서 생성하면 된다.
인덱스 localdb
create clustered index cl_tblx on tblx (idx)
create clustered index cl_tbly on tbly (idx)
create clustered index cl_tblz on tblz (idx)
인덱스 remotedb
create clustered index cl_tblx on tblx (idx)
아래 쿼리는 hash 조인으로 동작한다.
SELECT *
FROM (
SELECT TOP 1000000 A.IDX, C.INSERTTIME
FROM TBLX A
JOIN TBLY B
ON A.IDX = B.IDX
JOIN TBLZ C
ON A.IDX = C.IDX
) LDB
INNER JOIN MINSOUK.REMOTEDB.DBO.TBLX RDB
ON RDB.IDX = LDB.IDX
remotedb 와 inner join 을 하고 싶다고 inner loop join 이라고 명시하면 join predicate 가 사라지고 remote 데이터 전체를 읽어서 local 로 spool 한뒤 join 하려고 한다. 만약, dba 가 outer reference table (local table) 이 매우작고 inner table (remotedb) 이 크다면, 원격 network round trip 을 감수하고 loop join 을 수행하고 join predicate 를 정상적으로 전달 하고자 한다면, 어떻게 해야 할까? 아래와 같이 inner remote join 이라고 명시하면 된다. 아래에서 outer reference table 을 매우크게 만들었는데, 항상 loop join 이 된다는 것과 join predicate 가 항상 전달 된다는 것을 증명하기 위한 것이다.
SELECT *
FROM (
SELECT TOP 1000000 A.IDX, C.INSERTTIME
FROM TBLX A
JOIN TBLY B
ON A.IDX = B.IDX
JOIN TBLZ C
ON A.IDX = C.IDX
) LDB
INNER REMOTE JOIN MINSOUK.REMOTEDB.DBO.TBLX RDB
ON RDB.IDX = LDB.IDX
![](https://t1.daumcdn.net/cfile/tistory/256F304852199FA719)
그리고 다음 강좌는 코너 아저씨의 DQ 강좌 입니다.
http://sqlbits.com/Sessions/Event10/Distributed_Query_Deep_Dive