Обновить нулевые строки, а затем зафиксировать? - PullRequest
4 голосов
/ 11 сентября 2010

Какая процедура более эффективна для обновления, которое затрагивает ноль строк?

UPDATE table SET column = value WHERE id = number;

IF SQL%Rowcount > 0 THEN
 COMMIT;
END IF;

или

UPDATE table SET column = value WHERE id = number;

COMMIT;

Другими словами, если обновление затрагивает нулевые строки и выдается коммит, я вообще несу какие-либо дополнительные расходы?

У меня есть система, которой мешает синхронизация файла журнала, ждет ... и мне интересно, если выдать коммит; для транзакции, которая затрагивает ноль строк, запишет этот оператор в журнал или нет и, таким образом, вызовет больше конфликтов в LGWR.

Ответы [ 3 ]

5 голосов
/ 11 сентября 2010

COMMIT принудительно синхронизирует файл журнала, поэтому системе действительно придется ждать.

Однако, ROLLBACK тоже, и в какой-то момент должно произойти любое из них.

Таким образом, если вы не введете ни COMMIT, ни ROLLBACK, вы просто останетесь с открытой транзакцией, которая рано или поздно будет вызывать ожидание синхронизации журнала.

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

3 голосов
/ 11 сентября 2010

В этом есть риски. Технически, хотя UPDATE может влиять на ноль строк, он может срабатывать до или после запуска триггера обновления таблицы (не на уровне строки) Эти триггеры могут потенциально «делать что-то», что требует фиксации / отката.

Безопаснее проверить, установлено ли LOCAL_TRANSACTION_ID .

0 голосов
/ 11 сентября 2010

Существует множество причин, которые могут лежать в основе ожидания log file sync. Кажется маловероятным, что основной виновник совершает операторы SQL, которые обновили ноль строк. Это правда, что выдача слишком большого количества коммитов может быть причиной этой проблемы. Например, если приложение настроено на фиксацию после каждого оператора (например, с использованием AUTOCOMMIT = TRUE) вместо разработки правильных транзакций. Если это является причиной, то вы ничего не можете сделать, если не считать серьезной переписывания приложения.

Если вы хотите глубже вникнуть в коренные причины вашей проблемы, я рекомендую вам прочитать эту исчерпывающую (и исчерпывающую) статью Pythian's Riyaj Shamsudeen о Настройка ‘log file sync’ Event ждет .

...