|
|
|
Как ускорить иморт данных?
|
|||
|---|---|---|---|
|
#18+
Есть 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.12.2017, 13:40:23 |
|
||
|
Как ускорить иморт данных?
|
|||
|---|---|---|---|
|
#18+
Брать дельту. Только то, что изменилось за определенное время + перейти на линкованый сервер ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2017, 14:16:46 |
|
||
|
Как ускорить иморт данных?
|
|||
|---|---|---|---|
|
#18+
sennНастройки БД - стандартно правильные: RECOVERY model FULL Зачем рековери для базы, которая тупо вся заливается с другого сервера? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2017, 14:43:27 |
|
||
|
Как ускорить иморт данных?
|
|||
|---|---|---|---|
|
#18+
А "тянуть" изменения, а не всю базу? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2017, 14:46:29 |
|
||
|
Как ускорить иморт данных?
|
|||
|---|---|---|---|
|
#18+
Спасибо за ответы. Про инкремент понятно думали, но нет явного признака для инкремента. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2017, 14:55:21 |
|
||
|
Как ускорить иморт данных?
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, заливается не вся база, а отдельные таблицы (10 штук всего, правда, жирные))). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2017, 14:57:06 |
|
||
|
Как ускорить иморт данных?
|
|||
|---|---|---|---|
|
#18+
попробуйте в BULK LOGGED перевести на время заливки (если требования позволяют). сейчас у вас весь балк полностью логируется ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2017, 15:15:01 |
|
||
|
Как ускорить иморт данных?
|
|||
|---|---|---|---|
|
#18+
sennLog-file ограничен 2GB (не мало?), автоинкремент 1024Мб.Не хватит. Странно, что в процессе импорта в БД с фулл рекавери не вылетели по нехватке места в журнале транзакций. Кстати, не очень понятно, зачем делать инкремент 1 Гб при максимальном размере 2 Гб. У вас там точно в гигабайтах ограничение? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2017, 16:54:49 |
|
||
|
Как ускорить иморт данных?
|
|||
|---|---|---|---|
|
#18+
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.12.2017, 17:07:08 |
|
||
|
Как ускорить иморт данных?
|
|||
|---|---|---|---|
|
#18+
iii2, спасибо, но это все не про нас((... Способов реализаций инкрементального импорта много, но все они подразумевают (в нашем случае) вмешательство в БД-исходник (как я это поимаю). К сожалению, на сегодняшний день такой возможности не представляется (имеется лишь ограниченный доступ на чтение нескольких таблиц). Вероятнее всего буду пробовать выносить импорт в отдельную бд и отключать там фул рекавери на время импорта (илинавсегда). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2017, 17:21:00 |
|
||
|
Как ускорить иморт данных?
|
|||
|---|---|---|---|
|
#18+
всем спасибо за советы! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2017, 17:22:27 |
|
||
|
Как ускорить иморт данных?
|
|||
|---|---|---|---|
|
#18+
senn, Наивный вопрос - в SSIS пакете вы используете OLE DB Destination для MS SQL. А какой режим вставки - insert или fast insert? Настоятельно рекомендую последний. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2017, 18:10:36 |
|
||
|
Как ускорить иморт данных?
|
|||
|---|---|---|---|
|
#18+
Если SSIS, то вот это реально ускоряет обмен. Измеряли в попугаях - попугаи остались довольны. https://docs.microsoft.com/en-us/sql/integration-services/attunity-connectors ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2017, 19:15:28 |
|
||
|
Как ускорить иморт данных?
|
|||
|---|---|---|---|
|
#18+
senniii2, спасибо, но это все не про нас((... Способов реализаций инкрементального импорта много, но все они подразумевают (в нашем случае) вмешательство в БД-исходник (как я это поимаю). Не обязательно. Непосредственно сами данные трогать не обязательно. Информацию можно хранить в отдельной схеме (если речь об Оракуле) К сожалению, на сегодняшний день такой возможности не представляется (имеется лишь ограниченный доступ на чтение нескольких таблиц). Вероятнее всего буду пробовать выносить импорт в отдельную бд и отключать там фул рекавери на время импорта (илинавсегда). А это не ускорит вставки. И при простой модели восстановления, и при полной модели восстановления - протоколирование происходит абсолютно одинаково. Просто при простой модели место в логе, после фиксации транзакции используется повторно. А объем дисковых операций - совершенно одинаков. Нужно не менять модель восстановления, а сокращать количество протоколируемых данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2017, 20:35:19 |
|
||
|
Как ускорить иморт данных?
|
|||
|---|---|---|---|
|
#18+
https://docs.microsoft.com/ru-ru/sql/relational-databases/import-export/prerequisites-for-minimal-logging-in-bulk-import Вот. И далее по теме. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2017, 20:38:29 |
|
||
|
Как ускорить иморт данных?
|
|||
|---|---|---|---|
|
#18+
iii2А это не ускорит вставки. И при простой модели восстановления, и при полной модели восстановления - протоколирование происходит абсолютно одинаково. Очень даже отличается, bulk операции в simple и bulk-logged логируются минимально а в фулл- постранично senn, Вообще 12 часов на 80 млн записей (50 ГБ) это очень много. Для начала надо понять, что тормозит получение данных или сохранение. (Тут надо не забыть про сеть между 3-мя точками Oracle-SSIS-MsSql) 1. Запустите пакет получения данных с Оракл-а без сохранения в SqlServer (простой count-аггрегат в качестве получателя) 2. Посмотрите нагрузку на сеть в "лайт" и "фулл" режимах 3. Убедитесь, что вставляется bulk-ом. Даже в фулл моделе bulk быстрее простых инсертов, т.к. в лог пишет постранично а не по одной записи (при наличии синхронного AO все ухудшается коммитем каждой записи на вторичных репликах) Если первые три пункта исключены, начинайте анализировать проблемы при вставке в SqlServer: блокировки, очереди на дисках данных/лога и т.д. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2017, 20:58:42 |
|
||
|
Как ускорить иморт данных?
|
|||
|---|---|---|---|
|
#18+
senn, курим руководство, ибо все придумано до нас: https://technet.microsoft.com/en-us/library/dd425070(v=sql.100).aspx ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2017, 21:22:59 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=39568610&tid=1690692]: |
0ms |
get settings: |
6ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
196ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
44ms |
get tp. blocked users: |
1ms |
| others: | 192ms |
| total: | 473ms |

| 0 / 0 |
