[MSSQL] SQL Server 的一些眉眉角角 part.1

栏目: 数据库 · SQL Server · 发布时间: 7年前

内容简介:目前工作 Database 方面主要都在使用 SQL Server,寫了近兩年的 Stored Procedure 也遇到了許多的問題,在這裡簡單筆記一下。**

目前工作 Database 方面主要都在使用 SQL Server,寫了近兩年的 Stored Procedure 也遇到了許多的問題,在這裡簡單筆記一下。

  1. 暫存資料表小知識

* ### 建立的暫存資料表,可從 tempdb.暫存資料表 找到。

* # 建立的暫存資料表只有該連線可以取用; ## 則是全部連線均可使用。

* 連線結束時皆會自動刪除,若程式中有 Connection Pool 來管理連線則不會立刻刪除。

* 父層 Stored Procedure 建立的暫存資料表子層也可以使用;子層 Stored Procedure 建立的暫存資料表父層也可以使用

  1. 若開啟交易 (Transaction) 但無提交異動 (Commit) 會發生資料表鎖死 (Table Lock) 的問題,切記要提交異動 (Commit)。

  2. 使用主鍵來 UPDATE 為資料鎖 (Row Lock),若使用其他條件則有可能會升級成資料頁鎖(Page Lock) 或資料表鎖 (Table Lock)。

  3. 交易 (Transaction) 具有復原機制 (RollBack),但實際上資料表中的資料已經被異動且鎖定的關係所以無法取得,可利用 WITH(NOLOCK) 來取得被鎖定的髒資料。

  4. 未開啟交易時使用 CURSORUPDATE FROM 若超過五千筆時可能會造成鎖定與死結,可使用 ROW_NUMBER() 排序資料塞入暫存資料表並使用 WHILE 來一筆一筆更新資料避開鎖定,速度雖慢但能減少鎖死。

SET NOCOUNT ON
 
DECLARE
@RowNum INT,
@RowCount INT,
@Temp_Id INT
 
SELECT
ROW_NUMBER() OVER(ORDER BY [Id]) AS RowNum,
[Id],
[Name]
INTO
#Temp
FROM
[exfast].[dbo].[TableA] WITH(NOLOCK)
 
SELECT
@RowNum = 1,
@RowCount = (SELECT SUM(1) FROM #Temp)
 
WHILE(@RowNum <= @RowCount)
BEGIN
 
SELECT
@Temp_Id = [Id]
FROM
#Temp
WHERE
RowNum = @RowNum
 
UPDATE
[exfast].[dbo].[TableA]
SET
[Name] = 'dddd'
WHERE
[Id] = @Temp_Id
 
SET @RowNum = @RowNum + 1
 
END
 
DROP TABLE #Temp
 
  1. 高負載情況下使用 UPDATE OUTPUT 的方法來取得資料更新前後的狀態,可減少 SELECT 次數提高效率。
DECLARE @TempA TABLE
(
[INSERTED_Id] INT,
[INSERTED_Name] NVARCHAR(32),
[DELETED_Id] INT,
[DELETED_Name] NVARCHAR(32)
)
 
UPDATE
[exfast.Helper].[dbo].[TableA]
SET
[Name] = 'qqqq'
OUTPUT
INSERTED.[Id],
INSERTED.[Name],
DELETED.[Id],
DELETED.[Name]
INTO
@TempA
 
SELECT * FROM @TempA
 
  1. 高負載情況下可能會將隔離層級拉高到 Serializable ,這時使用交易會發生相同資料表 SELECT UPDATE 中的 Shared Lock 與 Exclusive Lock 撞車造成 DeadLock ,可在 SELECT 加上 WITH(UPDLOCK) 來減少此問題。
-- 故意指定隔離層級模擬撞車的情況
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
 
BEGIN TRAN
 
SELECT * FROM [exfast.Helper].[dbo].[TableA]
 
WAITFOR DELAY '00:00:10'
 
UPDATE
[exfast.Helper].[dbo].[TableA]
SET
[Name] = 'cccc'
WHERE
[Id] = 2
 
ROLLBACK
 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

单元测试之道Java版

单元测试之道Java版

David Thomas、Andrew Hunt / 陈伟柱、陶文 / 电子工业 / 2005-1 / 25.00元

程序员修炼三部曲丛书包含了四本书,介绍了每个注重实效的程序员和成功团队所必备的一些工具。 注重实效的程序员都会利用反馈来指导开发,并驱动个人的开发流程。编码的时候,最有用的反馈来自于“单元测试”。 为了测试一座桥梁,不会只在晴朗的天气,开一辆汽车从桥中间穿过,就认为已经完成了对桥梁的测试。然而许多程序员却正在使用这种测试方法——把这种一次顺利通过称为“测试”。事实上,注重实效的程序员应......一起来看看 《单元测试之道Java版》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试