簡體   English   中英

SQL子句加速

[英]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.

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