Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как ускорить иморт данных?  [new]
senn
Member

Откуда:
Сообщений: 403
Есть SSIS-Пакет, который тянет данные с Оракла. Самая большая таблица имеет около 80 млн. записей и занимает порядка 50 ГБ на диске. Только ее импорт занимает 12 часов. Насколько это (в среднем) медленно или быстро?
Можно ли этот процесс как-то ускорить, изменив настройки БД, таблиц или файлов дб?
Я проверил, индексов в таблицах нет.
Настройки БД - стандартно правильные: RECOVERY model FULL; Auto close FALSE; Auto shrink FALSE и т.д.

Перед импортом все данные удаляются TRUNCATE. Log-file ограничен 2GB (не мало?), автоинкремент 1024Мб.

SELECT @@VERSION
Microsoft SQL Server 2014 (SP2-CU4) (KB4010394) - 12.0.5540.0 (X64) Jan 27 2017 03:40:25 Copyright (c) Microsoft Corporation Enterprise Edition: Core-based Licensing (64-bit) on Windows NT 6.3 <X64> (Build 9600: ) (Hypervisor)

Спасибо!
12 дек 17, 13:40    [21027148]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить иморт данных?  [new]
Xe-Xe)
Guest
Брать дельту. Только то, что изменилось за определенное время + перейти на линкованый сервер
12 дек 17, 14:16    [21027299]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить иморт данных?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 49509
senn
Настройки БД - стандартно правильные: RECOVERY model FULL

Зачем рековери для базы, которая тупо вся заливается с другого сервера?
12 дек 17, 14:43    [21027386]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить иморт данных?  [new]
982183
Member

Откуда: VL
Сообщений: 3349
А "тянуть" изменения, а не всю базу?
12 дек 17, 14:46    [21027402]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить иморт данных?  [new]
senn
Member

Откуда:
Сообщений: 403
Спасибо за ответы. Про инкремент понятно думали, но нет явного признака для инкремента.
12 дек 17, 14:55    [21027444]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить иморт данных?  [new]
senn
Member

Откуда:
Сообщений: 403
Dimitry Sibiryakov,

заливается не вся база, а отдельные таблицы (10 штук всего, правда, жирные))).
12 дек 17, 14:57    [21027448]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить иморт данных?  [new]
Yasha123
Member

Откуда:
Сообщений: 1833
попробуйте в BULK LOGGED перевести на время заливки (если требования позволяют).
сейчас у вас весь балк полностью логируется
12 дек 17, 15:15    [21027514]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить иморт данных?  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3141
senn
Log-file ограничен 2GB (не мало?), автоинкремент 1024Мб.
Не хватит. Странно, что в процессе импорта в БД с фулл рекавери не вылетели по нехватке места в журнале транзакций.

Кстати, не очень понятно, зачем делать инкремент 1 Гб при максимальном размере 2 Гб. У вас там точно в гигабайтах ограничение?
12 дек 17, 16:54    [21027987]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить иморт данных?  [new]
iii2
Member

Откуда:
Сообщений: 202
senn
Спасибо за ответы. Про инкремент понятно думали, но нет явного признака для инкремента.

Считайте контрольную сумму полей таблицы. Конечно, желательно что-то типа MD5, но это очень уж ресурсоёмко, по моему опыту достаточно что-то типа BINARY_CHECKSUM.
Табличку "предыдущий слепок" (id, CHECKSUM) храните на том же сервере, с которого производилась выборка.
Она обычно получается небольшая, в смысле общего объема.
Соответственно, изменившиеся данные ищутся по сочетанию id + контрольная сумма, и на сервер передаются строки с теми id, которые не найдены при поиске по сочетанию (id + контрольная сумма) [это либо новые, либо изменившиеся] + отдельно перечень не найденных id при сопоставлении "предыдущего слепок" и копируемых данных [это удаленные id]. Второе, впрочем, не обязательно, если в хранилище хранятся все данные, с накоплением.
Если вы опасаетесь, что BINARY_CHECKSUM выдаст вам коллизию, а более ресурсоёмкий MD5 использовать не хотите, то совет - храните 2 BINARY_CHECKSUM, рассчитанные по двум, частично пересекающимся подмножествам полей одной записи. Вероятность коллизии снизится на величину, пропорциональную произведению длин контрольных сумм. Ну, точнее, снизится вплоть до, и т.д. Не будем впадать в маразм в этом вопросе :-)
Прелесть всего этого дела, что контрольную сумму можно (и нужно) либо хранить на источнике, как вычисляемое поле таблицы, либо же рассчитывать прямо перед импортом, в табличку "текущий слепок", т.е. не гонять всё это дело туда-сюда.

Всё это работает очень быстро, даже на выборках 100+ млн., т.к. сами по себе таблички с ключами и контрольными суммами - получаются компактными. Относительно.
Гм... надеюсь, что ключи у вас - что-то типа bigint, конечно...

Как вариант - завести поле timestamp во всех импортированных таблицах, и, соответственно, передавать все записи, timestamp которых больше, чем текущий timestamp базы на момент прошлого импорта.
Правда тут проблема с удаленными записями, их id тоже нужно как то определять (например - складывать триггером в соотв. табличку), и передавать на приемник для удаления соотв. записей. Если, конечно, вы не используете хранилище с накоплением [всякого мусора].

Впрочем, это всё для MSSQL, для Оракула могут еще способы найтись.
12 дек 17, 17:07    [21028075]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить иморт данных?  [new]
senn
Member

Откуда:
Сообщений: 403
iii2,

спасибо, но это все не про нас((... Способов реализаций инкрементального импорта много, но все они подразумевают (в нашем случае) вмешательство в БД-исходник (как я это поимаю). К сожалению, на сегодняшний день такой возможности не представляется (имеется лишь ограниченный доступ на чтение нескольких таблиц).

Вероятнее всего буду пробовать выносить импорт в отдельную бд и отключать там фул рекавери на время импорта (илинавсегда).
12 дек 17, 17:21    [21028157]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить иморт данных?  [new]
senn
Member

Откуда:
Сообщений: 403
всем спасибо за советы!
12 дек 17, 17:22    [21028167]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить иморт данных?  [new]
Ferdipux
Member

Откуда: Москва
Сообщений: 537
senn,

Наивный вопрос - в SSIS пакете вы используете OLE DB Destination для MS SQL. А какой режим вставки - insert или fast insert? Настоятельно рекомендую последний.
12 дек 17, 18:10    [21028360]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить иморт данных?  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
Если SSIS, то вот это реально ускоряет обмен. Измеряли в попугаях - попугаи остались довольны.
https://docs.microsoft.com/en-us/sql/integration-services/attunity-connectors
12 дек 17, 19:15    [21028510]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить иморт данных?  [new]
iii2
Member

Откуда:
Сообщений: 202
senn
iii2,

спасибо, но это все не про нас((... Способов реализаций инкрементального импорта много, но все они подразумевают (в нашем случае) вмешательство в БД-исходник (как я это поимаю).

Не обязательно. Непосредственно сами данные трогать не обязательно. Информацию можно хранить в отдельной схеме (если речь об Оракуле)
К сожалению, на сегодняшний день такой возможности не представляется (имеется лишь ограниченный доступ на чтение нескольких таблиц).

Вероятнее всего буду пробовать выносить импорт в отдельную бд и отключать там фул рекавери на время импорта (илинавсегда).

А это не ускорит вставки.
И при простой модели восстановления, и при полной модели восстановления - протоколирование происходит абсолютно одинаково.
Просто при простой модели место в логе, после фиксации транзакции используется повторно. А объем дисковых операций - совершенно одинаков.

Нужно не менять модель восстановления, а сокращать количество протоколируемых данных.
12 дек 17, 20:35    [21028620]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить иморт данных?  [new]
iii2
Member

Откуда:
Сообщений: 202
https://docs.microsoft.com/ru-ru/sql/relational-databases/import-export/prerequisites-for-minimal-logging-in-bulk-import
Вот. И далее по теме.
12 дек 17, 20:38    [21028626]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить иморт данных?  [new]
msLex
Member

Откуда:
Сообщений: 7727
iii2
А это не ускорит вставки.
И при простой модели восстановления, и при полной модели восстановления - протоколирование происходит абсолютно одинаково.

Очень даже отличается, bulk операции в simple и bulk-logged логируются минимально а в фулл- постранично



senn,

Вообще 12 часов на 80 млн записей (50 ГБ) это очень много.

Для начала надо понять, что тормозит получение данных или сохранение. (Тут надо не забыть про сеть между 3-мя точками Oracle-SSIS-MsSql)

1. Запустите пакет получения данных с Оракл-а без сохранения в SqlServer (простой count-аггрегат в качестве получателя)
2. Посмотрите нагрузку на сеть в "лайт" и "фулл" режимах
3. Убедитесь, что вставляется bulk-ом. Даже в фулл моделе bulk быстрее простых инсертов, т.к. в лог пишет постранично а не по одной записи (при наличии синхронного AO все ухудшается коммитем каждой записи на вторичных репликах)

Если первые три пункта исключены, начинайте анализировать проблемы при вставке в SqlServer:
блокировки, очереди на дисках данных/лога и т.д.
12 дек 17, 20:58    [21028664]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить иморт данных?  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 33242
Блог
senn,

курим руководство, ибо все придумано до нас:

https://technet.microsoft.com/en-us/library/dd425070(v=sql.100).aspx
12 дек 17, 21:22    [21028713]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить