SQL 提公升查詢效率與避免LOCK發生

2021-06-07 06:11:40 字數 1223 閱讀 1237

13小時前

要提公升sql

的查詢效能,一般來說大家會以建立索引(index)為第一考量。其實除了index的建立之外,當我們在下sql command時,在語法中加一段with (nolock)可以改善線上大量查詢的環境中資料集被lock的現象藉此改善查詢的效能。 

不過有一點千萬要注意的就是,with (nolock)的sql select有可能會造成dirty read。 

例如: 

select count(userid) 

from employee with (nolock) 

join working_group with (nolock) on 

employee.userid = working_group.userid 

因為sql 

server

會執行對應的鎖定一致性檢查。 

欲改善整體資料庫查詢的效能,請將with (nolock)加在您的select語法中table名稱的後面,雖然(nolock)也可以,但是微軟還是建議大家要加with。 

除了簡單的select之外,有join的select語法也是可以使用的。但是delete、insert、update這些需要transaction的指令就不行了… 

有些檔案說,加了with (nolock)的sql查詢效率可以增加33%。 

加了with (nolock)即告訴sql server,我們的這段select指令無需去考慮目前table的transaction lock狀態,因此效能上會有明顯的提公升,而且資料庫系統的lock現象會有明顯的減少(包含dead lock)。 

有一點要特別注意,因為with (nolock)不考慮目前table的transaction lock,因此當有某些資料正處於多個phase交易(例如跨多個table的transaction交易-->如提款系統), 

with (nolock)會讓目前處理交易process的資料被忽略… 

講白話一點,也就是說當使用nolock時,它允許閱讀那些已經修改但是還沒有交易完成的資料。因此如果有需要考量transaction交易資料的即時完整性時,使用with (nolock)就要好好考慮一下。 

如果不需考量transaction,with (nolock)或許是個好用的參考。 

注1:with ( < table_hint > ) 

指定由查詢最佳化器使用的資料表掃瞄、一或多個索引, 

或由查詢最佳化器利用此資料表以及為此陳述式使用鎖定模式。 

多執行緒執行 sql查詢 提公升整體查詢效率

對於複雜的業務sql查詢,可以考慮如下建議。1.先通過sql查詢出主表資訊列表list.2.for迴圈list,補充查詢主表對應的子表資訊。3.在2的步驟中,可以使用多執行緒處理for查詢。其中conlist 是查詢主表返回的list 執行緒池初始化 threadpoolexecutor execu...

SQL 查詢效率

其他意見 1 like語句是否屬於sarg取決於所使用的萬用字元的型別 沒意見,開頭的話會走索引掃瞄或表掃瞄 2 or 會引起全表掃瞄 錯了,or只是不能使用左右兩邊謂語的聯合索引,對於類似於 a 1 or b 2 這樣的條件,應該在a和b上單獨建索引 3 非操作符 函式引起的不滿足sarg形式的語...

資料庫查詢提公升查詢效率

在乙個千萬級別的資料庫查詢中,提公升查詢效率方法 對查詢優化,要盡量避免全表掃瞄,首先考慮在where和orderby涉及的列上建索引 應盡量避免在where字句中對null值進行判斷,否則導致引擎放棄索引而進行全表掃瞄,如 select id from t where num is null,可以...