自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

SQL Server優(yōu)化:SQL Server中Nolock關(guān)鍵字的用法

數(shù)據(jù)庫 SQL Server
SQL Server沒創(chuàng)建一個查詢,都相當(dāng)于創(chuàng)建一個查詢會話,在不同的查詢分析器里面進(jìn)行的查詢操作,可能會影響別的查詢會話。

[[428474]]

1、為什么SQL Server有NOLOCK關(guān)鍵字?

SQL Server沒創(chuàng)建一個查詢,都相當(dāng)于創(chuàng)建一個查詢會話,在不同的查詢分析器里面進(jìn)行的查詢操作,可能會影響別的查詢會話。比較典型的一個例子,如果你正在使用事務(wù)執(zhí)行某一張表的插入或者操作而沒有正確關(guān)閉事務(wù)的情況下,會造成別的會話針對該數(shù)據(jù)表的查詢都會處于阻塞的狀態(tài),從而不能完成查詢的操作。這個時候有兩個解決方案,第一種查詢到阻塞的會話id然后殺掉該會話id,第二種可以使用WITH(NOLOCK)關(guān)鍵字忽略掉阻塞的會話直接查詢出結(jié)果。

簡單來說NOLOCK關(guān)鍵字的作用是防止查詢的時候被別的會話阻塞,從而順利完成查詢的操作。

2、SQL Server有NOLOCK有什么問題

使用NOLOCK關(guān)鍵字可以避免阻塞造成無法查詢出數(shù)據(jù),但使用該關(guān)鍵字會有造成數(shù)據(jù)臟讀的可能。下面舉個例子:

2.1 創(chuàng)建數(shù)據(jù)表

  1. CREATE TABLE [dbo].[userInfo] ( 
  2.   [id] varchar(32) COLLATE Chinese_PRC_CI_AS  NOT NULL
  3.   [userName] nvarchar(30) COLLATE Chinese_PRC_CI_AS  NULL
  4.   [birthday] [dbo].[birthday]  NULL
  5.   CONSTRAINT [PK__userInfo__3213E83F0505C75D]  
  6.   PRIMARY KEY CLUSTERED ([id]) 
  7. WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF
  8.  IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)   
  9. ON [PRIMARY
  10. )   
  11. ON [PRIMARY
  12. GO 
  13. INSERT INTO [dbo].[userInfo] ([id], [userName], [birthday]) 
  14.  VALUES ('123', N'小明''2005-01-02 12:30:00.000'); 
  15. INSERT INTO [dbo].[userInfo] ([id], [userName], [birthday]) 
  16.  VALUES ('125', N'小孫''2005-01-02 12:30:00.000'); 

2.2 創(chuàng)建時候 會話id 為58 開啟事務(wù) 不關(guān)閉事務(wù)

  1. begin tran  
  2. insert into userInfo (id,userName,birthday) 
  3. values ('127','小張','2015-01-02 12:30:00.000'
  4. --commit tran 

2.3 當(dāng)前會話(58)還可以查詢出數(shù)據(jù)

事務(wù)還沒有提交 此時數(shù)據(jù)還在內(nèi)存中,未保存到數(shù)據(jù)庫當(dāng)中。

  1. select * from userInfo 

2.4 新建一個查詢會話 當(dāng)前新建的id是51

  1. select * from userInfo; 
  2. select * from userInfo WITH(NOLOCK); 

2.5 殺掉58會話進(jìn)程

  1. declare @spid  int  
  2. Set @spid  = 58 --鎖表進(jìn)程 
  3. declare @sql varchar(1000) 
  4. set @sql='kill '+cast(@spid  as varchar
  5. exec(@sql) 

3、NOLOCK使用場景

針對那些被頻繁操作(插入、更新、刪除)的表,使用NOLOCK是非常比較適合的,但要考慮到臟讀的情況。

  • 不經(jīng)常修改的數(shù)據(jù)表,省掉鎖定表的時間來大大加快查詢速度。
  • 數(shù)據(jù)量非常大的數(shù)據(jù)表,可以考慮犧牲數(shù)據(jù)安全性來提升查詢的效率;
  • 允許出現(xiàn)臟讀現(xiàn)象的業(yè)務(wù)邏輯,對數(shù)據(jù)完整性要求比較嚴(yán)格的場景不適合,比如電商、銀行等系統(tǒng)。
  • 當(dāng)使用NoLock時,它允許閱讀那些已經(jīng)修改但是還沒有結(jié)束事務(wù)的數(shù)據(jù)。因此要考慮transaction事務(wù)數(shù)據(jù)的實時完整性時,不建議使用。

4、nolock和with(nolock)的區(qū)別

三種查詢寫法

  1. SELECT * FROM A NOLOCK; 
  2. SELECT * FROM A (NOLOCK); 
  3. SELECT * FROM A WITH(NOLOCK); 
  • SQL Server 2005版本中,只支持with(nolock)關(guān)鍵字
  • with(nolock)的寫法非常容易再指定索引
  • 跨數(shù)據(jù)庫服務(wù)器查詢語句時不能用with (nolock) 只能用nolock,同數(shù)據(jù)服務(wù)器查詢時 兩者都可以用-- SQL Server 2008版本之后建議采用WITH(NOLOCK)寫法。

5、表解鎖腳本

  1. -- 查詢被鎖表 
  2. select request_session_id   spid 
  3. ,OBJECT_NAME(resource_associated_entity_id) tableName    
  4. from   sys.dm_tran_locks where resource_type='OBJECT'
  5. --參數(shù)說明 spid   鎖表進(jìn)程 ;tableName   被鎖表名 
  6. -- 解鎖語句 需要拿到spid然后殺掉縮表進(jìn)程 
  7. declare @spid  int  
  8. Set @spid  = 57 --鎖表進(jìn)程 
  9. declare @sql varchar(1000) 
  10. set @sql='kill '+cast(@spid  as varchar
  11. exec(@sql) 

本文轉(zhuǎn)載自微信公眾號「IT技術(shù)分享社區(qū)」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系IT技術(shù)分享社區(qū)公眾號。

個人博客網(wǎng)站:https://programmerblog.xyz

 

責(zé)任編輯:武曉燕 來源: IT技術(shù)分享社區(qū)
相關(guān)推薦

2021-04-18 07:58:22

SQL Server數(shù)據(jù)庫Apply

2010-11-12 14:49:28

SQL Server外

2010-07-23 14:32:43

SQL Server

2010-07-13 16:48:14

SQL Server

2010-07-16 09:06:51

SQL Server數(shù)

2010-11-12 10:53:41

sql server表

2010-11-11 11:13:54

SQL Server

2021-04-21 07:17:16

SQLServer數(shù)據(jù)庫SQL

2011-02-25 14:42:10

SQLwith關(guān)鍵字

2011-08-11 09:12:31

SQL Server nolock

2010-11-10 15:23:55

SQL SERVER

2023-02-02 11:53:44

nolock關(guān)鍵詞SQLserver

2011-09-16 13:15:38

SQL Server優(yōu)化

2010-11-10 14:06:44

SQL Server全

2023-11-10 09:29:30

MySQLExplain

2011-08-18 09:14:32

SQL Server臟讀

2018-04-19 09:02:14

SQL ServerSQL性能優(yōu)化

2009-04-28 13:48:04

SQL Server群集技巧

2021-01-04 15:42:37

SQL索引Explain

2010-07-09 14:51:21

SQL Server
點贊
收藏

51CTO技術(shù)棧公眾號