我有一个包含空字段的表。这需要从另一个表中填充。尽管从另一个表获取信息的语句很简单,但我仍担心更新的性能。
通过计划每30分钟运行一次的脚本来完成更新。
哪个更好:
使用where字段为null的语句更新
UPDATE table1 SET freefield=(SELECT name FROM table2 WHERE table1.keyfield=table2.field) WHERE freefield IS NULL;
使用仅更新最后X条记录的语句进行更新
UPDATE table1 SET freefield=(SELECT name FROM table2 WHERE table1.keyfield=table2.field) WHERE ROWID IN ( SELECT ROWID FROM ( SELECT keyfield FROM table1 ORDER BY keyfield DESC ) WHERE ROWNUM < 300 );
table1.keyfield和table2.field已建立索引并具有主/ fk关系。table1.freefield和table2.name未被索引,而是文本字段。
目前,该表只有约10万条记录,但会大量增加。从本质上讲,我想问的是它需要更长的时间来搜索表中的空字段或对其进行排序并仅使用指定的最新数字。
最终计划是实施一个触发器,以便在创建时可以正确更新记录,但是由于质量控制等原因,直到下一个软件版本才能执行。
数据库是Oracle 10.2.0.5
该表本身具有多个索引,包括主键(递增数字),该索引将用于对最新记录进行排序和更新。
您可以使用基于函数的索引来仅标识具有NULL的行。这样的索引将非常小。
create index index_name
on owner.table_name(case when your_column is null then 'x' end) compress 1;
要更新该列,您可以执行以下操作:
update owner.table_name
set your_column = <your-logic-here>
where (case when your_column is null then 'x' end) = 'x';
更改初始问题后进行编辑:您的两个选项给出的结果不同。只有选项1才能实现“更新所有缺少的缺失freefield
”的要求。
如果每30分钟获得300个以上的插入,则不会使用选项2更新所有插入。此外,您还引入了不必要的依赖关系,将来可能会成立,也可能不会成立:无论何时记录R1.keyfield>记录R2 .keyfield,则记录R1比R2更新。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句