Какая процедура более эффективна для обновления, которая влияет на нулевые строки?Обновление нулевых строк, а затем фиксация?
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.
Если обновление не влияет на какие-либо строки, я не думаю, что он откроет транзакцию. Обновления, которые не влияют на какие-либо строки, не отображаются в транзакции v $ (хотя, может быть, есть больше, чем это?) Я думаю, это означает, что нет необходимости в фиксации или откате. Из некоторого простого тестирования кажется, что избежать фиксации примерно в два раза быстрее. Но в любом случае время выполнения десятков тысяч этих операций составляет менее секунды. (Хотя, возможно, бессмысленные коммиты становятся более дорогими, когда есть другие сеансы, которые делают много работы?) –
@jonearles: да, он открывает транзакцию, и она появляется в 'v $ transaction'. – Quassnoi
Он не отображается в транзакции 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] –