Який найшвидший спосіб вставити велику кількість рядків?


27

У мене є база даних, де я завантажую файли в таблицю інсценізації, з цієї таблиці постановок у мене є 1-2 приєднання, щоб вирішити деякі зовнішні ключі, а потім вставити ці рядки в підсумкову таблицю (яка має один розділ на місяць). У мене є близько 3,4 мільярда рядків за три місяці даних.

Який найшвидший спосіб перенести ці рядки до постановки фінального столу? Завдання потоку даних SSIS (яка використовує подання як джерело та має активне швидке завантаження) або команду Вставити INTO SELECT ....? Я спробував Data Data Task і за 5 годин (8 ядер / 192 ГБ оперативної пам’яті на сервері) можна отримати близько 1 мільярда рядків, що мені дуже повільно.


1
Чи є розділи на окремих файлових групах (і чи є ті групи файлів на різних фізичних дисках)?
Аарон Бертран

3
Дійсно хороший ресурс Посібник з продуктивності завантаження даних . Це стосується великої оптимізації продуктивності, яку ви можете зробити, наприклад, увімкнення TF610 , використання BCP OUT / IN, SSIS і т. Д. Вам просто потрібно дотримуватися рекомендацій і перевірити їх у вашому оточенні.
Кін Шах

@Aaron так, на місяць одна файлова група, 12 сан лун додається, тому всі джани йдуть на один обід і т. Д. Не впевнений, скільки дисків на ланч, але має бути багато.
nojetlag

Так, я справді мав на увазі "набори дисків" і, мабуть, міг би згадати і контролери, які можуть насититися.
Аарон Бертран

@Kin подивився на посібник, але, здається, застарів: "Призначення SQL Server - це найшвидший спосіб масового завантаження даних із потоку даних інтеграційних служб на SQL Server. Це призначення підтримує всі параметри масового завантаження SQL Server - крім ROWS_PER_BATCH . " а в SSIS 2012 вони рекомендують призначення OLE DB для кращої роботи.
nojetlag

Відповіді:


25

Один загальний підхід:

  1. Відключити / впасти індекси / обмеження на цільовій таблиці.
  2. INSERT dbo.[Target] WITH (TABLOCKX) SELECT ...
  3. Зважаючи на кредит JNK, звичайно, ви можете зробити вищезазначене партіями nрядків, що може зменшити навантаження на журнал транзакцій, і, звичайно, означає, що якщо якась партія виходить з ладу, вам потрібно лише починати з цієї партії. Я обговорював це з цього приводу (хоча у відношенні до делетів застосовуються ті самі основні поняття) тут: http://www.sqlperformance.com/2013/03/io-subsystem/chunk-delete
  4. Повторно увімкніть / відновіть індекси / обмеження на цільовій таблиці (і, можливо, ви можете відкласти деякі з них, якщо вони не потрібні для всіх операцій, і важливіше швидко отримати базові дані в Інтернеті).

Якщо ваші розділи є фізичними, а не просто логічними, ви можете отримати деякий час, якщо різні процеси одночасно заповнюватимуть різні розділи (звичайно, це означає, що ви не можете використовувати TABLOCK/ TABLOCKX). Це передбачає, що джерело також підходить для вибору декількох процесів без перекриття / блокування тощо, і робить цю сторону операції ще повільнішою (підказка: створити кластерний індекс на джерелі, який відповідає схемі розподілу в пункті призначення).

Ви також можете вважати щось набагато примітивніше, як BCP OUT/BCP IN .

Я не знаю, що я скочу до SSIS, щоб допомогти у цьому. Там, мабуть, є ефективність, але я не знаю, що зусилля виправдовують економію.


2
Не слід сліпо відкидати індекси (особливо кластерні індекси), якщо ваші дані не відсортовані. Падіння індексу та очікування відтворення кластерного індексу може бути величезною помилкою, оскільки це може коштувати як величезного дискового простору, так і величезної кількості часу. Я не перший, хто зазнав такої помилки. Подивіться опис "плану B" у цій статті sqlmag.com/t-sql/… . У автора був той самий випуск.
цзяо

10

Дивлячись на вашу проблему з точки зору SSIS, я відчуваю, що причина цього може зайняти так довго, це те, що у вас не було часу. Це може призвести до надмірної кількості рядків, що заповнюють трубопровід SSIS, і може перешкодити роботі SSIS. Що вам потрібно зробити, це змінити рядки за налаштуваннями партії та, можливо, максимальний розмір вставки. Тепер те, що ви також встановили це, залежатиме від обсягу пам'яті, доступної вашому серверу SSIS? Яка швидкість диска вашого екземпляра SQL Server? Найкращий спосіб зробити це тест. Наприклад, використовуємо 10 000. Це відправить пакет на сервер 10 000 за раз, тим самим уберегши ваш конвеєр від переповнення і допоможе швидше запустити цей процес. Ці налаштування встановлені у вашому пункті OLEDB.

OLEDB Місце призначення

Якщо це проблема, ви також можете додати виконання завдання SQL до і після, як це зробити, як пропонує @AaronBertrand, і видалити / повторно додати будь-які індекси або обмеження до таблиці.


1
Там відмінний питання про те, що «швидке завантаження» тягне за собою в іншому місці на DBA.SE: dba.stackexchange.com/questions/141430 / ... .
Йон усіх торгів
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.