以下 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 优化。同一张桌子。合二为一?的主要内容,如果未能解决你的问题,请参考以下文章