如何控制SQLServer中的跟蹤標(biāo)記
跟蹤標(biāo)記是什么?
對(duì)于DBA來(lái)說(shuō),掌握Trace Flag是一個(gè)成為SQL Server高手的必要條件之一,在大多數(shù)情況下,Trace Flag只是一個(gè)劍走偏鋒的奇招,不必要,但在很多情況下,會(huì)使用這些標(biāo)記可以讓你更好的控制SQL Server的行為。
下面是官方對(duì)于Trace Flag的標(biāo)記:
跟蹤標(biāo)記是一個(gè)標(biāo)記,用于啟用或禁用SQL Server的某些行為。
由上面的定義不難看出,Trace Flag是一種用來(lái)控制SQL Server的行為的方式。很多DBA對(duì)Trace Flag都存在一些誤區(qū),認(rèn)為只有在測(cè)試和開(kāi)發(fā)環(huán)境中才有可能用到Trace Flag,這種想法只能說(shuō)部分正確,因此對(duì)于Trace Flag可以分為兩類(lèi),適合在生產(chǎn)環(huán)境中使用的和不適合在生產(chǎn)環(huán)境中使用的。
Important:Trace Flag屬于劍走偏鋒的招數(shù),在使用Trace Flag做優(yōu)化之前,先Apply基本的Best Practice。
如何控制跟蹤標(biāo)記
控制跟蹤標(biāo)記的方式有以下三種:
1.通過(guò)DBCC命令
可以通過(guò)DBCC命令來(lái)啟用或關(guān)閉跟蹤標(biāo)記,這種方式的好處是簡(jiǎn)單易用,分別使用下面三個(gè)命令來(lái)啟用,禁用已經(jīng)查看跟蹤標(biāo)記的狀態(tài):
DBCC TRACEON(2203,-1)
DBCC TRACEOFF(2203,1)
DBCC TRACESTATUS
其中,TRACEON和TRACEOFF第二個(gè)參數(shù)代表啟用標(biāo)志的范圍,1是Session Scope,-1是Global Scope,如果不指定該值,則保持默認(rèn)值Session Scope。
另外,值得說(shuō)的是,如果你希望在每次SQL Server服務(wù)啟動(dòng)時(shí)通過(guò)DBCC命令控制某些Flag,則使用
EXEC sp_procoption @ProcName = '<procedure name>' , @OptionName = ] 'startup' , @OptionValue = 'on';
這個(gè)存儲(chǔ)過(guò)程來(lái)指定,sp_procoption存儲(chǔ)過(guò)程會(huì)在SQL Server服務(wù)器啟動(dòng)時(shí)自動(dòng)執(zhí)行。
還有一點(diǎn)值得注意的是,不是所有的跟蹤標(biāo)記都可以用DBCC命令啟動(dòng),比如Flag 835就只能通過(guò)啟動(dòng)參數(shù)指定。
2.通過(guò)在SQL Server配置管理器中指定
這種方式是通過(guò)在數(shù)據(jù)庫(kù)引擎啟動(dòng)項(xiàng)里加啟動(dòng)參數(shù)設(shè)置,只有Global Scope。格式為-T#跟蹤標(biāo)記1;T跟蹤標(biāo)記2;T跟蹤標(biāo)記3。
3.通過(guò)注冊(cè)表啟動(dòng)
這種方式和方法2大同小異,就不多說(shuō)了。
一些在生產(chǎn)環(huán)境中可能需要的跟蹤標(biāo)記
Trace Flag 610
減少日志產(chǎn)生量。如果你對(duì)于日志用了很多基礎(chǔ)的best practice,比如說(shuō)只有一個(gè)日志文件、VLF數(shù)量適當(dāng)、單獨(dú)存儲(chǔ),如果還是不能緩解日志過(guò)大的話,考慮使用該跟蹤標(biāo)記。
參考資料:
http://msdn.microsoft.com/en-us/library/dd425070.aspx
Trace Flag 834
使用 Microsoft Windows 大頁(yè)面緩沖池分配。如果服務(wù)器是SQL Server專(zhuān)用服務(wù)器的話,值得開(kāi)啟該跟蹤標(biāo)記。
Trace Flag 835
允許SQL Server 2005和2008標(biāo)準(zhǔn)版使用"鎖定內(nèi)存頁(yè)",和在組策略中設(shè)置的結(jié)果大同小異,但是允許在標(biāo)準(zhǔn)版中使用.
Trace Flag 1118
tempdb分配整個(gè)區(qū),而不是混合區(qū),減少SGAM頁(yè)爭(zhēng)搶。
當(dāng)apply tempdb的best practice之后,還遇到爭(zhēng)搶問(wèn)題,考慮使用該跟蹤標(biāo)記。
參考資料:
Trace Flag 1204和1222
這兩個(gè)跟蹤標(biāo)記都是將死鎖寫(xiě)到錯(cuò)誤日志中,不過(guò)1204是以文本格式進(jìn)行,而1222是以XML格式保存??梢酝ㄟ^(guò)
sp_readerrorlog查看日志。
Trace Flag 1211和1224
兩種方式都是禁用鎖升級(jí)。但行為有所差別1211是無(wú)論何時(shí)都不會(huì)鎖升級(jí),而1224在內(nèi)存壓力大的時(shí)候會(huì)啟用鎖升級(jí),從而避免了out-of-locks錯(cuò)誤。當(dāng)兩個(gè)跟蹤標(biāo)記都啟用是,1211的優(yōu)先級(jí)更高。
Trace Flag 2528
禁用并行執(zhí)行DBCC CHECKDB, DBCC CHECKFILEGROUP,DBCC CHECKTABLE。這意味著這幾個(gè)命令只能單線程執(zhí)行,這可能會(huì)需要更多的時(shí)間,但是在某些特定情況下還是有些用處。
Trace Flag 3226
防止日志記錄成功的備份。如果日志備份過(guò)于頻繁的話,會(huì)產(chǎn)生大量錯(cuò)誤日志,啟用該跟蹤標(biāo)記可以使得日志備份不再被記錄到錯(cuò)誤日志。
Trace Flag 4199
所有KB補(bǔ)丁對(duì)于查詢分析器行為的修改都生效,這個(gè)命令比較危險(xiǎn),可能掃稱(chēng)性能的下降,具體請(qǐng)參看:
http://support.microsoft.com/kb/974006
不應(yīng)該在生產(chǎn)環(huán)境中啟用的跟蹤標(biāo)記
Trace Flag 806
在讀取過(guò)程中對(duì)頁(yè)檢查邏輯一致性,在錯(cuò)誤日志中就可以看到類(lèi)似下面的信息:
2004-06-25 11:29:04.11 spid51 錯(cuò)誤: 823,嚴(yán)重性: 24 日狀態(tài): 22004-06-25 11:29:04.11 spid51 I/O 錯(cuò)誤 (審核失?。?在讀取過(guò)程中檢測(cè)到的偏移量主題 SQL Server\MSSQL\data\pubs.mdf e:\Program 文件中的 0x000000000b0000.
參考資料:http://support.microsoft.com/kb/841776
該跟蹤標(biāo)記會(huì)極大的降低性能?。?!
Trace Flag 818
檢查寫(xiě)一致性
蹤標(biāo)志 818 啟用了 一個(gè)內(nèi)存中的環(huán)形緩沖區(qū),用于跟蹤由運(yùn)行 SQL Server 的計(jì)算機(jī)執(zhí)行的最后 2,048 個(gè)成功寫(xiě)操作(不包括排序和工作文件 I/O)。發(fā)生 605、823 或 3448 之類(lèi)的錯(cuò)誤時(shí),將傳入緩沖區(qū)的日志序列號(hào) (LSN) 值與最新寫(xiě)入列表進(jìn)行比較。如果在讀操作期間檢索到的 LSN 比在寫(xiě)操作期間指定的更舊,就會(huì)在 SQL Server 錯(cuò)誤日志中記錄一條新的錯(cuò)誤信息。大部分 SQL Server 寫(xiě)操作以檢查點(diǎn)或惰性寫(xiě)入形式出現(xiàn)。惰性寫(xiě)入是一項(xiàng)使用異步 I/O 操作的后臺(tái)任務(wù)。環(huán)形緩沖區(qū)的實(shí)現(xiàn)是輕量的,因此對(duì)系統(tǒng)性能的影響可以忽略。
Trace Flag 1200
DBCC TRACEON(1200,-1)DBCC TRACEON(3604)DBCC TRACESTATUSSELECT * FROM AdventureWorks.person.Address
參考資料:
http://stackoverflow.com/questions/7449061/nolock-on-a-temp-table-in-sql-server-2008
Trace Flag 1806
禁用即時(shí)文件初始化,所有的磁盤(pán)空間請(qǐng)求全部使用填0初始化,可能造成在空間增長(zhǎng)時(shí)產(chǎn)生阻塞。
Trace Flag 3502
在日志中顯示有關(guān)checkpoint的相關(guān)信息。如圖1所示。
圖1.在錯(cuò)誤日志中顯示Checkpoint
Trace Flag 3505
不允許自動(dòng)進(jìn)行checkpoint,checkpoint只能手動(dòng)進(jìn)行,是非常危險(xiǎn)的一個(gè)命令。
小結(jié)
跟蹤標(biāo)志是控制SQL Server行為的一種方式,對(duì)于某些跟蹤標(biāo)志來(lái)說(shuō),可以在生產(chǎn)環(huán)境中提高性能,而對(duì)于另一些來(lái)說(shuō),用在生產(chǎn)環(huán)境中是一件非常危險(xiǎn)的事情,只有在測(cè)試環(huán)境中才能被使用。要記住,跟蹤標(biāo)記對(duì)于調(diào)優(yōu)是一種劍走偏鋒的手段,只有在使用了所有基本的調(diào)優(yōu)手段之后,才考慮使用跟蹤標(biāo)記。
相關(guān)文章
使用linux?CentOS本地部署SQL?Server數(shù)據(jù)庫(kù)超詳細(xì)步驟
作為一名Linux愛(ài)好者,我們?cè)谑褂肔inux系統(tǒng)的時(shí)候,經(jīng)常需要使用到數(shù)據(jù)庫(kù),下面這篇文章主要給大家介紹了關(guān)于使用linux?CentOS本地部署SQL?Server數(shù)據(jù)庫(kù)的超詳細(xì)步驟,需要的朋友可以參考下2024-01-01sql server 自定義分割月功能詳解及實(shí)現(xiàn)代碼
這篇文章主要介紹了sql server 自定義分割月功能詳解及實(shí)現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下2016-10-10如何在SQL Server 2014中用資源調(diào)控器壓制你的存儲(chǔ)?
本文通過(guò)一個(gè)非常簡(jiǎn)單的例子介紹了如何利用SQL Server 2014中的資源調(diào)控器(Resource Governor)來(lái)壓制你的存儲(chǔ),需要的朋友可以參考下2015-07-07SQL?Server數(shù)據(jù)庫(kù)命令整理大全
剛開(kāi)始學(xué)數(shù)據(jù)庫(kù),可能一下子記不住那么多的命令,或者命令太多,容易混淆,不知道如何選擇最合適的那一條,所以我在這里整理好了一份經(jīng)常會(huì)用到的一些,這篇文章主要給大家介紹了關(guān)于SQL?Server數(shù)據(jù)庫(kù)命令整理大全的相關(guān)資料,需要的朋友可以參考下2024-05-05sqlserver關(guān)于分頁(yè)存儲(chǔ)過(guò)程的優(yōu)化【讓數(shù)據(jù)庫(kù)按我們的意思執(zhí)行查詢計(jì)劃】
先來(lái)對(duì)比兩段分頁(yè)SQL,假設(shè)條件:news表有15萬(wàn)記錄,NewsTypeId=10有9萬(wàn)記錄,當(dāng)前查詢NewsTypeID=10。那么,你會(huì)認(rèn)為哪個(gè)SQL效率會(huì)高呢?2011-08-08SQL中的單條件判斷函數(shù)IF和多條件判斷CASE WHEN的用法
MySQL提供了IF、IFNULL、CASE等條件判斷函數(shù),本文就來(lái)介紹一下SQL中的單條件判斷函數(shù)IF和多條件判斷CASE WHEN的用法,感興趣的可以了解一下2023-10-10關(guān)于Select Where In 的排序問(wèn)題
有很多人不知道SQL里怎么按 Select Where In 的內(nèi)容進(jìn)行字段排序.假如SQL語(yǔ)句為:2008-03-03SQL Server 查詢處理中的各個(gè)階段(SQL執(zhí)行順序)示例
SQL不同于與其他編程語(yǔ)言的最明顯特征是處理代碼的順序,以下就為大家詳細(xì)的介紹一下,需要的朋友可以參考下2013-07-07