블로그 이미지
010-9967-0955 보미아빠

카테고리

보미아빠, 석이 (500)
밥벌이 (16)
싸이클 (1)
일상 (1)
Total
Today
Yesterday

달력

« » 2024.5
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

공지사항

최근에 올라온 글

inner remote join

카테고리 없음 / 2013. 8. 25. 15:09

원격서버와 조인 할 때 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

 

 

 

 

그리고 다음 강좌는 코너 아저씨의 DQ 강좌 입니다.

http://sqlbits.com/Sessions/Event10/Distributed_Query_Deep_Dive

 

 

 

Posted by 보미아빠
, |

최근에 달린 댓글

최근에 받은 트랙백

글 보관함