SQL Server-聚焦事务对本地变量、临时表、表变量影响以及日志文件存满时如何收缩(三十一)...
前言
接下來我們將SQL Server基礎系列還剩下最后幾節內容結束,后續再來講解SQL Server性能調優,我們開始進入主題。
SQL Server事務對本地變量影響
事務對變量影響具體是指什么意思呢,換句話說就是當我們回滾事務和提交事務之后對本地變量是否起作用呢,下面我們來看下具體例子。
PRINT '回滾事務之后測試' DECLARE @FlagINT INT SET @FlagInt = 1 PRINT @FlagInt ---- 此時變量值為1 BEGIN TRANSACTION SET @FlagInt = 2 ---- 設置變量值為2 PRINT @FlagInt ROLLBACK TRANSACTION PRINT @FlagInt ---- 此時變量值為多少? GO PRINT '--------------------' PRINT '提交事務之后測試' DECLARE @FlagINT INT SET @FlagInt = 1 PRINT @FlagInt ---- 此時變量值為1 BEGIN TRANSACTION SET @FlagInt = 2 ---- 設置變量值為2 PRINT @FlagInt COMMIT TRANSACTION PRINT @FlagInt ---- 此時變量值為多少? GO?
通過上述圖我們能夠很清晰的知道:通過改變本地變量值,但是在回滾后和提交后對變量根本不起作用,所以我們得出結論:本地變量不受事務所影響,因為其作用范圍受到限制。
SQL Server事務對臨時變量影響
我們首先創建一個臨時并插入一條數據,再來開啟事務插入一條數據并回滾事務看其結果如何,具體示例如下:
USE AdventureWorks2012 GO -- 創建臨時表并插入一行數據 CREATE TABLE #TempTable (Col1 VARCHAR(100)) INSERT INTO #TempTable (Col1) VALUES('Temp Table - Outside Tran');--查詢臨時表插入的值 SELECT Col1 AS TempTable_BeforeTransaction FROM #TempTable;BEGIN TRAN -- 插入一行數據 INSERT INTO #TempTable (Col1) VALUES('Temp Table - Inside Tran');ROLLBACK -- 查詢臨時表中的值 SELECT Col1 AS TempTable_AfterTransaction FROM #TempTable;GO -- 刪除臨時表 DROP TABLE #TempTable GO從上圖觀察到當默認插入一條為?Temp Table - Outside Tran?的數據時,接下來我們開啟事務再插入一條為?Temp Table - Inside Tran?的數據,然后進行事務回滾,此時回滾之后的數據和默認插入的數據一致,基于此我們得出結論:臨時表受事務影響。
SQL Server事務對表變量影響
USE AdventureWorks2012 GO-- 創建表變量并插入一行數據 DECLARE @TableVar TABLE(Col1 VARCHAR(100)) INSERT INTO @TableVar (Col1) VALUES('Table Var - Outside Tran');--查詢未開啟事務之前數據 SELECT Col1 AS TableVar_BeforeTransaction FROM @TableVar;BEGIN TRAN -- 開啟事務并插入一行數據 INSERT INTO @TableVar (Col1) VALUES('Table Var - Inside Tran');ROLLBACK--查詢開啟事務之后數據 SELECT Col1 AS TableVar_AfterTransaction FROM @TableVar; GO當默認插入一條為?Table Var - Outside Tran?的數據后,我們開啟事務插入一條為?Table Var - Inside Tran?的數據,接下來再來進行回滾發現其結果仍為?Table Var - Inside Tran?,至此我們得出結論:表變量不受事務所影響。?
收縮日志文件
當日志文件占滿時,我們可能需要收縮日志文件到最小,那么我們該如何做呢?我們可以通過如下三種方式收縮日志文件,請繼續往下看。
收縮方式一(通過新建查詢語句執行)
在SQL Server 2005之前我們可以通過如下做
USE AdventureWorks2012 GO DBCC SHRINKFILE('TruncateLog', 1) BACKUP LOG AdventureWorks2012 WITH TRUNCATE_ONLY DBCC SHRINKFILE('TruncateLog', 1) GO如果在SQL Server 2005下運行上述命令則會出現如下錯誤:
此時我們應該運行如下查詢。
USE [AdventureWorks2012] GO ALTER DATABASE [AdventureWorks2012] SET RECOVERY SIMPLE WITH NO_WAIT DBCC SHRINKFILE(AdventureWorks2012_Log, 1) ALTER DATABASE [AdventureWorks2012] SET RECOVERY FULL WITH NO_WAIT GO此時運行成功將得到如下結果:
此時我們再右鍵數據庫屬性將得到我們收縮后最小的日志文件大小,如下:
收縮日志文件方式二(在正確時間收縮日志文件)
通過右鍵你要收縮的日志文件對應的數據庫的任務->收縮->文件,如下:
收縮日志文件方式三(完全移除日志文件)
有時候我們完全不需要大日志文件,此時我們需要完全移除日志文件來釋放硬盤空間,我們通過以下四步即可達到我們所需。
(1)分離數據庫
(2)重命名日志文件
(3)重新附加不帶日志文件的數據庫
(4)刪除日志文件
演示如下:
總結
本節我們詳細講解了事務對本地變量和表變量不起作用,而對臨時表起作用以及當日志文件占滿時我們采取幾種方式來收縮日志,我們下節開始進入SQL Server基礎系列中有關死鎖的最后幾篇。
轉載于:https://www.cnblogs.com/CreateMyself/p/6395670.html
總結
以上是生活随笔為你收集整理的SQL Server-聚焦事务对本地变量、临时表、表变量影响以及日志文件存满时如何收缩(三十一)...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#中的预处理指令详解
- 下一篇: MOV指令在32位汇编程序和64位汇编程