안녕하세요.
Linked Server사용 하면서 속도 문제가 발생해서 문의 드립니다.
우선 환경은 이렇습니다.
DB서버: MSSQL SERVER 2008
DB1, DB2(Linked Server) 이렇게 있습니다.
아래는 문의 드릴 내용입니다.
DB1에서 DB2의 회원 데이터를 조회해서 가져옵니다.
DB2의 회원테이블은 정상회원 테이블과 휴면계정 테이블로 나눠져 있습니다.
DB2의 회원정보 조회시에 정상회원 테이블과 휴면계정 테이블을 같이 조회해야 해서 union으로 뷰를 만들었는데 속도가 너무 느리네요.
뷰에 인덱스를 만들수 있다고 해서 시도해 봤지만 union이나 full outer join이 뷰에 들어가 있어서 인덱스도 걸수가 없더라구요.
데이터 건수는 정상회원 테이블은 7만건 , 휴면계정 테이블은 30만건 정도 됩니다.
속도 개선을 위해서 할 수 있는 방법이 뭐가 있을까요?
고수님들의 답변 부탁합니다. 꾸벅~
감사합니다.
Comment 6
-
minsouk
2016.02.18 11:45
따로 두번 조회해서 구하면 좋겠구요 혹 인덱스가 있음에도 권한이 없어 통계를 못봐 사용하지 못한다면 inner remote join 과 같은 쿼리힌트를 명시적으로 주거나 openquery 쓰면 쉽게 해결이 가능해 보입니다 -
군고구마
2016.02.18 14:03
http://tofriendy.tistory.com/26
이글이 도움이 되실지 모르겠네요.
-
디비로
2016.02.18 15:10
두번 조회하기기 애매한 쿼리들이 있습니다. 해당 뷰를 사용하는 쿼리도 굉장히 많구요.대략적인 소스를 아래에 참조하였습니다.아래와 같은 쿼리의 속도를 개선하려면 어떤 방법이 있을까요?openquery도 사용해 봤는데 해당 쿼리에서는 큰 차이가 없었었습니다.현재 뷰가 이렇게 되어있습니다.CREATE VIEW [dbo].[vw_Tb_Member_total]ASselect*from(select * from [링크드서버].Tb_Member with(nolock)unionselect * from [링크드서버].Tb_Member_sleep with(nolock)) AGO아래는 vw_Tb_Member_total를 사용하는 쿼리입니다.SELECT TOP 10X.Idx, .......FROMvw_Tb_Member_total XLEFT OUTER JOIN(SELECTSocialNo_C, (ISNULL(COUNT(SocialNo_C), 0)) MileageFROM Tb_TicketLinkMileageWHERE SeasonCode = '27'GROUP BY SocialNo_C ) YONX.SocialNo_C = Y.SocialNo_CWHEREX.Idx IN(SELECT TOP 10A.IdxFROMvw_Tb_Member_total ALEFT OUTER JOIN(SELECTSocialNo_C, (ISNULL(COUNT(SocialNo_C), 0)) MileageFROM Tb_TicketLinkMileageWHERE SeasonCode = '27'GROUP BY SocialNo_C) BON A.SocialNo_C = B.SocialNo_CWHERE1 = 1ORDER BYA.Grade DESC,A.Idx DESC)ORDER BYX.Grade ASC,X.Idx ASC -
Terry
2016.02.18 17:18
뷰 테이블을 사용하고, 해당 뷰가 Linked 서버에 바로 접근해서 사용하게 되니
뷰 테이블의 사용이 많아지면 당연히 속도의 저하는 올듯한데요..
해당 테이블이 아주 빈번히 사용이 되는거라면
하기와 같이 구성하면 어떨런지?
1. batch 형태로, db interface ( 특정시간마다 해당테이블 갱신하는 잡 스케줄러 등재 )
--> 뷰 테이블 삭제 후, 신규 생성 테이블을 뷰 테이블과 동일한 이름으로 설정
--> 다른 쿼리 수정할 필요 없음..
2. 해당 뷰테이블 사용하는 쿼리문 수정
1) 뷰 테이블 최초 select 후, 임시테이블에 데이터 insert
2) 해당 뷰 테이블 참조하는 쿼리문은 임시테이블에 접근해서 데이터 가져오게끔 쿼리문 수정
-
디비로
2016.02.18 19:56
보안상 테이블을 두개로 분리한 것이라 임시의 테이블에 두개 테이블의 데이터를 저장하면 보안에 위배되어서 Terry님이 말씀하신 방법은 안될 것 같습니다.
-
항해자™
2016.02.19 08:37
위에 올리신 쿼리에서 left 조인을 사용할 이유가 없어 보이는데 생략되 부분이 있나요?
그리고 뷰에서 union all을 사용하면 안되나요?
두 테이블간 중복 데이터가 있나요?