SQL 文と SQL 統計の分析
このページでは、SQL 文と SQL 実行時統計情報を表示して読み取り、クエリのパフォーマンスを分析する方法について説明します。これらのツールはどちらも、システム上でクエリがどの程度のパフォーマンスで動作しているかを概要レベルで把握するうえで有用です。
SQL 文は、SQL クエリとその他の操作のレコードをテーブルごとに提供します。このような操作として、挿入、更新、削除などがあります。これらの文は、クエリ・プランにリンクしていて、このリンクはそのクエリ・プランを凍結するオプションを提供します。SQL DML 操作のたびに SQL 文が作成されてリストに格納されます。このリストは、管理ポータルで確認できます。テーブル定義を変更する場合は、このリストを使用して、それぞれの SQL 操作のクエリ・プランがその DML 変更の影響を受けるかどうか、また SQL 操作を変更する必要があるかどうかを判断できます。その後で、以下のことが可能になります。
-
それぞれの SQL 操作に、どのクエリ・プランを使用するかの判断が可能になります。テーブル定義の変更を反映して改訂したクエリ・プランを使用できるほか、現在のクエリ・プランを凍結して、テーブル定義を変更する前に生成されたクエリ・プランを維持することもできます。
-
テーブル定義への変更に基づいて、そのテーブルに対して SQL 操作を実行するルーチンにコードの変更を加えるかどうかの判断が可能になります。
SQL 文は、テーブル定義への変更の影響を受ける可能性がある SQL ルーチンのリストです。テーブル定義やテーブル・データへの変更の履歴としては使用しないでください。
SQL 実行時統計情報により、すべての SQL クエリの実行に関する基本的なメトリックを追跡して、クエリのパフォーマンス概要の履歴を入手できます。この統計情報の収集を有効にしておくと、収集プロセスがタイムアウトするまで、クエリの実行時パフォーマンスに関するメトリックが自動的に収集されます。この統計情報を分析すると、スキーマがどのようなパフォーマンスで動作しているかに関する洞察が得られ、SQL パフォーマンス分析ツールキットを使用して、どのクエリをさらに詳しく調査する必要があるかを判断できます。
SQL 文を作成する操作
以下の SQL 操作により、対応する SQL 文が作成されます。
-
データ管理 (DML) 操作:テーブルに対するクエリと、挿入操作、更新操作、削除操作が含まれます。各データ管理 (DML) 操作 (ダイナミック SQL と埋め込み SQL の両方) では、操作の実行時に SQL 文が作成されます。ダイナミック SQL の SELECT コマンドは、管理ポータルのクエリ・キャッシュ・リストにエントリを作成します。
-
埋め込み SQL カーソルベースの SELECT コマンドでは、OPEN コマンドで DECLARED クエリを呼び出した場合にのみ、SQL 文が生成されます。管理ポータルの [クエリキャッシュ] リストに別個のエントリは作成されません。
クエリが複数のテーブルを参照している場合は、参照されるすべてのテーブルを [テーブル/ビュー/プロシージャ名] 列にリストする 1 つの SQL 文がネームスペースの [SQLステートメント] リストに作成されます。参照される個々のテーブルそれぞれの [テーブルの SQL 文] リストに、そのクエリに対応するエントリが含まれます。
SQL 文は、クエリが初めて準備される際に作成されます。複数のクライアントが同じクエリを発行した場合は、最初の準備のみが記録されます。例えば、JDBC がクエリを発行し、続いて ODBC が同一のクエリを発行した場合、SQL 文のインデックスには最初の JDBC クライアントに関する情報のみが設定され、ODBC クライアントに関する情報は設定されません。
ほとんどの SQL 文には、クエリ・プランが関連付けられています。クエリ・プランは、作成時には凍結されていません。その後で、このクエリ・プランを凍結プランとして指定できます。クエリ・プランを持つ SQL 文には、SELECT 操作を伴う DML コマンドが含まれます。クエリプランを持たない SQL 文については、後述する “プランの状態” のセクションに示します。
SQL 文は、最新バージョンの SQL 操作のみをリストします。SQL 文を凍結していなければ、InterSystems IRIS® データ・プラットフォームによって次のバージョンに置き換えられます。そのため、ルーチン内で SQL コードを書き換えて呼び出すと、古い SQL コードは SQL 文から削除されます。
その他の SQL 文の操作
以下の SQL コマンドは、より複雑な SQL 文の操作を実行します。
-
CREATE TRIGGER:トリガが定義されたテーブルでは、トリガの定義時とトリガの起動時のどちらの場合も SQL 文は作成されません。ただし、そのトリガが別のテーブルに対して DML 操作を実行する場合は、トリガを定義することで、そのトリガのコードで変更されるテーブルに対する SQL 文が作成されます。[場所] には、トリガが定義されているテーブルを指定します。SQL 文は、トリガの定義時に定義されます。トリガを削除すると、その SQL 文は削除されます。トリガを起動しても、SQL 文は作成されません。
-
CREATE VIEW は、コンパイルされるものがないため、SQL 文が作成されません。また、ソース・テーブルに含まれる SQL 文のプラン・タイムスタンプが変更されることもありません。ただし、ビューの DML コマンドをコンパイルすると、そのビューに対する SQL 文が作成されます。
SQL 文のリスト
以下のように、管理ポータルの SQL インタフェースから SQL 文をリストできます。
-
[SQL 文] タブ:ネームスペース内のすべての SQL 文がリストされます。リストはスキーマごとの照合シーケンスで示されてから、それぞれのスキーマ内のテーブル名/ビュー名ごとに示されます。このリストには、現在のユーザが権限を持つテーブル/ビューのみが含まれます。SQL 文が複数のテーブルを参照する場合は、参照されるすべてのテーブルが [テーブル/ビュー/プロシージャ名] 列にアルファベット順にリストされます。
列のヘッダをクリックすると、SQL 文のリストを [テーブル/ビュー/プロシージャ名]、[プランの状態]、[場所]、[SQL 文テキスト] などのリストの列でソートできます。これらのソート可能な列を使用すると、例えば、すべての凍結プラン ([プランの状態])、すべてのクエリ・キャッシュ ([場所])、最も遅いクエリ ([平均時間]) などをすばやく検索できます。
このタブにある [フィルタ] オプションを使用すると、リストされている SQL 文を特定のサブセットに絞り込むことができます。指定したフィルタ文字列により、SQL 文のリストに含まれるすべてのデータにフィルタが適用されます。最も役立つフィルタは、スキーマ名またはスキーマ名.テーブル名、ルーチンの場所、または SQL 文テキスト内の部分文字列に対するフィルタです。フィルタ文字列では、大文字と小文字は区別されません。ただし、文テキストの句読点の空白に従う必要があります (name,age ではなく name , age)。クエリが複数のテーブルを参照している場合、[テーブル/ビュー/プロシージャ名] 列で参照されるテーブルを選択すると、[フィルタ] には SQL 文が含まれます。[フィルタ] オプションは、ユーザによってカスタマイズされます。
[最大行数] オプションの既定値は 1,000 です。最大値は 10000 です。最小値は 10 です。10,000 を超える SQL 文をリストするには、INFORMATION_SCHEMA.STATEMENTS を使用します。[ページサイズ] オプションと [最大行数] オプションは、ユーザによってカスタマイズされます。
-
[カタログの詳細] タブ:テーブルを選択して、そのテーブルのカタログ詳細を表示します。このタブには、[テーブルの SQL 文] ボタンがあり、そのテーブルに関連付けられている SQL 文を表示できます。SQL 文が複数のテーブルを参照している場合、その SQL 文は参照されるテーブルごとに [テーブルの SQL 文] リストに示されますが、[テーブル名] 列には現在選択されているテーブルのみが示されます。
列のヘッダをクリックすると、リストに含まれる任意の列でテーブルの SQL 文のリストをソートできます。
INFORMATION_SCHEMA.STATEMENTS を使用すると、さまざまな基準で選択した SQL 文をリストできます。詳細は、後述の "SQL 文の問い合わせ" を参照してください。
リストの列
[SQL 文] タブには、ネームスペースのすべての SQL 文がリストされます。[カタログの詳細] タブの [テーブルの SQL 文] ボタンをクリックすると、選択したテーブルの SQL 文がリストされます。どちらのリストにも、以下の列見出しが含まれています。
-
#:リスト行の連続番号。これらの番号は、特定の SQL 文に関連付けられているわけではありません。
-
テーブル/ビュー/プロシージャ名:SQL テーブル (またはビューまたはプロシージャ) の修飾名。クエリで複数のテーブルまたはビューを参照する場合、以下のようになります。
-
ネームスペースの [SQLステートメント] タブの [テーブル/ビュー/プロシージャ名] に、すべてのテーブルとビューが照合順 (大文字と小文字を区別せず、アルファベット順) にリストされます。テーブルとビューを見分けるには、[SQL文] を選択して [SQL 文の詳細] の [ステートメントは以下のリレーションを使用します] を表示します。
-
[テーブルの SQL 文] には、そのテーブルを参照するすべての SQL 文がリストされます。[テーブル/ビュー/プロシージャ名] には、指定したテーブルのみがリストされます。したがって、複数のテーブルの [テーブルの SQL 文] には、同じ SQL 文が表示されることがあります。
-
-
プランの状態
-
新しいプラン
-
実行回数
-
実行回数/日
-
合計時間
-
平均時間
-
StdDev 時間
-
行数
-
行数/日
-
場所:コンパイルされたクエリの場所:
-
Dynamic SQL:クエリ・キャッシュ名。例えば %sqlcq.USER.cls2.1 のようになります。
-
埋め込み SQL:ルーチン名。例えば MyESQL のようになります。
-
ストアド・プロシージャ:ストアド・プロシージャのクラス名。例えば Sample.procNamesJoinSP.1 のようになります。
-
-
SQL 文テキスト:正規化された形式の SQL 文テキスト (128 文字に切り捨てられます)。後述の "SQL 文テキスト" に記載されているように、これはコマンド・テキストとは異なる場合があります。
このタブに表示される [フィルタ] オプションを使用して、[場所] 列の値でフィルタ処理することができます。
プランの状態
[プランの状態] には、以下のいずれかがリストされます。
-
Unfrozen:凍結されていませんが、凍結できます。
-
Unfrozen/Parallel:凍結されておらず、凍結することもできません。
-
Frozen/Explicit:ユーザによって凍結されていますが、未凍結にすることができます。
-
Frozen/Upgrade:InterSystems IRIS バージョンのアップグレードによって凍結されていますが、凍結解除できます。
-
空欄:関連付けられたクエリ・プランがありません。
-
INSERT...VALUES() コマンドは、関連付けられたクエリ・プランがない SQL 文を作成するため、未凍結にすることも凍結することもできません ([プランの状態] 列は空欄になります)。この SQL コマンドはクエリ・プランを生成しませんが、SQL 文のリストに加えておくと便利です。こうすることで、このテーブルに対するすべての SQL 操作をすばやく見つけることができます。例えば、テーブルに列を追加する場合は、そのテーブルに対する SQL INSERT が存在する場所をすべて調べて、この新しい列が含まれるように該当するコマンドを更新する必要があります。
-
カーソル・ベースの UPDATE コマンドや DELETE コマンドには、関連付けられるクエリ・プランがありません。そのため、未凍結にすることも凍結することもできません ([プランの状態] 列は空欄になります)。宣言されたカーソルに対して OPEN コマンドを実行すると、クエリ・プランが関連付けられた SQL 文が生成されます。カーソル (FETCH cursor、UPDATE...WHERE CURRENT OF cursor、DELETE...WHERE CURRENT OF cursor、および CLOSE cursor) を使用する埋め込み SQL 文は、別個の SQL 文を生成しません。カーソル・ベースの UPDATE または DELETE はクエリ・プランを生成しませんが、SQL 文のリストに加えておくと便利です。こうすることで、このテーブルに対するすべての SQL 操作をすばやく見つけることができます。
-
SQL 文テキスト
一般に、SQL 文テキストは SQL コマンドとは異なります。これは、SQL 文の生成によって、大文字/小文字と空白が正規化されるためです。それ以外の相違点は、以下のとおりです。
-
管理ポータル・インタフェースまたは SQL シェル・インタフェースからクエリを発行すると、結果の SQL 文は、SELECT 文の前に DECLARE QRS CURSOR FOR が付加される点で、クエリとは異なります (“QRS” は、生成されたカーソル名の一種になります)。これにより、その文テキストはダイナミック SQL クエリ・キャッシュの文テキストと照合できるようになります。
-
SQL コマンドで未修飾のテーブル名またはビュー名を指定した場合、結果の SQL 文では、スキーマ検索パス (DML の場合で、指定されているとき) または既定のスキーマ名を使用してスキーマが提供されます。
-
SQL 文テキストは、1,024 文字以降が切り捨てられます。完全な SQL 文テキストを確認するには、[SQL 文の詳細] を表示します。
-
単一の SQL コマンドが、複数の SQL 文を生成する場合があります。例えば、クエリがビューを参照する場合、[SQL 文] には、2 つの文テキストが表示されます。1 つはビュー名の下側にリストされ、もう 1 つは基になるテーブル名の下側にリストされます。どちらかの文を凍結すると、両方の文の [プランの状態] が [凍結] になります。
-
SQL 文がデータベース・ドライバを介して準備された場合、SQL 文の生成によって、SQL コメント・オプション (#OPTIONS) が文テキストに追加されます (文 Index のハッシュを生成するために、それらのオプションが必要な場合)。以下に例を示します。
DECLARE C CURSOR FOR SELECT * INTO :%col(1) , :%col(2) , :%col(3) , :%col(4) , :%col(5) FROM SAMPLE . COMPANY /*#OPTIONS {"xDBCIsoLevel":0} */
古い SQL 文
SQL 文に関連付けられているルーチンまたはクラスを削除した場合、その SQL 文リストは自動的には削除されません。このようなタイプの SQL 文リストを「Stale (古い)」と呼びます。この履歴情報や SQL 文に関連付けられた使用率統計にアクセスできると役立つことが多いため、これらの古いエントリは管理ポータルの [SQL 文] リストに保持されています。
[古いものをクリーン] ボタンを使用して、これらの古いエントリを削除できます。[Clean stale] を使用すると、関連付けられたルーチンまたはクラス (テーブル) が存在しなくなったか、SQL 文クエリが含まれなくなった、凍結されていない SQL 文がすべて削除されます。[Clean stale] では、凍結された SQL 文は削除されません。$SYSTEM.SQL.Statement.Clean()Opens in a new tab メソッドを使用して、同じ Clean stale 操作を実行できます。
SQL 文に関連付けられたテーブル (永続クラス) を削除した場合、[テーブル/ビュー/プロシージャ名] 列が変更されます (例:SAMPLE.MYTESTTABLE - Deleted??)。削除されたテーブルの名前はすべて大文字に変換され、"Deleted??" のフラグが設定されます。または、SQL 文が複数のテーブルを参照している場合は、SAMPLE.MYTESTTABLE - Deleted?? Sample.Person のようになります。
-
ダイナミック SQL クエリの場合、テーブルを削除すると、そのテーブルに関連付けられているクエリ・キャッシュがすべて自動的に削除されるため、[場所] 列は空白になります。[Clean stale] によって SQL 文が削除されます。
-
埋め込み SQL クエリの場合、[場所] 列には、クエリの実行に使用されるルーチンの名前が含まれます。ルーチンを変更したために元のクエリが実行されなくなった場合、[場所] 列は空白になります。[Clean stale] によって SQL 文が削除されます。 クエリで使用されているテーブルを削除した場合、テーブルには "Deleted??" のフラグが設定されます。[Clean stale] で SQL 文は削除されません。
SQL 文のインデックスの中には、古くなっているものやルーチン参照が古くなっているものがあるので、それらをクリーンアップするためのシステム・タスクが、すべてのネームスペースで 1 時間に 1 回、自動的に実行されます。この処理はシステム・パフォーマンスを維持するために実行されます。この内部的なクリーンアップは、管理ポータルの SQL 文リストに反映されません。
データ管理 (DML) SQL 文
SQL 文を作成するデータ管理言語 (DML) のコマンドは、INSERT、UPDATE、INSERT OR UPDATE、DELETE、TRUNCATE TABLE、SELECT、および宣言されたカーソルベースの SELECT に対する OPEN カーソルです。ダイナミック SQL や埋め込み SQL を使用して DML コマンドを呼び出すことができます。DML コマンドは 1 つのテーブルまたは 1 つのビューに対して呼び出すことができます。InterSystems IRIS は対応する SQL 文を 1 つ作成します。
ダイナミック SQL が準備されるとき、または埋め込み SQL カーソルを開くときに SQL 文が作成されますが、DML コマンドが実行されるときには作成されません。SQL 文のタイムスタンプには、この SQL コードの呼び出しが発生した時刻が記録されますが、そのクエリが実行された時刻 (または実行されたかどうか) は記録されません。そのため、SQL 文が実際には一度も実行されたことのないテーブル・データへの変更を表していることがあります。
ダイナミック SQL DML コマンドを準備すると、対応する SQL 文が作成されます。この SQL 文に関連付けられている [場所] は、クエリ・キャッシュになります。ダイナミック SQL は、管理ポータル SQL インタフェースまたは SQL Shell インタフェースから SQL を実行したときや、.txt ファイルからインポートしたときに準備されます。未凍結のクエリ・キャッシュを削除すると、対応する SQL 文に [Clean stale] の削除対象としてフラグが設定されます。凍結されたクエリ・キャッシュを削除すると、対応する SQL 文の [場所] の値が削除されます。SQL 文を凍結解除すると、その SQL 文に [Clean stale] の削除対象としてフラグが設定されます。
非カーソル埋め込み SQL データ管理言語 (DML) コマンドを実行すると、対応する SQL 文が作成されます。埋め込み SQL DML コマンドごとに、対応する SQL 文が作成されます。1 つのルーチンに複数の埋め込み SQL コマンドが含まれている場合は、それぞれの埋め込み SQL コマンドごとに個別の SQL 文が作成されます(一部の埋め込み SQL コマンドは、複数の SQL 文を作成します)。SQL 文リストの [場所] 列には、埋め込み SQL を含んでいるルーチンが明示されます。この方法で、SQL 文は埋め込み SQL DML コマンドごとのレコードを維持します。
カーソル・ベースの埋め込み SQL データ管理言語 (DML) ルーチンを開くと、SQL 文がクエリ・プランと共に作成されます。関連する埋め込み SQL 文 (FETCH cursor、CLOSE cursor) により、別個の SQL 文が生成されることはありません。FETCH cursor に続く、関連する UPDATE table WHERE CURRENT OF cursor または DELETE FROM table WHERE CURRENT OF cursor は個別の SQL 文を生成しますが、個別のクエリ・プランは生成しません。
リテラル値を挿入する INSERT コマンドは、[プランの状態] 列が空白の SQL 文を作成します。このコマンドはクエリ・プランを作成しないため、SQL 文を凍結することはできません。
SELECT コマンド
クエリを呼び出すと、対応する SQL 文が作成されます。これは、単純な SELECT 操作、または CURSOR ベースの SELECT/FETCH 操作になります。クエリは、テーブルまたはビューに対して発行できます。このような種類のクエリの重要な詳細を以下に挙げます。
-
JOIN を含んでいるクエリは、各テーブルにまったく同じ SQL 文を作成します。[場所] は、各テーブルのリストに含まれる同一のストアド・クエリになります。[ステートメントは以下のリレーションを使用します] には、"SQL 文の詳細" の "[ルーチン] セクションと [リレーション] セクション" で説明するように、すべてのテーブルがリストされます。
-
selectItem サブクエリを含んでいるクエリは、各テーブルにまったく同じ SQL 文を作成します。[場所] は、各テーブルのリストに含まれる同一のストアド・クエリになります。[ステートメントは以下のリレーションを使用します] には、"SQL 文の詳細" の "[ルーチン] セクションと [リレーション] セクション" で説明するように、すべてのテーブルがリストされます。
-
外部 (リンクされた) テーブルを参照するクエリは凍結できません。
-
FROM 節に %PARALLEL キーワードを含んでいるクエリは、複数の SQL 文を作成することがあります。生成されたこれらの SQL 文を表示するには、以下を呼び出します。
SELECT * FROM INFORMATION_SCHEMA.STATEMENT_CHILDREN
これにより、元のクエリの文ハッシュを含む Statement 列と、生成されたバージョンのクエリの文ハッシュを含む ParentHash 列が表示されます。
%PARALLEL クエリの SQL 文のプランの状態は [Unfrozen/Parallel] であり、凍結することはできません。
-
FROM 節を含んでいないためにテーブルを参照しないクエリも、SQL 文を作成します。例えば、SELECT $LENGTH('this string') は、[テーブル] 列の値が %TSQL_sys.snf の SQL 文を作成します。
SQL 文の詳細
[SQL 文の詳細] は、以下の 2 つの方法で表示できます。
-
[SQL 文] タブで、左側の列の [テーブル/ビュー/プロシージャ名] リンクをクリックして、SQL 文を選択します。これによって、別のタブに [SQL 文の詳細] が表示されます。このインタフェースを使用すると、複数のタブを開いて比較できます。このインタフェースでは、[SQL 実行時統計] ページを表示するための [クエリ・テスト] ボタンも提供されます。
-
テーブルの [カタログの詳細] タブ (または [SQL 文] タブ) で、右側の列の [文テキスト] リンクをクリックして、SQL 文を選択します。これによって、ポップアップ・ウィンドウに [SQL 文の詳細] が表示されます。
どちらかの [SQL 文の詳細] 表示を使用して、クエリ・プランを確認したり、特定のクエリ・プランの凍結および凍結解除を実行したりできます。
[SQL 文の詳細] には、クエリ・プランを凍結または凍結解除するためのボタンが用意されています。また、[ステートメント詳細] に表示された使用率統計をクリアするための [SQL 統計をクリア] ボタン、1 つ以上の SQL 文をファイルにエクスポートするための [エクスポート] ボタン、ページを更新するためのボタンや閉じるためのボタンも用意されています。
[SQL 文の詳細] 表示には以下のセクションがあります。これらの各セクションのタイトルの横にある矢印アイコンを選択することによって、各セクションを展開したり、折りたたんだりすることができます。
-
使用率統計が表示される [ステートメント詳細]
-
[文テキストとクエリ・プラン] (他の場所で説明しています)
[文の詳細] セクション
[文の詳細] セクション:
-
[プランの状態]:[凍結/明示]、[凍結/アップグレード]、[凍結解除]、または [未凍結/パラレル]。[Frozen/Explicit] は、この文のプランがユーザの明示的な操作によって凍結されていて、この SQL 文を生成したコードへの変更にかかわらず、この凍結プランがクエリ・プランとして使用されることを表しています。[Frozen/Upgrade] は、この文のプランが InterSystems IRIS バージョンのアップグレードによって自動的に凍結されていることを表しています。[Unfrozen] は、現在、プランが凍結されていないことと、凍結される可能性があることを表しています。[Unfrozen/Parallel] は、プランが凍結されていないことと、%PARALLEL 処理を使用するために凍結できないことを表しています。NULL (空) のプランの状態は、関連付けられているクエリ・プランが存在しないことを表します。
-
[合計時間]:このクエリの実行にかかった時間 (秒)。
-
[バージョン]:プランを作成した InterSystems IRIS のバージョン。[プランの状態] が [Frozen/Upgrade] の場合は、InterSystems IRIS の以前のバージョンです。クエリ・プランの凍結を解除すると、[プランの状態] は [Unfrozen] に変わり、[バージョン] は現在の InterSystems IRIS バージョンに変わります。
-
[実行回数]:このクエリが実行された回数を示す整数値。このクエリのクエリ・プランが別のプランになるような変更があると (テーブルへのインデックスの追加など)、この回数はリセットされます。
-
[平均時間]:このクエリの実行にかかった平均時間 (秒)。クエリがキャッシュ・クエリの場合、初めてクエリを実行したときにかかる時間は、次回以降にそのクエリ・キャッシュから最適化されたクエリを実行する際にかかる時間よりも大幅に長い可能性が高いです。
-
[行数]:このクエリで返された行または変更された行の合計数。
-
[最初に見た日付]:クエリが初めて実行されたときの日付。これは、クエリが準備された日時である [最終コンパイル日時] とは異なります。
-
[実行回数/日]:このクエリが 1 日に実行された平均回数。
-
[StdDev 時間]:平均実行時間を基準とした、このクエリの合計実行時間の標準偏差。この標準偏差は、このクエリの実行時間が示す変動性の尺度です。
-
[行数/日]:このクエリによって 1 日に返された行数または変更された行数の平均値。
-
[タイムスタンプ]:最初のタイムスタンプは、プランが作成されたときのものです。このタイムスタンプは、凍結/凍結解除の後に更新され、プランが未凍結になった時刻が記録されます (プランが再コンパイルされた時刻ではありません)。凍結解除のタイムスタンプを表示するには、[ページの更新] ボタンのクリックが必要になることがあります。文を含んでいるルーチン/クラスの日付/時刻値を [プラン・タイムスタンプ] と比較することで、ルーチン/クラスが再コンパイルされた場合に、同じクエリ・プランを使用していないことを確認できます。
-
[凍結プランが異なる]:プランを凍結すると、この追加フィールドが表示され、凍結プランが未凍結プランと異なるかどうかが示されます。プランを凍結すると、[文テキストとクエリ・プラン] に凍結プランと未凍結プランが並んで表示され、比較しやすくなります。
-
[ステートメント・ハッシュ]:文定義の内部ハッシュ表現です。これは、SQL 文 Index のキーとして使用されます (内部使用専用)。場合によっては、同じ SQL 文のように見えても、文のハッシュ・エントリが異なることがあります。SQL 文の異なるコード生成を必要とする設定/オプションの相違によって、異なる文ハッシュが生成されます。これは、異なる内部最適化をサポートする異なるクライアント・バージョンや異なるプラットフォームで発生することがあります。
使用率統計
[ステートメント詳細] セクションでは、以下の各フィールドに SQL 文の使用率統計が表示されます。
-
合計時間
-
実行回数
-
平均時間
-
最初に見た日付
-
実行回数/日
-
StdDev 時間
-
行数
-
行数/日
この情報は、最も遅いクエリと実行回数が最も多いクエリを確認するために使用できます。この情報を使用して、最適化によってパフォーマンスを大幅に向上できるクエリを特定できます。
クエリの使用率統計は定期的に更新され、完了したクエリ実行が反映されます。[SQL 統計をクリア] ボタンを使用して、これらのフィールドの値をクリアできます。
InterSystems IRIS では、%PARALLEL サブクエリの使用率統計が独立して記録されません。%PARALLEL サブクエリの統計は、外側のクエリの統計と共に合計されます。並列で実行されるように実装によって生成されたクエリには、それぞれを別々に追跡する使用率統計はありません。
複数の SQL 文を対象としたこれらのクエリ使用率統計は、[SQL 文] タブの表示で確認できます。[SQL 文] タブのリストは任意の列で並べ替えることができます。これによって、例えば、平均時間が最大のクエリを簡単に特定できます。
"SQL 文の問い合わせ" の説明にあるように、INFORMATION.SCHEMA.STATEMENTSOpens in a new tab クラス・プロパティをクエリすることによって、これらのクエリの使用率統計にアクセスできます。また、管理ポータルの [SQL アクティビティ] ページには、進行中のクエリについて、これらの使用率統計が表示されます。
[コンパイル設定] セクション
[コンパイル設定] セクション:
-
[選択モード]:文がコンパイルされたときの SelectMode。DML コマンドの場合は、#sqlcompile select を使用して設定できます。既定値は Logical です。#sqlcompile select=Runtime を指定した場合は、$SYSTEM.SQL.Util.SetOption()Opens in a new tab メソッドの SelectMode オプション呼び出しにより、クエリ結果セットの表示を変更できますが、[選択モード] の値は変更されず、Runtime のままです。
-
[デフォルト・スキーマ]:文がコンパイルされたときに設定された既定のスキーマ名。これは一般的に、コマンドが発行されたときに適用されていた既定のスキーマです。ただし、SQL は、既定のスキーマではなく、スキーマ検索パス (指定されている場合) を使用して未修飾名のスキーマを解決した可能性があります。文が、1 つ以上の #Import マクロ指示文を使用した埋め込み SQL 内の DML コマンドである場合は、#import 指示文によって指定されたスキーマがここにリストされます。
-
[スキーマ・パス]:文がコンパイルされたときに定義されたスキーマ・パス。これはスキーマ検索パスです (指定されている場合)。スキーマ検索パスが指定されていない場合、この設定は空白です。ただし、#Import マクロ指示文で検索パスが指定された DML 埋め込み SQL コマンドの場合は、#import 検索パスが [デフォルト・スキーマ] 設定に表示され、この [スキーマ・パス] 設定は空白になります。
-
[プランのエラー]:このフィールドは、凍結プランの使用時にエラーが発生した場合にのみ表示されます。例えば、クエリ・プランでインデックスが使用されていて、そのクエリ・プランが凍結されている場合、そのインデックスをテーブルから削除すると、[プランのエラー] に次のようなエラーが発生します:Map 'NameIDX' not defined in table 'Sample.Person', but it was specified in the frozen plan for the query.インデックスを削除または追加すると、テーブルがリコンパイルされて、[最終コンパイル日時] の値が変更されます。エラーの原因になった状態を (例えば、欠落しているインデックスを再作成して) 修正した後で、[エラーをクリア] ボタンを使用して [プランのエラー] フィールドをクリアできます。エラー状態の修正後に [エラーをクリア] ボタンを使用すると、[プランのエラー] フィールドと [エラーをクリア] ボタンはどちらも表示されなくなります。詳細は、"エラー状態の凍結プラン" を参照してください。
[ルーチン] セクションと [リレーション] セクション
[文は以下のルーチンで定義されています] セクション:
-
[ルーチン]:クエリ・キャッシュ (ダイナミック SQL DML の場合)、またはルーチン名 (埋め込み SQL DML の場合) に関連付けられたクラス名。
-
[タイプ]:[クラスメソッド] または [MAC ルーチン] (埋め込み SQL DML の場合)。
-
[最終コンパイル日時]:ルーチンの最終コンパイル日時または準備日時。SQL 文が凍結されていない場合は、MAC ルーチンを再コンパイルすることで、このタイムスタンプと [プランのタイムスタンプ] の両方が更新されます。SQL 文が凍結されている場合は、MAC ルーチンを再コンパイルすることで、このタイムスタンプのみが更新されます。[プラン・タイムスタンプ] はプランの凍結を解除するまで変更されません。その後、[プラン・タイムスタンプ] にはプランの凍結を解除した時刻が表示されます。
[文は以下のリレーションを使用します] セクションには、クエリ・プランの作成に使用された 1 つ以上の定義済みテーブルがリストされます。別のテーブルから値を抽出するクエリを使用する INSERT や、別のテーブルを参照する FROM 節を使用する UPDATE または DELETE の場合、ここには両方のテーブルがリストされます。それぞれのテーブルについて、以下の値がリストされます。
-
[テーブル名またはビュー名]:テーブルまたはビューの修飾名。
-
[タイプ]:[テーブル] または [ビュー]。
-
[最終コンパイル日時]:テーブル (永続クラス) が最後にコンパイルされた日時。
-
[クラス名]:テーブルに関連付けられているクラス名。
このセクションには、クラスを再コンパイルするための [クラスのコンパイル] オプションがあります。未凍結のプランを再コンパイルすると、3 つの時刻フィールドのすべてが更新されます。凍結プランを再コンパイルすると、2 つの [最終コンパイル日時] フィールドが更新されますが、[プラン・タイムスタンプ] は更新されません。プランの凍結を解除して、[ページの更新] ボタンをクリックすると、[プラン・タイムスタンプ] はプランの凍結を解除した時刻に更新されます。
SQL 文の問い合わせ
INFORMATION_SCHEMA パッケージのテーブルを使用すると、SQL 文のリストを問い合わせることができます。InterSystems IRIS では、以下のクラスがサポートされます。
-
INFORMATION_SCHEMA.STATEMENTS:現在のネームスペース内で現在のユーザがアクセス可能な SQL 文の Index エントリを格納しています。
-
INFORMATION_SCHEMA.STATEMENT_LOCATIONS:SQL 文が呼び出された各ルーチンの場所を格納しています。永続クラス名またはクエリ・キャッシュ名です。
-
INFORMATION_SCHEMA.STATEMENT_RELATIONS:SQL 文で使用される各テーブルまたはビューのエントリを格納しています。
-
INFORMATION_SCHEMA.CURRENT_STATEMENTS:システムのいずれかのネームスペースで現在実行されている SQL 文 Index エントリを格納しています。%Admin_Operate リソースへのアクセス権を持つユーザであれば、管理ポータルの [SQL アクティビティ] ページで、このテーブルのコンテンツをいつでも調査できます。
これらのクラスを使用するクエリの例を以下に挙げます。
-
SELECT Hash,Frozen,Timestamp,Statement FROM INFORMATION_SCHEMA.STATEMENTS
この例では、ネームスペース内のすべての SQL 文が返され、ハッシュ値 (正規化された SQL 文を一意に識別する計算された ID)、凍結ステータスのフラグ (値 0 から 3)、文が作成されてプランが保存されたときのローカル・タイムスタンプ、および文テキスト自体がリストされます。
-
SELECT Frozen,FrozenDifferent,Timestamp,Statement FROM INFORMATION_SCHEMA.STATEMENTS WHERE Frozen=1 OR Frozen=2
この例では、すべての凍結プランの SQL 文が返され、凍結しない場合に想定されるプランと凍結したプランが異なるかどうかが示されます。未凍結プランの文では Frozen=0 になる場合と Frozen=3 となる場合があることに注意してください。単一行の INSERT など、凍結できない文の場合、Frozen 列には NULL が表示されます。
-
SELECT Statement,Frozen, STATEMENT_LOCATIONS->Location AS Routine,STATEMENT_LOCATIONS->Type AS RoutineType FROM INFORMATION_SCHEMA.STATEMENTS WHERE STATEMENT_RELATIONS->Relation='SAMPLE.PERSON'
この例では、特定の SQL テーブルについて、すべての SQL 文と、その文が含まれているルーチンを返します(テーブル名 (SAMPLE.PERSON) には、SQL 文テキストで使用されているものと同じ文字種 (すべて大文字) を使用する必要があります)。
-
SELECT Statement,Frozen,Frozen_Different, STATEMENT_LOCATIONS->Location AS Routine,STATEMENT_LOCATIONS->Type AS RoutineType FROM INFORMATION_SCHEMA.STATEMENTS WHERE Frozen=1 OR Frozen=2
この例では、現在のネームスペース内で凍結されたプランを持っているすべての SQL 文を返します。
-
SELECT Statement,Frozen, STATEMENT_LOCATIONS->Location AS Routine,STATEMENT_LOCATIONS->Type AS RoutineType FROM INFORMATION_SCHEMA.STATEMENTS WHERE Statement [ ' COUNT ( * ) '
この例では、現在のネームスペース内で COUNT(*) 集約関数を含んでいるすべての SQL 文を返します(文テキスト (COUNT ( * )) には、SQL 文テキストで使用されているものと同じ空白を指定する必要があります)。
SQL 文のエクスポートとインポート
SQL 文を XML 形式のテキスト・ファイルとしてエクスポートまたはインポートすることができます。これにより、凍結プランを別の場所に移動できます。SQL 文のエクスポートとインポートには、関連付けられているクエリ・プランが含まれます。
1 つの SQL 文をエクスポートすることも、ネームスペースのすべての SQL 文をエクスポートすることもできます。
1 つ以上の SQL 文を含む、以前にエクスポートした XML ファイルをインポートできます。
SQL 文のエクスポート
1 つの SQL 文をエクスポートする場合は、以下の手順に従います。
-
[SQL 文の詳細] ページの [エクスポート] ボタンを使用します。管理ポータルの [システムエクスプローラ] SQL インタフェースから、[SQL 文] タブを選択し、文をクリックして [SQL 文の詳細] ページを開きます。[エクスポート] ボタンを選択します。ダイアログ・ボックスが開き、ファイルをサーバ (データ・ファイル) にエクスポートするか、ブラウザにエクスポートするかを選択できます。
-
サーバ (既定値):エクスポート xml ファイルの完全パス名を入力します。初めてエクスポートするとき、このファイルには既定の statementexport.xml という名前が付けられます。異なるパスやファイル名を指定することもできます。SQL 文のファイルを正常にエクスポートしたら、最後に使用したファイル名が既定値になります。
[エクスポートをバックグラウンドで実行] チェック・ボックスには、既定ではチェックが付いていません。
-
ブラウザ:ファイル statementexport.xml をユーザの既定のブラウザの新しいページにエクスポートします。ブラウザ・エクスポート・ファイルに別の名前を指定したり、異なるソフトウェア表示オプションを指定することもできます。
-
-
$SYSTEM.SQL.Statement.ExportFrozenPlans()Opens in a new tab メソッドを使用します。
ネームスペースのすべての SQL 文をエクスポートする場合は、以下の手順に従います。
-
管理ポータルの [すべての文のエクスポート] アクションを使用します。管理ポータルの [システムエクスプローラ] SQL インタフェースから、[アクション] ドロップダウン・リストを選択します。そのリストから [すべての文のエクスポート] を選択します。ダイアログ・ボックスが開き、ネームスペースのすべての SQL 文をサーバ (データ・ファイル) にエクスポートするか、ブラウザにエクスポートするかを選択できます。
-
サーバ (既定値):エクスポート xml ファイルの完全パス名を入力します。初めてエクスポートするとき、このファイルには既定の statementexport.xml という名前が付けられます。異なるパスやファイル名を指定することもできます。SQL 文のファイルを正常にエクスポートしたら、最後に使用したファイル名が既定値になります。
[エクスポートをバックグラウンドで実行] チェック・ボックスには、既定でチェックが付いています。すべての SQL 文をエクスポートする際には、この設定をお勧めします。[エクスポートをバックグラウンドで実行する] にチェックが付いている場合、バックグラウンド・リスト・ページを表示するためのリンクが提供され、このページでバックグラウンド・ジョブのステータスを確認できます。
-
ブラウザ:ファイル statementexport.xml をユーザの既定のブラウザの新しいページにエクスポートします。ブラウザ・エクスポート・ファイルに別の名前を指定したり、異なるソフトウェア表示オプションを指定することもできます。
-
-
$SYSTEM.SQL.Statement.ExportAllFrozenPlans()Opens in a new tab メソッドを使用します。
SQL 文のインポート
以前にエクスポートしたファイルから 1 つの SQL 文または複数の SQL 文をインポートします。
-
管理ポータルの [文のインポート] アクションを使用します。管理ポータルの [システムエクスプローラ] SQL インタフェースから、[アクション] ドロップダウン・リストを選択します。そのリストから [文のインポート] を選択します。ダイアログ・ボックスが開き、インポート XML ファイルの完全パス名を指定できます。
[インポートをバックグラウンドで実行] チェック・ボックスには、既定でチェックが付いています。SQL 文のファイルをインポートする際には、この設定をお勧めします。[インポートをバックグラウンドで実行する] にチェックが付いている場合、バックグラウンド・リスト・ページを表示するためのリンクが提供され、このページでバックグラウンド・ジョブのステータスを確認できます。
-
$SYSTEM.SQL.Statement.ImportFrozenPlans()Opens in a new tab メソッドを使用します。
バックグラウンド・タスクの表示と削除
管理ポータルの [システム処理] オプションから、[バックグラウンドタスク] を選択して、エクスポートおよびインポート・バックグラウンド・タスクのログを表示します。[ログを削除] ボタンを使用すると、このログをクリアすることができます。
SQL 実行時統計情報
SQL 実行時統計情報を使用して、SELECT のクエリ実行時や実行されたコマンドなどの一般的なパフォーマンス統計や、システムで実行されている DDL および DML 文を監視できます。クエリ操作を準備すると、SQL 実行時統計情報が収集されます。これらは、INFORMATION_SCHEMA.STATEMENTS、STATEMENT_DAILY_STATS、STATEMENT_HOURLY_STATS テーブルに表示できます。また、パラメータ収集が有効化されている場合、実行時パラメータに関して収集された統計情報を INFORMATION_SCHEMA.STATEMENT_PARAMETER_STATS テーブルに表示できます。
SQL 実行時統計情報の収集は常にオンになっており、オフにすることはできません。統計情報の収集をできる限り効率化するために、統計情報は設定された間隔でのみ書き込まれます。そのため、収集された実行時統計情報を表示するのに最大 30 分かかることがあります。現在実行中の文を表示するには、INFORMATION_SCHEMA.CURRENT_STATEMENTS テーブルに対してクエリを実行します。
実行時統計情報には以下の情報があります。
-
[平均時間]:クエリの実行に要した時間の平均値 (秒)
-
[実行回数]:クエリが実行された回数を示す値
-
[平均行]:返された行の平均数
-
[平均コマンド]:実行されたコマンドの平均数
SQL 実行時統計情報を明示的に削除 (クリア) できます。クエリ・キャッシュを削除すると、関連するすべての SQL 実行時統計情報が削除されます。テーブルまたはビューを削除すると、関連するすべての SQL 実行時統計情報が削除されます。
プロセス固有の SQL クエリ統計をグローバル統計に集計するためのシステム・タスクが、すべてのネームスペースで 1 時間に 1 回、自動的に実行されます。したがって、グローバル統計には、1 時間以内に収集された統計が反映されていないことがあります。
実行時統計とプラン表示
[SQL 実行時統計] ツールは、実行時統計を含むクエリのプラン表示を表示するために使用できます。
[別のプランを表示] ツールは、クエリの実行時統計を表示して、プラン表示を統計と比較するために使用できます。[プラン表示のオプション] の [別のプランを表示] ツールには、クエリの推定統計が表示されます。実行時統計の収集がアクティブにされていると、[プラン表示を統計と比較] オプションにより、実際の実行時統計が表示されます。実行時統計がアクティブでない場合、このオプションにより推定統計が表示されます。