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