[英]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,
);
沒有看到執行計划和表定義很難回答,但您可以通過使用具有 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.