2010-09-10 3 views
4

Какая процедура более эффективна для обновления, которая влияет на нулевые строки?Обновление нулевых строк, а затем фиксация?

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.

ответ

5

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

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

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

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

+0

Если обновление не влияет на какие-либо строки, я не думаю, что он откроет транзакцию. Обновления, которые не влияют на какие-либо строки, не отображаются в транзакции v $ (хотя, может быть, есть больше, чем это?) Я думаю, это означает, что нет необходимости в фиксации или откате. Из некоторого простого тестирования кажется, что избежать фиксации примерно в два раза быстрее. Но в любом случае время выполнения десятков тысяч этих операций составляет менее секунды. (Хотя, возможно, бессмысленные коммиты становятся более дорогими, когда есть другие сеансы, которые делают много работы?) –

+1

@jonearles: да, он открывает транзакцию, и она появляется в 'v $ transaction'. – Quassnoi

+0

Он не отображается в транзакции v $ для меня на 10.2.0.1.0 (XE), хотя dbms_transaction.local_transaction_id() возвращает ненулевое значение. Согласно документам, обе они должны показывать активную транзакцию (транзакции). Вот мои команды и результаты, вы получаете что-то другое для транзакции v $? (не считая других сеансов) создать таблицу update_test (номер идентификатора, test1 varchar2 (100)); Создана таблица.] update update_test set test1 = 'asdf' где id = 12345; [0 строк обновлены.] выберите счетчик (*) из транзакции v $; [0] выберите dbms_transaction.local_transaction_id() из dual; [10.35.8322] –

3

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

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

+0

Это правда и хороший совет, хотя он не отвечает на вопрос. Я поддержал его для совета, но дал ответ на фактический «ответ» на вопрос. –

-1

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

Если вы хотите глубже углубиться в коренные причины своей проблемы, я рекомендую вам прочитать эту исчерпывающую (и изнурительную) статью Пияна Рияджа Шамсудина по телефону Tuning ‘log file sync’ Event Waits.

+0

Я никогда не говорил об этом, «главный виновник совершает инструкции SQL, которые обновили нулевые строки». Это было бы моим решением. Альтернативный вариант «серьезного переписывания приложения». –

+0

Это не пытается ответить на вопрос. Вместо этого вы угадываете проблему. –

+0

@StephaniePage - на самом деле я сознательно не пытался угадать проблему. Я думал, что ваш вопрос действительно о причинах LOG FILE SYNC ждет, но, видимо, я ошибся. Виноват. – APC

Смежные вопросы