簡體   English   中英

如何優化更新查詢的性能?

[英]How to optimize performance of update query?

我正在嘗試優化以下更新查詢的性能:

UPDATE a
 SET a.[qty] =
      (
       SELECT MAX(b.[qty])
       FROM [TableA] AS b
       WHERE b.[ID] = a.[ID]
         AND b.[Date] = a.[Date]
         AND b.[qty] <> 0
      )
 FROM [TableA] a
 WHERE a.[qty] = 0
  AND a.[status] = 'New'

它處理一張超過 200m 的大桌子。 行。

我已經嘗試在 [qty,status] 上創建一個索引,但由於最后的索引更新,它並不是很有幫助。 一般來說,在這個表上創建索引並不是那么容易,因為還有很多其他的更新/插入查詢。 所以我想以某種方式重新組織這個查詢。 有任何想法嗎?

TableA 是這樣一個堆:

CREATE TABLE TableA (
    ID            INTEGER       null,
    qty           INTEGER       null,
    date          date          null,
    status        VARCHAR(50)   null,
);

執行計划: https://www.brentozar.com/pastetheplan/?id=S1KLUWO15

沒有看到執行計划和表定義很難回答,但您可以通過使用具有 window 函數的可更新 CTE/派生表來避免自連接

UPDATE a
SET
  qty = a.maxQty
FROM (
    SELECT *,
      MAX(CASE WHEN a.qty <> 0 THEN a.qty END) OVER (PARTITION BY a.ID, a.Date) AS maxQty
    FROM [TableA] a
) a
WHERE a.qty = 0
  AND a.status = 'New';

要支持此查詢,您將需要以下索引

TableA (ID, Date) INCLUDE (qty, status)

兩個鍵列可以按任意順序排列,如果您執行聚簇索引,則INCLUDE列會自動包含在內。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM