Как выполнить массовую вставку в Sybase SQL
Мне нужно вставить большое количество данных (несколько миллионов), и мне нужно выполнить это быстро. Я читал о массовой вставке через ODBC в.NET и JAVA, но мне нужно выполнить это непосредственно в базе данных.
Я также читал о пакетной вставке, но то, что я пробовал, похоже, не сработало.
Я выполняю INSERT SELECT, но он занимает что-то около 0,360 с на строку, это очень медленно, и мне нужно выполнить некоторые улучшения здесь.
Я был бы очень признателен за некоторые рекомендации здесь с примерами и документацией, если это возможно.
БАЗА ДАННЫХ: SYBASE ASE 15.7
1 ответ
Расширяя некоторые комментарии...
- блокировка, медленный дисковый ввод-вывод и любые другие события ожидания (т. е. что-либо кроме фактической операции вставки / обновления) могут быть установлены из
master..monProcessWaits
Таблица (where SPID = spid_of_your_insert_update_process
) [см. руководство по P&T для таблиц мониторинга (также известные как таблицы MDA)] master..monProcessObject
а такжеmaster..monProcessStatement
покажет логические / физические операции ввода-вывода для текущих выполняемых запросов [снова, см. руководство по P&T для таблиц MDA]master..monSysStatement
покажет логические / физические операции ввода-вывода для недавно выполненных запросов [снова, см. руководство по P&T для таблиц MDA]- за
UPDATE
заявления, которые вы хотите взглянуть на план запроса, чтобы увидеть, страдаете ли вы от плохого порядка соединения; также имеет ключевое значение...direct
(быстро / хорошо) обновления противdeferred
(медленные / плохие) обновления;deferred
обновления могут происходить по многим причинам... некоторые могут быть исправлены, некоторые нет... обновление индексированных столбцов, плохой порядок соединения, обновления, которые вызывают разбиение страниц и / или переадресацию строк - Ограничения RI (PK/FK) можно просмотреть с помощью
sp_helpconstraint table_name
; Планы запросов также будут показывать соединения под прикрытием, необходимые при выполнении проверок RI (PK/FK) во время вставок / обновлений / удалений - триггеры немного сложнее найти (официальный
sp_helptrigger
не появляется до ASE 16); проверитьsysobjects.[ins|upd|del]trig where name = your_table
- они представляют идентификаторы объектов любых триггеров вставки / обновления / удаления в таблице; также проверьтеsysobjects
записи гдеtype = 'TR' and deltrig = object_id(your_table)
- обеспечивает поддержку дополнительных триггеров вставки / обновления / удаления (не вызывайте в данный момент, если это просто ASE 16+) - если срабатывают триггеры, необходимо просмотреть соответствующие планы запросов, чтобы убедиться, что
inserted
а такжеdeleted
Таблицы (если есть ссылки) управляют любыми запросами, в которых эти псевдотаблицы объединяются с постоянными таблицами.
Скорее всего, есть некоторые области, которые я забыл (вне головы) ... ключ к выводу, что может быть много причин для "медленных" DML-операторов.
Один (относительно) быстрый способ узнать, действуют ли ограничения или триггеры RI (PK/FK) ...
set showplan on
go
insert/update/delete statements
go
Затем просмотрите итоговый план (ы) запросов; если вы видите ссылки на какие-либо таблицы, кроме тех, которые явно указаны в инструкциях вставки / обновления / удаления, то вы, вероятно, имеете дело с ограничениями и / или триггерами RI.