簡體   English   中英

SQL 查詢更新性能

[英]SQL query update performance

我試圖理解為什么帶有 case 的 sql 更新的性能低於帶有 where 子句的兩個單獨的更新。

以下是條件:

  • 如果 column1 in (1, 2, 3) 然后設置 column3 = 'A'
  • 否則設置 column3 = 'B'

我有兩個選擇。

選項1:

UPDATE tableA
SET Column3 = (CASE WHEN column1 IN (1,2,3) THEN 'A' ELSE 'B' END)

選項#2:

UPDATE tableA
SET column3 = 'A'
WHERE column1 IN (1,2,3)

UPDATE tableA
SET column3 = 'B'
WHERE column1 NOT IN (1, 2, 3)

選項 #2 的性能優於第一個。

如果有任何理由,我將不勝感激。

我認為選項 1 具有更好的性能,因為一個查詢沒有 where 子句。

您沒有向我們展示您的表和索引定義,或者您的查詢計划,所以這是一個猜測。

您的第一個查詢基本上意味着:更新表的每一行,將列設置為'A''B' 它沒有 WHERE 子句,因此它必須掃描整個表並更改每一行。

您的第二個選擇,有兩個查詢,有可能使用索引來查找它必須更新的行。 在這兩個查詢之間,您仍然更新所有行。 不過看來你的系統還是省時間的。 可能的原因:

  1. SQL 服務器使用 WHERE 子句更快地查找行。
  2. 每個查詢中更新的行數較小。 這種批量更新的很多成本是提交事務。 (SQL Server 捆綁所有更改並將它們提交到表中,以便它們同時顯示給表的其他用戶。)您的第一個示例的事務可能非常大,涉及很多 IO。

如果你想做這種多行更新,你會明智地做這樣的事情。

UPDATE tableA
SET column3 = 'A'
WHERE column1 IN (1,2,3)
AND column3 <> 'A'

這將跳過不需要更改的行的更新。

暫無
暫無

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

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