2011-07-17 34 views
1

在SQL Server 2008中,我想查看執行查詢時幕後發生的事情。我能以某種方式看到以下內容嗎?如何查看在查詢執行過程中真正發生了什麼?

  1. 查詢生成的日誌記錄的數量(甚至可能是內容)。
  2. 當日志的內容實際應用於真正的數據結構時。例如:
    1. 何時將新行實際添加到(集羣)索引結構中?
    2. 並且做了更新/插入意味着B樹重新組織(如果是這樣,該B樹的多大部分(多少頁)受到影響)?嗯,也許我應該已經發布了一個關於此的單獨問題...
  3. 每個訪問表的緩衝區未命中數/命中數。
  4. 緩衝區的內容(表中的哪些頁面或多少頁面當前在緩衝區中)?

順便說一句:我認爲這個問題在多個小問題中分解,但我猜他們有點相關。

+1

關於你的問題點2.2的日誌中尋找,直到PageSplit擴展事件在未來得到改善的最好的地方版。 [這裏的一些示例代碼](http://sqlblog.com/blogs/michael_zilberstein/archive/2011/04/25/35175.aspx) –

回答

3

這裏是一個簡單的演示腳本,開始您的學習有關SQL Server內部的旅程。要查看查詢的單個操作,請轉至Paul Randal's SQLSkills Blog

此博客上的其他帖子將涵蓋DBCC PAGE這樣的主題,它允許您查看PAGE和DBCC IND的內容,它將向您顯示錶/索引的分配圖。我建議閱讀詳細介紹所有這些主題的Microsoft SQL Server 2008內部件副本。

事務日誌記錄演示腳本

對於兩個選擇失誤被顯示爲物理讀取和預讀,這些都是從磁盤讀入緩衝池。查詢引擎然後使用這些頁面,這是邏輯讀取。因此,對於熱選中的io統計信息,它沒有物理讀取或預讀讀取,因此所有頁面都已經存在於緩衝池中。

/* -- Cleanup Script 
USE master 
DROP DATABASE ExampleDB 
*/ 
SET NOCOUNT ON 
SET STATISTICS IO OFF 
GO 
CREATE DATABASE ExampleDB 
GO 
USE ExampleDB 
GO 
-- Force a CHECKPOINT to CLEAR the Transaction Log 
CHECKPOINT 
GO 
-- Show Empty Transaction Log 
SELECT * FROM fn_dblog(NULL,NULL) 
GO 
-- CREATE SIMPLE TABLE 
CREATE TABLE NewTable 
(
    A int identity NOT NULL PRIMARY KEY, 
    B char(8000) NOT NULL DEFAULT ('') 
) 
GO 
-- Show Transaction Log With CREATE TABLE records 
SELECT * FROM fn_dblog(NULL,NULL) 
GO 
-- Force a CHECKPOINT to CLEAR the Transaction Log 
CHECKPOINT 
GO 
PRINT 'INSERT Start' 
GO 
INSERT NewTable 
VALUES (DEFAULT) 
GO 1000 
PRINT 'INSERT End' 
GO 
-- Show Transaction Log With INSERT records 
SELECT * FROM fn_dblog(NULL,NULL) 
GO 
-- Turn On IO Statistics (these appear in the messages tab) 
SET STATISTICS IO ON 
GO 
-- Force a CHECKPOINT to CLEAR the Transaction Log and modified buffer pages 
CHECKPOINT 
GO 
-- DROP CLEAN BUFFERS to empty cache 
DBCC DROPCLEANBUFFERS 
GO 
PRINT 'SELECT Start Cold Cache' 
GO 
SELECT * FROM NewTable 
GO 
PRINT 'SELECT End Cold Cache' 
GO 
PRINT 'SELECT Start Warm Cache' 
GO 
SELECT * FROM NewTable 
GO 
PRINT 'SELECT End Warm Cache' 
GO 
-- Force a CHECKPOINT to CLEAR the Transaction Log 
CHECKPOINT 
GO 
DROP TABLE NewTable 
-- Show Transaction Log With DROP TABLE records 
SELECT * FROM fn_dblog(NULL,NULL) 
GO 

緩衝池的內容的出發點是這樣的DMV

SELECT  * 
FROM  sys.dm_os_buffer_descriptors 
+0

非常好的答案。我會很快將它標記爲「答案」。我想我仍然錯過了一個答案是唯一的項目3. – someName

+0

SET STATISTICS IO ON將顯示命中是邏輯讀取和未命中是物理讀取。博客文章還通過查詢在執行期間遇到的各種等待來顯示這些內容。 – MartinC

0

您可以選擇SQL事件探查器並查看存儲過程執行計劃。

相關問題