Припустимо, мені доведеться експортувати дані з одного сервера на інший.
Найкраще використовувати
- ЯКЩО ви хочете, щоб усі дані використовували резервне копіювання / відновлення; BCP OUT & BCP IN або SSIS
- Якщо ви хочете, щоб підмножина даних (лише деякі таблиці) використовувала SSIS або BCP OUT & BCP IN
Для переміщення даних, залежно від кількості / розміру даних та пропускної здатності n / w, пов'язаний сервер знищить продуктивність.
Виконання на вихідному сервері Або виконання на цільовому сервері - який з них буде швидшим і загалом споживатиме менше ресурсів (і вихідний, і цільовий сервер)?
- Виконання на вихідному сервері:
INSERT INTO [DestinationLinkedServer].[DestinationDB].[dbo].[Table]
SELECT a, b, c, ... FROM [dbo].Udf_GetExportData()
Це називається PUSHING Data під час виконання запиту на вихідному сервері та переміщення даних на цільовий сервер. Це буде дорога операція.
--- виконання на цільовому сервері
INSERT INTO [dbo].[Table]
SELECT a, b, c, ...
FROM OPENQUERY([OriginLinkedServer],
'SELECT a, b, c, ... FROM [OriginDB].[dbo].Udf_GetExportData()')
Це називається PULLING Data під час виконання запиту на цільовому сервері та витягування даних із вихідного сервера. Це буде набагато швидшим та менш ресурсоємним порівняно з попереднім (залежно від того, скільки даних витягується).
У випадку методу витягування, використовуючи SQL Profiler, ви побачите, що один оператор SQL виконується через пов'язаний сервер (вихідний сервер), а набір результатів переноситься з вихідного сервера на цільовий сервер, що є величезним збільшенням продуктивності за PUSH метод.
Ще один момент, який слід зазначити:
Між Пов'язаним сервером (у 4-х частинах іменування використовуваного servername.databasename.schema.tablename aka розподілених запитів) та OPENQUERY, як правило, OPENQUERY буде швидко. Чому?
Для пов'язаного сервера - оптимізатор запитів створює план виконання, переглядаючи номенклатуру запитів і розбиває її на віддалені та локальні запити. Локальні запити виконуються локально, а дані для віддалених запитів збираються з віддалених серверів, обчислюються локально, поєднуються разом і подаються кінцевому користувачеві як єдиний набір записів.
Для OPENQUERY - виконує вказаний запит проходу на вказаному зв'язаному сервері. SQL Server надсилає запити проходження через неінтерпретовані рядки запитів до джерела даних OLE DB. Отже, SQL не застосовуватиме будь-яку логіку до запиту і не намагатиметься оцінити, що буде робити цей запит, він просто передасть вказаний запит таким, яким він є, до цільового пов'язаного сервера. Відкриті запити корисні, коли ви не посилаєтесь на кілька серверів в одному запиті. Це, як правило, швидко, оскільки SQL не розбиває його на кілька операцій і не виконує жодних локальних дій на отриманий вихід.
Відмінні посилання на читання: