1

次のクエリは、同じテーブルを 7 回更新します。これを 1 つのクエリにまとめて、7 回ではなく 1 回だけテーブルを通過するように最適化する方法を教えてください。大規模なデータセット..

ありがとう。

PSそれでもうまくいくかどうかはわかりませんが、各クエリ文字列は正確に計算する前にクエリに依存します..したがって、正確に保つためにそれらを分離しておく必要がある場合は、各文字列を最適化する助けを借りることができます(クエリ) 個別に。

次の 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;';
4

1 に答える 1

3

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
于 2012-07-02T15:54:58.860 に答える