create table #t( DbName sysname ,FileName SysName ,database_id smallint --資料庫的識別碼 ,file_id smallint --檔案的識別碼 ,sample_ms int --自電腦啟動之後的毫秒數。這個資料行可用來比較這個函數的不同輸出 ,num_of_reads bigint --對檔案發出的讀取數 ,num_of_bytes_read bigint --這個檔案讀取的總位元組數 ,io_stall_read_ms bigint --使用者等候在檔案發出讀取的總時間 (以毫秒為單位) ,num_of_writes bigint --這個檔案所進行的寫入數 ,num_of_bytes_written bigint --寫入檔案的總位元組數 ,io_stall_write_ms bigint --使用者等候檔案完成寫入的總時間 (以毫秒為單位) ,io_stall bigint --使用者等候檔案完成 I/O 的總時間 (以毫秒為單位) ,size_on_disk_bytes bigint --該檔案在磁碟上所用的位元組數。如果是疏鬆檔案,這個數字就是資料庫快照集在磁碟上所用的實際位元組數 ,file_handle varbinary(8) --這個檔案的 Windows 檔案控制代碼 ); exec sp_MSforeachdb @command1="use [?];" INSERT #t SELECT * FROM ( SELECT DB_NAME(database_id) DBName,FILE_NAME(file_id) FileName,* FROM sys.dm_io_virtual_file_stats(DB_ID(N'?'), NULL)) t; SELECT * FROM #t order by DbName; drop table #t
- #t是暫存表格
- exec sp_MSforeachdb @command1="use [?];"
此sp名稱很好猜意思,for each db,會去scan每個db,參數@command1帶入一個"use [?];",即sp_MSforeachdb會幫你做use master;use model; use msdb;…依資料庫id進行切換。 - Insert #t Select * From (),將Select結果寫入暫存表,重點在sys.dm_io_virtual_file_stats()的參數DB_ID(N'?'),N是Unicode名命都能正常執行,'?'會依sp_MSforeachdb每一次執行的結果被替代。如果此次是use master,那此次的?就會被替代為DB_ID(N'master')。
- 可以試著執行「SELECT * FROM sys.dm_io_virtual_file_stats(DB_ID(N'Northwind'), Null);
GO」以了解此系統函數。 - 最後,取出結果,刪除暫存表格#t。
Reference:
沒有留言:
張貼留言
感謝您的留言,如果我的文章你喜歡或對你有幫助,按個「讚」或「分享」它,我會很高興的。