グラフィカルな表示は大変わかりやすいものですが、内容をドキュメントとして保存するような場合には不向きです。内容の保存やワークロードの分析のためには、Oracle ServerのExplain Planのようにテキストベースで出力できたほうがよいでしょう。SQL Serverで実行プランをテキスト出力するためには以下のステートメントを使用します。
 |
・SET SHOWPLAN_TEXT ON
・SET SHOWPLAN_ALL ON |
これらのステートメントは、統計情報を持つsysindexesというシステムテーブルを参照することにより、見積もり値に基づく実行プランを表示するよう、セッション状態を変更します。これらの設定がされていると、クエリを実行しても結果は返らず、代わりにステートメントの実行方法と実行に必要なリソースの見積もりに関する詳細情報が返ります。
「SHOWPLAN_TEXT」と「SHOWPLAN_ALL」の出力の違いは、SHOWPLAN_ALL の出力が、SHOWPLAN_TEXTより多くの情報(クエリの行数、I/Oコスト、CPUコストなどの見積もり)を返すことです。
●SHOWPLAN_ALL実行例
まず、セッション状態を変更します。
set showplan_all on
go
続いて同じセッションで、以下のSQLを実行します。これは【画面1】のグラフィカルな実行プランの図と同じSQL文です。
select * from dbo.Orders O inner join dbo.[Order
Details] D
on O.OrderID = D.OrderID
inner join Products P
on P.ProductID = D.ProductID
以下のように結果が出力されます(ステップの演算説明のみ掲載します。I/Oコストなどの結果は割愛します)。
| select * from dbo.Orders O inner join dbo.[Order
Details] D on O.OrderID = D.OrderID inner join Products P on
P.ProductID = D.ProductID |
 |
|--Hash Match(Inner Join, HASH:([P].[ProductID])=([D].[ProductID])) |
|
 |
|--Clustered Index
Scan(OBJECT:([Northwind].[dbo].[Products].[PK_Products]
AS [P]))
|--Nested Loops(Inner Join, OUTER REFERENCES:([O].[OrderID])) |
|
 |
|--Clustered Index
Scan(OBJECT:([Northwind].[dbo].[Orders].[PK_Orders]
AS [O]))
|--Clustered Index Seek(OBJECT:([Northwind].[dbo].[Order Details].[PK_Order_Details]
AS [D]),
SEEK:([D].[OrderID]=[O].[OrderID]) ORDERED FORWARD) |
|
結果は、Oracle ServerのExplain Planと同様に表示階層の深い方から読みます。上記の例を理解するにはインデックスの知識も必要ですのでここでは詳しく説明しませんが、実行プランの詳細はマイクロソフト認定トレーニングコース「#2073
Microsoft SQL Server 2000 データベースプログラミング」で扱っています。このコースはインデックスアーキテクチャやストアドプロシージャの利用方法なども修得できますので、クエリパフォーマンスの調整をされる方には最適なコースです。
|