Что делает ExecuteNonQuery() во время массовой вставки?

У меня есть некоторый массовый код вставки vb.net (работающий), который я написал. Он вызывает ExecuteNonQuery() для каждой вставки, а затем в конце выполняет commit().

Мой вопрос о том, где размещаются эти вставки, ожидая команды commit ()? Я еще не внес никаких изменений в поддержку пакетной обработки. Таким образом, с моим существующим кодом перед вызовом commit() будет вставлен миллион строк. Я задаю этот вопрос, очевидно, чтобы знать, столкнусь ли я с проблемами с памятью, поэтому мне придется вносить изменения в мой код сейчас.


person pnizzle    schedule 17.10.2016    source источник
comment
ExecuteNonQuery() вернет количество затронутых строк. можно ли включить образцы фрагментов, которые вы используете в настоящее время, тогда вы получите гораздо лучший ответ?   -  person sujith karivelil    schedule 17.10.2016
comment
Никуда они не ставятся. Они казнены. Скорее всего, у вас не будет проблем с памятью, но самый простой способ выяснить это — сделать это. Сколько времени вам потребуется, чтобы написать эту 10-строчную программу и запустить ее для тестирования?   -  person Robert McKee    schedule 17.10.2016
comment
Вот небольшой пост в блоге от какого-то случайного человека в Интернете, на который я наткнулся во время использования Google, и который вы, возможно, захотите прочитать: jokecamp.com/blog/make-your-sqlite-bulk-inserts-very-fast-in-c   -  person Robert McKee    schedule 17.10.2016
comment
Поправьте меня, если я ошибаюсь, но эти незафиксированные вставки уже есть в таблице, верно? Он просто ожидает фиксации, потому что когда вы выбираете таблицу с помощью WITH (NO LOCK), вы видите, что записи уже есть.   -  person Aethan    schedule 17.10.2016
comment
Это может ответить на ваш вопрос stackoverflow.com/questions/15795259/   -  person user1751825    schedule 17.10.2016
comment
@ un-lucky, я знаю, что он возвращает количество затронутых строк. Меня больше интересует, хранится ли что-нибудь в памяти для каждой строки, что означает, что чем больше строк, тем больше потребление памяти.   -  person pnizzle    schedule 17.10.2016
comment
Такое название вопроса может вызвать путаницу. Массовая вставка имеет особое значение в SQL-сервере и не связана с ExecuteNonQuery.   -  person user1751825    schedule 17.10.2016
comment
@RobertMcKee программа состоит не из 10 строк, она намного больше. Мне было интересно узнать, хранится ли что-нибудь в памяти для каждой строки, что означало бы, что я должен следить за потреблением памяти. Не похоже, что это так. Что касается вашей ссылки, я на самом деле шел по ней около месяца, исследуя объемные вставки. Спасибо, это именно тот подход, который я использую.   -  person pnizzle    schedule 17.10.2016
comment
@user1751825 user1751825 да, я могу позволить себе вставить данные в одну транзакцию. Я работаю над политикой All or none. Если что-то не получается, весь процесс прерывается.   -  person pnizzle    schedule 17.10.2016
comment
@user1751825 user1751825 относительно вашей ссылки, да, это то, что мне нужно.   -  person pnizzle    schedule 17.10.2016
comment
@pnizzle Извините, я не имел в виду, что вся ваша программа будет состоять из 10 строк, но важный код, который вам нужно было протестировать, был. На самом деле, если вы используете тот же код в ссылке, которую я предоставил, это 9 строк, если не считать строки, которые он использовал для сравнения результатов.   -  person Robert McKee    schedule 17.10.2016


Ответы (2)


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

В режиме WAL все изменения записываются в журнал упреждающей записи.

В любом случае фактически ничего не записывается до тех пор, пока объем данных не переполнит кеш страницы (который по умолчанию имеет размер около 2 МБ).

Таким образом, размер транзакции не ограничен памятью, а только местом на диске.

person CL.    schedule 17.10.2016

в запросе на массовую вставку command.ExecuteNonQuery() не возвращает ни одной строки, обработанной оператором вставки, обновления или удаления.

В вашем случае после каждой успешной вставки он вернет 1 как целое число. если вы не используете запрос транзакции, Commit не имеет никакого смысла. Если вы явно не используете транзакцию, изменения фиксируются автоматически.

person Pravin Kr. Mishra    schedule 17.10.2016
comment
Хм .. Я думаю, что это не ОП спрашивал? - person Aethan; 17.10.2016
comment
При фиксации произошла бы ошибка, если бы транзакции не использовались, так что, предположительно, они есть. Вопрос в том, где на самом деле хранятся эти незафиксированные данные. - person user1751825; 17.10.2016
comment
Мой вопрос не об этом. Я знаю, что он возвращает. - person pnizzle; 17.10.2016