어느 것이 더 효율적인가 : 링크 된 서버에서 선택하거나 링크 된 서버에 삽입?


32

한 서버에서 다른 서버로 데이터를 내 보내야한다고 가정합니다 (링크 된 서버를 통해). 어떤 진술이 더 효율적일까요?

소스 서버에서 실행 :

INSERT INTO [DestinationLinkedServer].[DestinationDB].[dbo].[Table]
SELECT a, b, c, ... FROM [dbo].Udf_GetExportData()

또는 대상 서버에서 실행하십시오.

INSERT INTO [dbo].[Table]
SELECT a, b, c, ...
FROM OPENQUERY([OriginLinkedServer],
    'SELECT a, b, c, ... FROM [OriginDB].[dbo].Udf_GetExportData()')

어느 것이 더 빠르며 전체 리소스를 더 적게 소비합니까 (소스 및 대상 서버 모두)? 두 서버 모두 SQL Server 2005입니다.

답변:


29

한 서버에서 다른 서버로 데이터를 내 보내야한다고 가정합니다.

최고는 사용하는 것입니다

  • 모든 데이터를 사용하려면 백업 / 복원; BCP OUT 및 BCP IN 또는 SSIS
  • 데이터의 하위 집합 (일부 테이블 만 해당)을 원할 경우 SSIS 또는 BCP OUT & BCP IN을 사용하십시오.

데이터의 양 / 크기 및 대역폭에 따라 데이터를 이동하려면 연결된 서버가 성능을 저하시킵니다.

원본 서버 또는 대상 서버에서 실행

-소스 서버에서 실행 :

INSERT INTO [DestinationLinkedServer].[DestinationDB].[dbo].[Table]
SELECT a, b, c, ... FROM [dbo].Udf_GetExportData()

소스 서버에서 쿼리를 실행하고 데이터를 대상 서버로 푸시 할 때이를 푸싱 데이터라고합니다. 이것은 비용이 많이 드는 작업입니다.

--- 대상 서버에서 실행

INSERT INTO [dbo].[Table]
SELECT a, b, c, ...
FROM OPENQUERY([OriginLinkedServer],
    'SELECT a, b, c, ... FROM [OriginDB].[dbo].Udf_GetExportData()')

대상 서버에서 쿼리를 실행하고 원본 서버에서 데이터를 가져올 때이를 풀링 데이터라고합니다. 풀링되는 데이터의 양에 따라 이전보다 훨씬 빠르고 리소스를 덜 사용합니다.

pull 메소드의 경우 SQL 프로파일 러를 사용하면 연결된 서버 (소스 서버)에서 단일 SQL 문이 실행되고 결과 서버가 소스 서버에서 대상 서버로 가져와 PUSH보다 성능이 크게 향상됩니다. 방법.

주목해야 할 또 다른 사항은 다음과 같습니다.

연결된 서버 (servername.databasename.schema.tablename aka 분산 쿼리를 사용하는 4 개의 이름 지정 규칙)와 OPENQUERY 사이에서 일반적으로 OPENQUERY가 빠릅니다. 왜 ?

연결된 서버 -쿼리 최적화 프로그램은 쿼리 명명법을보고 실행 계획을 만들어 원격 쿼리와 로컬 쿼리로 나눕니다. 로컬 쿼리가 로컬로 실행되고 원격 쿼리에 대한 데이터가 원격 서버에서 수집되어 로컬로 스크러빙되고 함께 결합되어 최종 사용자에게 단일 레코드 세트로 제공됩니다.

OPENQUERY의 경우 -지정된 링크 된 서버에서 지정된 통과 쿼리를 실행합니다. SQL Server는 해석되지 않은 쿼리 문자열로 통과 쿼리를 OLE DB 데이터 원본에 보냅니다. 따라서 SQL은 쿼리에 어떤 종류의 논리도 적용하지 않으며 해당 쿼리가 수행 할 작업을 추정하지 않고 지정된 쿼리를 대상 연결된 서버에 그대로 전달합니다. 열린 쿼리는 한 쿼리에서 여러 서버를 참조하지 않을 때 유용합니다. SQL이 여러 작업으로 나누지 않고 수신 된 출력에 대해 로컬 작업을 수행하지 않기 때문에 일반적으로 빠릅니다.

훌륭한 참고 문헌 :


8

효율성을 어떻게 측정하고 있습니까? 어느 것이 더 빠를까요? 어느 것이 대상에서 더 적은 자원을 소비합니까? 소스에서? 이 행의 열은 몇 개의 행과 어떤 종류의 데이터 유형입니까? 연결된 서버를 통해 TVF를 실행할 수 있습니까 (대상 SQL 2008 이상입니까?) ? TVF에서 데이터를 가져 오는 경우이 데이터의 1 : 1 마이그레이션을 어떻게 보장합니까?

그 질문에서 벗어난 ...

업데이트 1

ETL (Extract-Transform-Load)을 찾고있는 것처럼 들립니다. 원본에서 데이터를 가져 와서 필요한 변환을 적용한 다음 대상에로드 할 수있는 SSIS (SQL Server Integration Services)를 사용하는 것이 좋습니다 . 이것은 변형에 따라 매우 간단한 패키지 인 것처럼 들립니다.


일반적인 통념에 따르면 연결된 서버 접근 방식은 링크로 이동하여 로컬 서버로 데이터를 가져온 다음 로컬 서버에서 모든 논리 (필터, 조인 등)를 적용합니다. 연결된 서버에서 데이터를 가져 오는 데 약간의 오버 헤드가 있지만 대부분의 처리는 로컬에서 처리됩니다.

OPENQUERY 메소드는 원격 서버에서 처리를 수행하고 로컬 서버에서 "필터링 된 결과"를 수신합니다.

연결된 서버를 통해 TVF를 실행할 수 있더라도 원격 처리 로컬 처리 (세트에 적용 할 추가 논리가 있다고 가정) 두 세계에서 최악의 상황이 발생합니다 .

앞으로 나아가기로 결정한 방법에 따라 OPENQUERY데이터 대량 가져 오기 / 내보내기 방법 도 살펴 보겠습니다 .

그 모든 것을 말하면서 ...

SQL Server에서 원본과 대상이 모두 대상인 경우 (그리고 대상이 하위 버전이 아닌 경우) 데이터를 백업하고 복원하지 않는 이유는 무엇입니까? 이것은 진정한 데이터 마이그레이션입니다. 다음은 몇 가지 코드입니다.

BACKUP DATABASE <DatabaseName, sysname, DatabaseName>
TO DISK=N'<backup_location, varchar, BackupLocation>.bak'
WITH INIT, FORMAT, COMPRESSION, COPY_ONLY

RESTORE DATABASE <NewDatabaseName, sysname, NewDatabaseName>
FROM DISK = N'<backup_location, varchar, BackupLocation>\
    <DatabaseName, sysname, DatabaseName>.bak'
WITH 
    MOVE '<DataFileName, sysname, DataFileName>' TO '<DataMDFPath, nvarchar(600), DataMDFPath>',
    MOVE '<LogFilePath, sysname, LogFilePath>' TO '<LogLDFPath, nvarchar(600), LogLDFPath>',
    REPLACE;

SSMS에서 템플릿을 사용하는 방법에 대해서는 이 답변 을 참조하십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.