2011-07-17 2 views
1

SQL Server 2008では、クエリが実行されたときに本当に何が起こっているのかを調べたいと思います。私は何とか次のように見ることができますか?どのように見て、何が*本当に*クエリ実行中に起こっている?

  1. クエリによって「生成された」ログレコードの数(場合によってはその内容も含む)。
  2. ログの内容が実際のデータ構造に実際に適用されるとき。例:
    1. 実際に(クラスタリング)インデックス構造に新しい行が追加されるのはいつですか?
    2. 更新と挿入はBツリーの再編成を意味します(もしあれば、そのBツリーのどれくらいの部分が影響を受けるか)。うーん、私はこれについて別の質問を投稿したはずです...
  3. アクセスされた各テーブルのバッファ不足数/ヒット数。
  4. バッファの内容(現在、バッファ内にあるテーブルのページ数)

私はこの質問を複数の小さな質問で分割することを検討しましたが、多少の関連性は高いと思います。

+1

ですバージョン。 [いくつかのサンプルコードはこちら](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 Internalsのコピーを読むことをお勧めします。

2を選択するために

トランザクションログレコードデモスクリプト

に物理読み込みおよび先読み読み取りとしてミスが示され、これらは、ディスクからバッファー・プールに読み込みます。クエリエンジンはこれらのページを使用し、これが論理読み取りです。したがって、ウォームセレクトの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 

PageSplit拡張イベントは、次の中で改善されるまで、ログは見て最高の場所ですあなたの質問のポイント2.2に関しては、このDMV

SELECT  * 
FROM  sys.dm_os_buffer_descriptors 
+0

非常に良い答え。私はまもなくそれを「回答」とマークします。私はまだ答えが紛れている唯一のものはアイテム3だと思う。 – someName

+0

SET STATISTICS IO ONは物理的な読み込みである論理読み書きであるヒットを表示する。ブログ投稿には、実行中にクエリが経験する様々な待機時間を介してこれらが表示されます。 – MartinC

0

SQLプロファイラのオプションがあり、ストアドプロシージャの実行計画を表示できます。

関連する問題