繁体   English   中英

更新NULL字段与最新记录

[英]Updating NULL Field vs Most Recent Record

我有一个包含空字段的表。 这需要从另一个表中填充。 尽管从另一个表获取信息的语句很简单,但我担心更新的性能。

更新是通过计划每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更新。

最好先执行更新字段为NULL 目的似乎是保留表,因此唯一的NULL值是最新的值。 我坚决主张编写符合您期望的代码。

如果您仅尝试更新最后的XX条记录,则可能会遇到一些可能会丢失某些NULL值的情况:

  • 在该时间段中插入的记录比您预期的要多。
  • 您由于某种原因错过了一个或多个更新周期。

如果您担心性能,则在字段上添加索引以方便查找所需的记录。

最后,如果更新很简单,那么您可以考虑仅使用视图并通过该视图进行所有访问:

create view v_table as
    select coalesce(col, 0) as ReplaceTheNull
    from table;

这种方法将消除更新的需要。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM