了解SQL Server 2005五個有用的動態(tài)管理對象
SQL Server 2005的新功能為動態(tài)管理對象,它們是在指定時間返回某個數(shù)據(jù)庫實例的特殊狀態(tài)信息的數(shù)據(jù)庫視圖或函數(shù)。這些對象允許數(shù)據(jù)庫管理員或開發(fā)者對數(shù)據(jù)庫服務器進行高效監(jiān)控。動態(tài)管理對象取代了SQL Server以前版本中的許多系統(tǒng)表格,但也為數(shù)據(jù)庫管理員提供更多觀測手段。
服務器上需要監(jiān)控的內(nèi)容,幾乎都有對應的動態(tài)管理對象。既然有這么多動態(tài)管理對象,在這篇文章中逐一進行討論是不實際的。例如,共有12類動態(tài)管理對象,但這里我主要討論我認為相當重要的五個對象,它們分別來自與SQL Server操作系統(tǒng)、目錄和執(zhí)行有關的類中。
這些對象被分為兩類:數(shù)據(jù)庫級別和服務器級別。SQL Server 2005的安全構架有些不同,所以你必須采取一些措施保證你能夠使用本文討論的視圖和函數(shù)。你必須保證使用這些例子的用戶能夠查看對象的SERVER STATE和DATABASE STATE。可以應用GRANT語句來完成這一點。
在我開始介紹動態(tài)管理對象之前,你應該建立一個可用在所有例子里面的表格。列表A是建立這個表格的代碼。
列表A
IF OBJECT_ID('DMVTest') IS NOT NULL
DROP TABLE DMVTest
GO
CREATE TABLE DMVTest
(
C1 INT IDENTITY PRIMARY KEY CLUSTERED,
C2 INT,
C3 CHAR(5)
)
SQL Server操作系統(tǒng)相關動態(tài)管理對象
sys.dm_os_performance_counters:這個視圖返回的信息列舉與SQL Server直接相關的性能統(tǒng)計。返回的信息代表通過Windows性能監(jiān)控器顯示的外部性能計數(shù)器。在SQL Server 2000中,這些數(shù)據(jù)以一個叫做sysperfinfo的系統(tǒng)表格來表示,SQL Server 2005中也有這個表格,但僅用于向后兼容。將來的版本可能會刪除這個表格。
要了解如何應用這個視圖,而不是運行Windows性能監(jiān)控器來獲取系統(tǒng)信息,請運行列表B中的查詢代碼。這個查詢將返回服務器當前時刻的緩存命中率(Buffer Cache Hit Ratio)。緩存命中率指在內(nèi)存中所發(fā)現(xiàn)的SQL Server請求頁面的百分比。如果服務器運轉正常,這個值一般在90%以上。如果這個值低于90%,則意味著服務器將會去硬盤那里恢復數(shù)據(jù)頁面,這可能是服務器需要更多內(nèi)存的信號。
列表B
SELECT
(CAST(SUM(CASE LTRIM(RTRIM(counter_name))
WHEN 'Buffer cache hit ratio'
THEN CAST(cntr_value AS INTEGER) ELSE NULL END) AS FLOAT) /
CAST(SUM(CASE LTRIM(RTRIM(counter_name))
WHEN 'Buffer cache hit ratio base' THEN CAST(cntr_value AS INTEGER)
ELSE NULL END) AS FLOAT)) * 100
AS BufferCacheHitRatio
FROM
sys.dm_os_performance_counters
WHERE
LTRIM(RTRIM([object_name])) LIKE '%:Buffer Manager' AND
[counter_name] LIKE 'Buffer Cache Hit Ratio%'
如果你為了同樣的目的,準備運行上面的查詢,并將得到的結果與運行Windows性能監(jiān)控器顯示的結果進行比較(SQL Server:緩沖器管理器緩存命中率),你會發(fā)現(xiàn)這些數(shù)據(jù)幾乎是一樣的。稍稍研究一下,就可以根據(jù)這個表格開發(fā)出你自己的腳本庫,而不必總是運行Windows性能監(jiān)控器。
Caveat:這個視圖僅限于SQL Server相關的計數(shù)器使用。如果你希望獲得SQL Server之外的數(shù)據(jù),你還是要使用Windows性能監(jiān)控器。
目錄相關動態(tài)管理視圖和函數(shù)
sys.dm_db_index_physical_stats:這個動態(tài)管理函數(shù)為數(shù)據(jù)表格和視圖返回相關數(shù)據(jù)及目錄信息。
查看列表C。這個函數(shù)接受5個參數(shù):數(shù)據(jù)庫的ID、所討論的表格或視圖的ID、表格或視圖上的一個特定目錄的ID(被我忽略)、分區(qū)號(也被我忽略)和一個模式,我將它指定為“DETAILED”。將這些參數(shù)提交給這個函數(shù)會允許你查看DMVTest表格中的所有目錄細節(jié)。
在前面定義的表格中運行列表C中的查詢,你會發(fā)現(xiàn)表格中既沒有頁面也沒有記錄。在DMVTest中增加一條記錄,再運行查詢,就會發(fā)現(xiàn)表格中增加了一個頁面。
INSERT INTO DMVTest(C2, C3)
VALUES(1,1)
列表C
SELECT
OBJECT_NAME([object_id]),*
FROM
sys.dm_db_index_physical_stats (DB_ID(),
OBJECT_ID('DMVTest'),NULL,NULL, 'DETAILED')
這個函數(shù)返回的另一個特別有趣的域為avg_page_space_used_in_percent域,它說明數(shù)據(jù)頁面有多大。從查詢中發(fā)現(xiàn)數(shù)據(jù)頁面約為0.25%。你可以應用這個數(shù)據(jù)來開發(fā)程序,查看數(shù)據(jù)庫表格,并根據(jù)程序中設定的標準,重新為它們編寫目錄。
執(zhí)行相關的動態(tài)管理視圖和函數(shù)
sys.dm_exec_requests:這個視圖顯示發(fā)生在SQL Server實例中的每個請求的有關信息。當你研究服務器阻塞時,由此視圖提供的信息特別有用。讀、寫、會話設置和blocking_session_id是這個視圖返回的一些有用數(shù)據(jù)。blocking_session_id欄指出系統(tǒng)上阻塞數(shù)據(jù)庫請求的會話。稍后,我將舉出一個例子,說明如何確定用戶運行的阻塞請求的語句。
sys.dm_exec_sessions:SQL Server上每個得到驗證的會話由它返回一行。在你希望找出連接到數(shù)據(jù)庫服務器的所有用戶時,可用到這個視圖。它返回session_id、連接通過它建立會話執(zhí)行的讀和寫的程序、以及其它一些會話設置。這個視圖還包含一個叫做is_user_process的BIT域,在查詢這個表格時你可能會用到它。數(shù)值1表示會話為用戶會話而非系統(tǒng)定義的會話。
sys.dm_exec_sql_text:這是一個根據(jù)sql操作返回SQL Server語句的動態(tài)管理函數(shù)。對某些動態(tài)管理函數(shù)而言,SQL Server 2005將正在執(zhí)行的sql語句以散列值存儲。這個散列值可由sys.dm_exec_sql_text動態(tài)管理函數(shù)解析。但是,任何時候你希望將一個函數(shù)與另一個對象連接起來,并從表格或視圖中提交一個域值時,就會需要用到新的APPLY運算符。SQL Server 2005以前的版本并不具備這一功能。(欲了解SQL Server 2005中APPLY運算符的詳細信息,請參閱這篇文章。)
現(xiàn)在我們討論一下如何應用這三個動態(tài)管理函數(shù)。列表D中的查詢列舉出數(shù)據(jù)庫中所有當前用戶請求執(zhí)行的會話、阻塞會話、程序、主機和SQL Server語句。
列表D
SELECT
r.session_id,
r.blocking_session_id,
s.program_name,
s.host_name,
t.text
FROM
sys.dm_exec_requests r
INNER JOIN sys.dm_exec_sessions s ON r.session_id = s.session_id
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) t
WHERE
s.is_user_process = 1
注意我正在使用dm_exec_sql_text函數(shù),并從sys.dm_exec_requests視圖中提交sql_handle域。由sys.dm_exec_requests和sys.dm_exec_sessions視圖返回的每一行,都將調(diào)用sys.dm_exec_sql_text函數(shù)。
測試
對它們進行測試是學習這些新型動態(tài)管理對象的最佳方法。SQL Server在線書籍提供了使用這些對象的一些資料,但動手使用要比閱讀學到更多內(nèi)容。投入一點努力,你就會發(fā)現(xiàn)許多應用對象的新方法,不僅包括這個例子中列出的對象,還包括SQL Server 2005中的動態(tài)管理對象。
關鍵字:SQL Server 2005、數(shù)據(jù)庫、服務器
新文章:
- CentOS7下圖形配置網(wǎng)絡的方法
- CentOS 7如何添加刪除用戶
- 如何解決centos7雙系統(tǒng)后丟失windows啟動項
- CentOS單網(wǎng)卡如何批量添加不同IP段
- CentOS下iconv命令的介紹
- Centos7 SSH密鑰登陸及密碼密鑰雙重驗證詳解
- CentOS 7.1添加刪除用戶的方法
- CentOS查找/掃描局域網(wǎng)打印機IP講解
- CentOS7使用hostapd實現(xiàn)無AP模式的詳解
- su命令不能切換root的解決方法
- 解決VMware下CentOS7網(wǎng)絡重啟出錯
- 解決Centos7雙系統(tǒng)后丟失windows啟動項
- CentOS下如何避免文件覆蓋
- CentOS7和CentOS6系統(tǒng)有什么不同呢
- Centos 6.6默認iptable規(guī)則詳解