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

0

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

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

  • 0
    ExecuteNonQuery() возвращает количество затронутых строк. Можно ли включить образцы фрагментов, которые вы используете в настоящее время, тогда вы получите гораздо лучший ответ?
  • 1
    Они нигде не размещены. Они выполнены. Вероятно, у вас не будет проблем с памятью, но самый простой способ это сделать - это сделать. Сколько времени вам понадобится, чтобы написать эту 10-строчную программу и запустить ее для тестирования?
Показать ещё 9 комментариев
Теги:
bulkinsert
executenonquery

2 ответа

3
Лучший ответ

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

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

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

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

-3

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

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

  • 1
    Хм .. я думаю, что не ОП спрашивал?
  • 0
    В случае фиксации произошла бы ошибка, если бы транзакции не использовались, так что, вероятно, они есть. Вопрос в том, где на самом деле хранятся эти незафиксированные данные.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню