Как выполнить массовую вставку в 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.

Другие вопросы по тегам