является массивным оператором insert-select? - PullRequest
0 голосов
/ 23 февраля 2011

Когда в транзакции используется несколько вставок с оператором select, как база данных отслеживает изменения во время транзакции? Могут ли быть проблемы с ресурсами (такими как память или пространство на жестком диске), если транзакция слишком долго остается открытой?

Ответы [ 3 ]

1 голос
/ 24 февраля 2011

Как именно это работает, зависит от базы данных.Например, в Oracle для этого потребуется пространство UNDO (и, в конце концов, если вы закончите, ваша транзакция будет прервана или ваш DBA будет кричать на вас).В PostgreSQL это предотвратит очистку старых версий строк.В MySQL / InnoDB он будет использовать пространство отката и, возможно, вызовет таймауты блокировки.

Есть несколько вещей, для которых база данных должна использовать пространство для:

  1. Хранение строк, в которых находится ваша транзакцияизменен (старые значения, новые значения или оба), чтобы можно было выполнить откат
  2. Отслеживание того, какие данные видны для вашей транзакции, чтобы обеспечить согласованное представление (на уровнях изоляции транзакций, отличных от чтениянезавершенный).Эти издержки часто будут тем больше, чем больше изоляции вы запрашиваете.
  3. Отслеживание того, какие данные видны для других транзакций (если вся база данных не выполняется при чтении без передачи)

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

1 голос
/ 23 февраля 2011

Короткий ответ, это зависит от размера выбора.Технически, выбор является частью транзакции, но большинство выборок не нужно «откатывать», поэтому фактический журнал изменений БД не будет включать сам выбор.Он будет содержать новую строку для каждого результата из оператора выбора в качестве оператора вставки.Если этот оператор select равен 10 тыс. Строк, то фиксация будет довольно большой, но не более, чем если бы вы написали 10 тыс. Отдельных операторов вставки в явной транзакции.

0 голосов
/ 24 февраля 2011

У вас может быть много проблем с крупной транзакцией. Во-первых, в большинстве баз данных вы не хотите запускать строку за строкой, потому что для миллиона записей это займет несколько часов. Но вставка миллиона записей в один сложный оператор может привести к блокировке задействованных таблиц и ухудшить производительность для всех остальных. И откат, если вы убьете транзакцию, тоже может занять некоторое время. Обычно лучшая альтернатива - циклическая обработка. Я обычно проверяю 50000 за раз и поднимаю или опускаю набор в зависимости от того, сколько времени это займет. У меня было несколько баз данных, где я делаю не более 1000 в одной операции на основе набора. По возможности большие вставки или обновления должны быть запланированы на непиковые часы работы базы данных. Если он действительно большой (и одноразовый - обычно это миграция больших объемов данных), вам может даже потребоваться закрыть базу данных для обслуживания, перевести ее в однопользовательский режим и удалить индексы, выполнить вставку и переиндексацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...