Oracle,update语句的工作原理

时间:2009-11-03 23:31:45

标签: performance oracle rowtype

问题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;

感谢

3 个答案:

答案 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;