问题1
任何人都可以告诉我以下两个更新声明之间是否有任何区别:
UPDATE TABA SET COL1 = '123', COL2 = '456' WHERE TABA.PK = 1
UPDATE TABA SET COL1 = '123' WHERE TABA.PK = 1
其中COL2的原始值='456'
这对UNDO有何影响?
问题2 如果我使用ROWTYPE更新表TABA中的记录,如下面的代码片段呢? 性能如何,以及它如何影响UNDO?
SampleRT TABA%rowtype
SELECT * INTO SampleRT FROM TABA WHERE PK = 1;
SampleRT.COL2 = '111';
UPDATE TABA SET ROW = SampleRT WHERE PK = SampleRT.PK;
感谢
答案 0 :(得分:4)
您的问题1是询问当您针对行运行UPDATE但是实际上没有更改值时是否生成UNDO(和REDO)?
喜欢什么?
update taba set col2='456' where col2='456';
如果这是问题,那么答案是,即使您将列更新为相同的值,也会生成UNDO(和REDO) 。
(例外情况是您将NULL
列更新为NULL
时 - 这不会产生任何重做。)
答案 1 :(得分:1)
问题1:
表中行的两个UPDATE结果,其中PK = 1且COL2 ='456'是相同的。 (也就是说,每个这样的行都将其COL1值设置为'123'。)
注意:表格中可能有PK = 1和COL2<> '456'。这些行的两个语句的结果将是不同的。两个语句都会改变COL1,但只有第一个语句会改变COL2中的值,第二个语句会保持不变。
答案 2 :(得分:0)
问题1:
根据更新的列,可能会触发触发器。即使您将column_a更新为相同的值,触发器也会触发。 UNDO不应该不同,因为如果扩展或缩小可变长度列的长度(例如VARCHAR或NUMBER),则记录的所有其余字节也需要进行混洗。
如果列没有更改大小,那么您可以在不指定列时获益。您可以使用v $ transaction查询来测试它,以查看生成的撤消。
问题2:
我会更关心内存(特别是如果你是批量收集SELECT *)并触发触发而不是UNDO。 如果您不需要SELECT *,请指定列(例如,如下)
cursor c_1 is select pk, col1, col2 from taba;
SampleRT c_1%rowtype;
SELECT pk, col1, col2 INTO SampleRT FROM TABA WHERE PK = 1;
SampleRT.COL2 = '111';
UPDATE (select pk, col1, col2 from taba)
SET ROW = SampleRT WHERE PK = SampleRT.PK;