[英]SQL where-clause speed up
這個查詢
UPDATE table
SET stringcol = REPLACE(stringcol, 'tester1', 'tester2')
WHERE stringcol LIKE '%tester1%'
(在大桌子上)運行速度幾乎是此表的兩倍
UPDATE table
SET stringcol = REPLACE(stringcol, 'tester1', 'tester2')
其中僅省略了WHERE
子句。
我認為這是一個非常奇怪的結果。
在第一個查詢,數據庫必須首先搜索每stringcol
在表中的出現tester1
。 然后,將表的縮小子集傳遞給REPLACE
函數,該函數需要再次找到tester1
才能替換它。
在第二個查詢中,數據庫引擎必須在表中的每個stringcol
中搜索是否出現tester1
,並進行相應的替換。
如果有的話,我希望第一個查詢的運行速度會變慢,因為WHERE
子句和REPLACE
函數都檢查tester1
的出現。
我想我對數據庫如何處理查詢的分析過於簡單。 有人可以解釋一下性能差異嗎?
沒有WHERE
子句的查詢將替換應用於表中的每一行。 這意味着對於每條記錄,您將鎖定該行存儲stringcol
的磁盤區域,並讀取內容,執行替換並將其寫回。 根據數據庫的不同,即使數據沒有變化,也會發生這種情況。 這可能很聰明,因為與將更改寫入磁盤相比,驗證是否存在更改可能需要更長的時間。 同樣,由於單個語句正在更新每條記錄,因此數據庫將創建每項更改的事務日志。
添加WHERE
子句將至少在進行更改之前過濾每一行。 即使LIKE '%value%'
不使用索引,DB也會在獲取鎖並更新值之前檢查字段的值。 這可能會導致鎖定的行數和應用的更改數量大大減少。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.