Как выполнить массовую вставку в Sybase SQL

Мне нужно вставить большое количество данных (несколько миллионов), и мне нужно выполнить это быстро. Я читал о массовой вставке через ODBC в .NET и JAVA, но мне нужно выполнить ее непосредственно в базе данных.

Я также читал о пакетной вставке, но то, что я пробовал, не сработало Пакетная вставка, Пример

Я выполняю INSERT SELECT, но он занимает около 0,360 с на строку, это очень медленно, и мне нужно внести здесь некоторые улучшения.

Я был бы очень признателен за некоторые рекомендации здесь с примерами и документацией, если это возможно.

БАЗА ДАННЫХ: SYBASE ASE 15.7


person Nelssen    schedule 27.09.2017    source источник
comment
вам нужно начать с отслеживания того, где тратится время ... обновление индексов? проверка ограничений RI? триггерная обработка? блокировка? чрезмерное количество дисковых операций ввода-вывода (например, чтение исходных данных с диска, запись страниц журнала/данных на диск)?   -  person markp-fuso    schedule 27.09.2017
comment
Привет, Маркп, я значительно улучшился, после работы с индексом сегодня утром последняя запись была 15 тыс. обновлений и 15 тыс. вставок за 8 минут, но все же я не знаю, достаточно ли это быстро, я также буду отслеживать время. Это очень помогает, указывая на все это, чтобы проверить, что вы делаете с блокировкой?   -  person Nelssen    schedule 27.09.2017
comment
Да, я пишу журнал на диск! О, хотя было бы плохой практикой не регистрировать эту активность   -  person Nelssen    schedule 27.09.2017
comment
вопрос не в том, чтобы не записывать журнал на диск, а в том, сколько времени занимает запись (лог на диск) (т. е. у вас медленные диски?); что касается блокировки... прерывистая блокировка вашего процесса (другими процессами) будет отображаться как "медленность" во время ваших вставок   -  person markp-fuso    schedule 27.09.2017
comment
Спасибо, Маркп, не могли бы вы помочь мне с документацией о том, как выполнить этот анализ. Я новичок в разработке больших наборов данных   -  person Nelssen    schedule 27.09.2017
comment
нашел это: sqlskills.com/wp-content/uploads/2014/04/ Я продолжу поиск. Благодарность!   -  person Nelssen    schedule 27.09.2017
comment
Я делаю 19k обновлений за 3 минуты, это лучше, но еще не хорошо.   -  person Nelssen    schedule 28.09.2017
comment
вставка 16k за 3 секунды, намного лучше. только с индексной работой   -  person Nelssen    schedule 28.09.2017
comment
@markp ваша оценка IO была полезной   -  person Nelssen    schedule 28.09.2017


Ответы (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.

person markp-fuso    schedule 28.09.2017
comment
Привет, markp, Большое спасибо за то, что познакомил меня с такими замечательными концепциями, на которые можно посмотреть и объяснить. этот поток породил беспрецедентный квест с моей стороны, и теперь я гораздо лучше знаком с этим. Моя производительность значительно улучшилась, и я кардинально изменил свой код массовой вставки. Спасибо за помощь! - person Nelssen; 20.10.2017
comment
Из того, что вы сказали, мне просто нужно больше узнать о прямых и отложенных обновлениях. - person Nelssen; 20.10.2017
comment
имейте в виду, что некоторые отложенные обновления не могут быть устранены (например, UPDATE, которое обновляет столбец индекса, и UPDATE, которое обновляет столбец переменной длины до большего значения, что приводит к разбиению страницы и т. д.). - person markp-fuso; 20.10.2017
comment
Привет Маркп! Я читал эту тему утром, и теперь я знаком с ней. Обновление столбцов индекса приведет к обновлению индекса, а столбец переменной длины может привести к разделению страницы или пересылке строк (как вы упомянули)! Спасибо!! - person Nelssen; 20.10.2017