SQL Server 원격 데이터 소스에 쿼리하기

smpl published on
2 min, 329 words

Tags: mssql

참고 문서

원격 데이터 소스 액세스 허용하기

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를 이용해 연결을 매번 맺지도 않고, 쿼리를 원격 서버에 보내서 처리하므로 가장 효율적이고 빠르다.