以下 7 个更新查询的 SQL 优化。同一张桌子。合二为一?

Posted

技术标签:

【中文标题】以下 7 个更新查询的 SQL 优化。同一张桌子。合二为一?【英文标题】:SQL optimization on the following 7 update queries. same table. Combine into one? 【发布时间】:2012-07-02 15:38:19 【问题描述】:

以下查询将同一个表更新 7 次。如果您能帮助我将其放入一个查询中,以便它只通过表一次而不是 7 次,我将不胜感激。这真的很慢大型数据集的性能下降..

谢谢。

附:我不知道它是否仍然有效,但每个查询字符串都取决于它之前的查询来准确计算。所以如果我们需要将它们分开以保持准确,那么我可以使用一些帮助来优化每个字符串(查询)单独。

以下 SQL 查询是在 Delphi 2009 中进行的,因此格式可能会有所不同,但您应该仍然能够很容易地阅读查询..

Str1 :=
'update user set amount = ' +
  '(select round(sum(bill.amount),2) from bill where ' +
  'bill.user = user.code); ' +
'update user set pay = ' +
  '(select round(sum(bill.pay),2) from bill where ' +
  'bill.user = user.code); ' +
'update user set balance = round(amount + pay,2);';

//execute query

 Str1 :=
'update user set group_amt = ' +
  '(select sum(bill.amount) from bill where ' +
  'bill.client = user.client); ' +
'update user set group_pay = ' +
  '(select sum(bill.pay) from bill where ' +
  'bill.client = user.client); ' +
'update user set group_bal = round(group_amt + group_pay,2);';

 //execute query

Str1 :=
'update user set bal_flag = true ' +
'where abs(balance) > 0.001 and bal_flag = false;';

【问题讨论】:

您是否必须将此作为所有记录的批处理过程?除非您在处理后删除记录,否则您正在做大量重复工作。另一种方法是在每次写入 bill 中的记录时使用触发器来更新相关记录。 触发器是个好主意,但是我对它们不是很熟悉。我将考虑在未来实施触发器。谢谢。 您使用的是什么关系型数据库? (mysql、SQL Server、Oracle 等?) 我正在使用 Advantage 数据库服务器 9 一些想法:1) 每次运行这些查询时,您都会更新所有用户。你需要这样做吗?当他们登录或进行更改等时,您不能为特定用户执行此操作。如果大多数用户有一段时间没有付款等,为所有用户运行这些查询可能没有意义。 2)余额存储在数据库中?如果这个只用在UI端,还不如在UI端计算出来呈现。 【参考方案1】:

我怀疑您可以将 6 个更新合并为 2 个更新...

UPDATE
  user
SET
  amount   = bill.amount,
  pay      = bill.pay,
  balance  = bill.pay + bill.amount
FROM
(
  SELECT
    user,
    round(sum(bill.amount),2)   AS amount,
    round(sum(bill.pay)   ,2)   AS pay
  FROM
    bill
  GROUP BY
    user
)
  AS bill
WHERE
  bill.user = user.code

几乎相同......

UPDATE
  user
SET
  group_amt = bill.amount,
  group_pay = bill.pay,
  group_bal = bill.pay + bill.amount
FROM
(
  SELECT
    client,
    round(sum(bill.amount),2)   AS amount,
    round(sum(bill.pay)   ,2)   AS pay
  FROM
    bill
  GROUP BY
    client
)
  AS bill
WHERE
  bill.client = user.client

【讨论】:

感谢您帮助优化此查询。

以上是关于以下 7 个更新查询的 SQL 优化。同一张桌子。合二为一?的主要内容,如果未能解决你的问题,请参考以下文章

多个用户在同一张桌子上

更新查询在同一张表上的 Sql 查询死锁

更新同一张表的整列字段

查询同一张表时,spark sql 返回空值,但配置单元和 impaly 获取正常数据?

在同一个sql连接中获取2个不同的记录行

单个SQL查询,用于更新多个字段值