【问题标题】:what is better (if) or (where) in sql?什么是更好的(如果)或(哪里)在 sql 中?
【发布时间】:2020-04-26 18:44:40
【问题描述】:

在存储过程中,我想根据一些条件更新一个大数据集,那么有什么更好的:

场景一(一选多如果)

Select All Data records then 
LOOP

IF (Condition1 == true)
  execute update statement
IF (Condition2 == true)
  execute update statements
END LOOP

场景2(多选where)

Select Data where (condition 1) loop
   execute update statements
end loop

Select Data where (condition 2) loop
  execute update statements
end loop

【问题讨论】:

  • 如果是同一张表,为什么不更新一次呢?如果要更新的行数与表的大小相比很小,那么第一种方法肯定会更糟。如果您可以向我们展示实际的声明,也许我们可以帮助编写一个更新
  • 您不应该在一开始就在循环中进行缓慢更新。使用update ... where condition1update ... where condition2
  • 不可能给出适用于所有可能情况的答案。最接近通用答案的是,在 SELECT 驱动循环中执行单个 DML 语句通常是一种反模式。 SQL 是一种面向集合的语言,因此在集合中做事通常是实现任何目标的最有效方式。

标签: sql oracle performance plsql


【解决方案1】:

我不认为在所有场景(数据库产品、选择查询、输入大小等)中都有一个有效的答案,但请记住:

1) 您基于 IF 的解决方案将只有一个选择和一个循环,因此如果系统在选择记录(即非常复杂的查询)上浪费更多时间,最好选择一个循环。

2)您的解决方案基于 WHERE,而不是针对每个条件进行一次查询,因此我会避免超过 2 或 3 个条件,除非它是非常快速的查询(例如,从具有 100 条左右记录的配置表中选择记录)。

3) 另外请记住,您可以将 IF 直接放在 UPDATE 语句中。

一般来说,我会选择 IF (1) 或 (3) 解决方案。

问候

【讨论】:

    【解决方案2】:

    另一种方法是使用MERGE statement,那么您不需要使用循环或分隔SELECTUPDATE 语句:

    MERGE INTO destination dst
    USING (
      SELECT *
      FROM   source
      WHERE  condition = True
    ) src
    ON ( dst.id = src.id )
    WHEN MATCHED THEN
      UPDATE SET column = src.column;
    

    【讨论】:

      猜你喜欢
      • 2017-02-26
      • 2011-02-12
      • 2020-02-25
      • 2016-07-25
      • 2021-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-05
      相关资源
      最近更新 更多