本文導讀:要提高SQL的查詢效能,通常來講你們會以創建索引(index)爲第一考慮。其實除了index的創建以外,當咱們在下SQL Command時,在語法中加一段WITH (NOLOCK)能夠改善在線大量查詢的環境中數據集被LOCK的現象藉此改善查詢的效能。不過有一點千萬要注意的就是,WITH (NOLOCK)的SQL SELECT有可能會形成Dirty Read。html
with(nolock)的介紹安全
你們在寫查詢時,爲了性能,每每會在表後面加一個nolock,或者是with(nolock),其目的就是查詢是不鎖定表,從而達到提升查詢速度的目的。服務器
當同一時間有多個用戶訪問同一資源,併發用戶中若是有用戶對資源作了修改,此時就會對其它用戶產生某些不利的影響,例如:併發
一、髒讀性能
一個用戶對一個資源作了修改,此時另一個用戶正好讀取了這條被修改的記錄,而後,第一個用戶放棄修改,數據回到修改以前,這兩個不一樣的結果就是髒讀。spa
二、不可重複讀htm
一個用戶的一個操做是一個事務,這個事務分兩次讀取同一條記錄,若是第一次讀取後,有另外用戶修改了這個數據,而後第二次讀取的數據正好是其它用戶修改的數據,這樣形成兩次讀取的記錄不一樣,若是事務中鎖定這條記錄就能夠避免。blog
三、幻讀索引
指用戶讀取一批記錄的狀況,用戶兩次查詢同一條件的一批記錄,第一次查詢後,有其它用戶對這批數據作了修改,方法多是修改,刪除,新增,第二次查詢時,會發現第一次查詢的記錄條目有的不在第二次查詢結果中,或者是第二次查詢的條目不在第一次查詢的內容中。事務
NOLOCK 語句執行時不發出共享鎖,容許髒讀 ,等於 READ UNCOMMITTED事務隔離級別 。nolock確實在查詢時能提升速度,但它並非沒有缺點的,起碼它會引發髒讀、只適用與select查詢語句。 在一些不須要考慮髒讀的場合會用到,例如當用戶在論壇發廣告貼時刪除其全部發帖,這個查詢就不怕髒讀,全刪,或者漏一個正在發的都不是問題。
2、實例
SELECT COUNT(UserID)
FROM EMPLOYEE WITH (NOLOCK)
JOIN WORKING_GROUP WITH (NOLOCK)
ON EMPLOYEE.UserID = WORKING_GROUP.UserID
3、with(nolock)的使用場景
1:數據量特別大的表,犧牲數據安全性來提高性能是能夠考慮的;
2:容許出現髒讀現象的業務邏輯,反之一些數據完整性要求比較嚴格的場景就不合適了,像金融方面等。
3:數據不常常修改的表,這樣會省於鎖定表的時間來大大加快查詢速度。
四、當使用NoLock時,它容許閱讀那些已經修改可是尚未交易完成的數據。所以若是有須要考慮transaction事務數據的實時完整性時,使用WITH (NOLOCK)就要好好考慮一下。
4、nolock和with(nolock)的幾個小區別
一、SQL05中的同義詞,只支持with(nolock);
二、with(nolock)的寫法很是容易再指定索引。
三、跨服務器查詢語句時 不能用with (nolock) 只能用nolock,同一個服務器查詢時 則with(nolock)和nolock均可以用
轉自:https://www.cnblogs.com/cjm123/p/8303048.html