インデックスの使用回数、断片化情報など、インデックスチューニングのために使用するクエリのサンプルを掲載します。

動作確認はSQL Server 2005 Developer Edition で行っています。

1. インデックスの統計情報を取得する

インデックスの情報の取得に今回は動的管理ビューを使用します。インデックス関連の動的管理ビューはBooks Onlineのインデックス関連の動的管理ビューおよび関数 (Transact-SQL)を参照してください。

1.1 インデックスの断片化情報の取得

インデックスの断片化情報は、インデックス関連の動的管理関数の一つである、sys.dm_db_index_physical_stats 動的管理関数を使用します。インデックス名はsys.indexes 管理ビューと結合を行うことで取得します。

-- データベースのインデックスの断片化情報を取得する
select DB_NAME(s.database_id), OBJECT_NAME(s.object_id), s.index_type_desc
     , i.name, s.fragment_count, s.avg_fragmentation_in_percent
 from sys.dm_db_index_physical_stats(DB_ID('Component'), NULL, NULL, NULL, 'LIMITED') s
INNER JOIN sys.indexes i ON i.object_id = s.object_id
  and i.index_id = s.index_id

1.2 インデックスの使用回数を取得する

SQL Server が起動してから、インデックスの使用回数の統計情報を取得できます。SELECT文などを使用したときに、インデックスが使用された回数を取得することができます。インデックス関連の動的管理ビューの一つであるsys.dm_db_index_usage_stats動的管理ビューを使用します。

-- SQLサーバが起動してからの、インデックス操作の使用回数
-- と直近の実行された時刻を取得します
SELECT *
  FROM sys.dm_db_index_usage_stats
where database_id = DB_ID('Component')
  and OBJECT_ID('dbo.Article') = object_id

2. 統計情報の取得

SET STATICS IO などを使用するとSQL の実行の統計情報を取得できます。TIME, PROFILE, XML などを指定できます。

-- SQLのディスク利用状況に関する情報を表示します
SET STATISTICS IO ON
-- 各SQLの解析、コンパイル、および実行に必要な時間をミリ秒単位で表示します
SET STATISTICS TIME OFF
-- 
SET STATISTICS PROFILE ON
-- SQL を実行し、実行方法に関する詳細情報をウェルフォームド XML ドキュメント形式で生成します
SET STATISTICS XML ON

sys.dm_exec_query_stats 動的管理ビューを使用すると、キャッシュされているクエリの実行プラン(論理,物理リード回数、実行時間など)を取得できます。キャッシュプランをDBCC FREEPROCCACHE を使用してクリアしてから論理リード回数などを取得しています。

-- キャッシュをクリア
DBCC FREEPROCCACHE
GO

SELECT *
  FROM dbo.Article
 WHERE ArticleID = 1
-- キャッシュされたクエリ プランの集計パフォーマンス統計
SELECT sql.text, stat.total_logical_reads, stat.total_physical_reads
  FROM sys.dm_exec_query_stats stat
 CROSS APPLY sys.dm_exec_sql_text(stat.sql_handle) sql

3.推定実行プランの表示

SQL Server Management Studio を使用するとグラフィカルに推定の実行プランと、実行プランを表示することができますが、テキストとして実行コストの見積もりを出力するこができます。SET SHOWPLAN_ALL, SHOWPLAN_TEXT,SHOWPLAN_XML を使用します。

-- SQL ステートメントを実行せず、代わりにステートメントの実行方法と実行に必要なリソースの見積もりに関する詳細情報を返します
SET SHOWPLAN_ALL ON
-- SQL ステートメントを実行せず、代わりにステートメントの実行方法に関する詳細情報を返します
SET SHOWPLAN_TEXT ON
-- SQL ステートメントを実行せず、代わりにステートメントの実行方法に関する詳細情報を、整形式の XML ドキュメントで返します
SET SHOWPLAN_XML ON

4. まとめ

今回の説明は以上です。誤り、指摘点などがありましたらご指摘ください。