2016-10-17 9 views
0

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

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

+0

'ExecuteNonQuery()' будет возвращать количество затронутых строк. возможно ли включать в себя примеры фрагментов, которые вы используете в настоящее время, тогда вы получите гораздо лучший ответ? –

+1

Они нигде не размещены. Они исполняются. Вероятно, у вас не будет проблем с памятью, но самый простой способ это выяснить. Как долго это заставляет вас написать эту 10-строчную программу и запустить ее, чтобы проверить ее? –

+1

Вот небольшое сообщение в блоге какого-то случайного интернет-пользователя, с которым я столкнулся, используя Google, который вы, возможно, захотите прочитать: https://www.jokecamp.com/blog/make-your-sqlite-bulk-inserts-very- fast-in-c/ –

ответ

3

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

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

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

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

-3

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

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

+1

Ухмм .. Я думаю, что это не ОП спрашивал? –

+0

Commit был бы ошибкой, если бы транзакции не использовались, поэтому, предположительно, они есть. Вопрос в том, где эти незафиксированные данные фактически хранятся. – user1751825

+0

Это не то, о чем мой вопрос. Я знаю, что он возвращает. – pnizzle