【问题标题】:Oracle Sql: Checking the value of the database field before updatingOracle Sql:更新前检查数据库字段的值
【发布时间】:2018-03-31 11:48:43
【问题描述】:

我需要在Merge Into 语句中update 一个表的字段,而我正在做的是这样的

MERGE INTO A_TABLE a
USING (ANOTHER_TABLE b)
ON (SOME_PK)
WHEN MATCHED THEN
UPDATE 
SET a.field = b.field
WHERE a.field != b.field

我的问题是关于我检查这些值是否为equal or not 的最后一行。我可以声称这些表之间可能只有%2 difference。在这种情况下,使用WHERE 子句我会输什么或赢什么?对于这种情况,可能oracle在后面进行了一些优化,更新的字段与将设置的值相同。

【问题讨论】:

  • 将语句留在 . . .假设旧值和新值都不是null
  • 请移除您的一个 cmets。我知道没有问题,我有 dbUnit 测试来证明这一点。我在问什么是优点或缺点。
  • @Erdiİzgi iki durumdaki explain plan dan gelen, cost değerlerine bakmıştınız değil mi Erdi bey?
  • @BarbarosÖzhan 我们不能在这里使用当地语言。但是如果你可以在执行计划之间进行成本评估,那也很好。我只想知道即使值相同,oracle也会完成更新操作。否则,我们都知道更新比读取字段要慢得多。
  • 你的问题不清楚。与什么相比,你输什么或赢什么?在任何情况下,解释计划您的查询并检查它们的行为方式

标签: sql oracle performance sql-update


【解决方案1】:

问题是,我可以使用 WHERE 子句或不使用它来完成此操作。没有 WHERE 语句,我有 1M 更新,有了它,我有 1M 检查 + 20K 更新。我在问哪个更好。

在我看来1M checks + 20K updates 更好。原因:

1) 更新需要更新的行,没有意义进行身份操作A => A

2) 如果您在该表上有触发器,您可能会遇到麻烦。

  • 更新 LAST_UPDATE 日期(每次调用合并看起来整个表都已更改)

  • 插入历史记录表(大量重复)

3) 您可能在该表顶部具有自动刷新的物化视图

4) 更新索引/检查外键的额外开销

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-17
    • 1970-01-01
    • 1970-01-01
    • 2018-01-22
    • 1970-01-01
    • 2011-10-30
    • 1970-01-01
    相关资源
    最近更新 更多