SQL Server 원격 데이터 소스에 쿼리하기
참고 문서
- Querying remote data sources in SQL Server
- MSSQL OPENROWSET, OPENDATASOURCE, OPENQUERY와 Linked Server 성능, 장단점, 원격 접속 방법
원격 데이터 소스 액세스 허용하기
Ad Hoc Distributed Queries를 허용하기 위해 다음과 같이 실행한다.
EXEC sp_configure 'show advanced options', 1
RECONFIGURE
GO
EXEC sp_configure 'ad hoc distributed queries', 1
RECONFIGURE
GO
OPENDATASOURCE
다른 SQL Server 머신의 CharacterDb의 Characters 테이블에 쿼리하는 예시는 다음과 같다.
SELECT TOP 100 * FROM OPENDATASOURCE('SQLNCLI', 'Server=ServerHostname,1433;UID=uid;PWD=pwd').CharacterDb.dbo.Characters
OPENROWSET
다음과 같은 방법으로, OPENROWSET을 사용하는 방법이 있다.
SELECT * FROM OPENROWSET('SQLNCLI', 'Server=ServerHostname,1433;UID=uid;PWD=pwd', 'SELECT TOP 100 * FROM CharacterDb.dbo.Characters(NOLOCK)')
OPENQUERY with Linked Server
Linked Server 추가하기
Linked Server를 추가하는 방법은 여러가지가 있다. 아래는 그 중 한가지 방법이다. 다른 방법들은 링크의 참고 문서를 참고한다.
EXEC master.dbo.sp_addlinkedserver
@server=N'ServerHostname,1433',
@srvproduct=N'SQL Server'
EXEC master.dbo.sp_addlinkedsrvlogin
@rmtsrvname=N'ServerHostname,1433',
@rmtuser=N'uid',
@rmtpassword=N'pwd'
@useself=N'False',
@locallogin=NULL
OPENQUERY
추가한 Linked Server로 OPENQUERY를 이용할 수 있다.
SELECT * FROM OPENQUERY([ServerHostname,1433], 'SELECT TOP 100 * FROM CharacterDb.dbo.Characters(NOLOCK)')
Four Part with Linked Server
Four Part 쿼리는 ServerName.DatabaseName.SchemaName.ObjectName의 형식의 리소스 표현을 사용하는 쿼리를 말한다.
이 방식은 다음과 같은 모습을 한다.
SELECT TOP 100 * FROM [ServerName,1433].CharacterDb.dbo.Characters
성능 비교 설명
링크된 글들을 참고하였을 때, 다음과 같은 순으로 빠른 것으로 보인다. (실제 테스트를 통해 확인된 것이 아니고 참고글을 해석한 것이므로 정확하지 않을 수 있다. 참고.)
OPENQUERY > Four Part 를 이용한 Linked Server 방식 > OPENROWSET > OPENDATASOURCE
OPENDATASOURCE는 매번 연결을 맺고, 원격 서버에서 정보(sp_tableinfo_rowset, sp_columns_rowset, sp_index_rowset 등)를 가져와서 쿼리를 최적화 후 원격서버에 보내는 방식이므로 제일 느리다.
Four Part를 이용한 Linked Server 방식은 연결을 매번 맺진 않지만, 원격 서버에서 정보를 가져와 쿼리를 최적화 후 원격서버에 보내는 방식이므로 상대적으로 느린 면이 있다.
OPENROWSET은 매번 연결을 맺지만, 실행 및 쿼리 최적화를 원격 서버에서 하고 데이터만 가져오기 때문에 역시 상대적으로 느린 면이 있다.
OPENQUERY는 Linked Server를 이용해 연결을 매번 맺지도 않고, 쿼리를 원격 서버에 보내서 처리하므로 가장 효율적이고 빠르다.