ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [SQL Server] ODBC를 통한 Linked Server 사용시 주의사항
    DB & SQL 2017. 5. 23. 23:14
    반응형
    * 해당내용은 SQL Server 2008 버전에서 확인한 사항이므로 최신버전과는 차이가 있을 수 있습니다.

     

    SQL Server 에는 다른 네트워크상에 있는 SQL 엔진과 연결하여 데이터를 가져오는 "연결된 서버(Linked Server)" 라는 기능이 있다. Linked Server의 설정방법은 여러가지가 있는데 크게 같은 MSSQL인가? 아닌가로 나뉜다. MSSQL간의 연결이라하면 직접 연결정보를 넣는가 아니면 서버명을 넣는가? 등등 방법이 세분화되지만, 그렇지 않은 DB엔진은 Linked Server로 쓰고자 한다면 ODBC를 찾게 될 것이다.

     

    ODBC를 이용한 이기종간 Linked Server 구성에 대해 알아보러 오신 분들은 http://sqlmvp.tistory.com/1072 를 참조하시면 되겠다. (응?)

     

    해당 블로그로 들어가면 SQL Server DBA로 유명하신 강성욱 이사?님께서 귀여운 포즈(?)로 여러분을 반겨주실 것이다. 그림과 내용이 충분하니 구성하는데 어려움은 없을것이라 생각한다. 이것으로 이번 지면은 끝.... 이면 제목에 '주의사항' 적어놓은게 무색해지니 추가적으로 주의해야 할 내용을 작성하겠다.

     

    결론을 먼저 말하자면,

     

    "스키마를 이용한 데이터 조회는 하지말라."

     

    다른 두 가지 방법에 비해 JOIN이나 WHERE 조건 적용이 편하다는 강점이 있기 때문에 쓰는 경우가 종종 있는데, 사람한텐 편할지언정 속도나 트래픽 측면에선 독이다.

     

    아래 쿼리는 MYSQL 이라는 Linked Server에 각기 다른 방법으로 target이란 테이블의 Row 개수를 조회하는 쿼리이다.

    -- 테스트 쿼리 --
    SELECT * FROM openquery(MYSQL, 'select count(*) from target'); -- openquery를 이용한 조회쿼리.
    SELECT COUNT(*) FROM MYSQL...target; -- 스키마를 이용한 죽일놈의 조회쿼리
    execute ('select count(*) from target') at MYSQL; -- execute를 이용한 조회쿼리
    -----------------

    openquery로 조회를 하게 되면, target 서버인 MySQL에는 다음과 같은 쿼리가 전달된다.

     

    [그림 1] openquery를 이용한 조회

     

    죽일놈을 보기전에, execute를 이용한 조회쿼리를 전달했을 때 내용을 먼저보도록 하자.

    [그림 2] execute를 이용한 조회

     

    대망의 스키마 방식이다.

    [그림 3] 스키마를 이용한 조회

     

    봤는가? select * from target을 날리는 위엄을. count 뿐만이 아니다. where 조건 order by, group by, join 등등등... 모두 스키마 방식 앞에선 평등해진다. 다른 2개의 방식과 달리 스키마 방식은 select * from 을 통해 데이터를 모두 가져와서, source 서버인 MSSQL에서 조건을 적용하게된다.

     

    target의 데이터의 양이 적고, 증가하지 않는다면 파라메터에 대해 string 변환없이 그대로 쓸 수 있는 스키마방식을 사용하는 것도 나쁘지 않지만, 데이터의 양이 적고, 증가하지 않는 target 테이블이라면 그냥 전체조회해서 temp DB에 넣은 뒤 쓰는 것과 차이가 전혀 없으니 그냥 쓰지말자.

     

    SQL Native Client에선 써도 되니 안심하라구~

     

    이것으로 ODBC를 연결한 Linked Server 조회시 유의사항을 살펴보았다.

    반응형

    댓글

Designed by Tistory.