Hash Warning イベント クラス
Hash Warning イベント クラスを使用して、ハッシュ演算中にハッシュの再帰、またはハッシュの中断 (ハッシュの保留) が発生する時点を監視できます。
使用できるメモリ内にビルド入力が収まらないときに、ハッシュの再帰が発生します。その結果、入力が複数のパーティションに分割され、個別に処理されます。複数のパーティションに分割されても使用できるメモリ内に収まらない場合は、さらにサブパーティションに分割され、個別に処理されます。この分割プロセスは、使用できるメモリ内に各パーティションが収まるようになるまで、または (IntegerData データ列に表示された) 最大再帰レベルに到達するまで続けられます。
ハッシュ演算が最大再帰レベルに到達するとハッシュの保留が発生し、パーティション分割された残りのデータを処理するための代替プランに移行されます。通常、ハッシュの保留は非対称データにより発生します。
ハッシュの再帰やハッシュの保留により、サーバーのパフォーマンスが低下することになります。ハッシュの再帰や保留を取り除いたり、頻度を減らすには、次のいずれかの操作を行います。
結合またはグループ化される列に、統計が存在していることを確認します。
列に統計が存在する場合は、統計を更新します。
異なる種類の結合を使用します。たとえば、適切であれば、MERGE 結合または LOOP 結合を代用します。
コンピュータで使用できるメモリを増やします。メモリ不足でクエリを適切に処理できず、ディスクへの書き込みが必要になると、ハッシュの再帰や保留が発生します。
結合に関係する列に統計を作成したり、その統計を更新することが、ハッシュの再帰や保留の発生数を減らすのに最も効果的です。
注 |
---|
猶予ハッシュ結合および再帰的ハッシュ結合という用語は、ハッシュの保留を表すためにも使用されます。詳細については、「ハッシュ結合について」を参照してください。 |
重要 |
---|
クエリ オプティマイザが実行プランを生成するときに Hash Warning イベントが発生している場所を特定するには、トレースで Showplan イベント クラスも収集する必要があります。ノード ID を返さない Showplan Text イベント クラスと Showplan Text (Unencoded) イベント クラスを除く、任意の Showplan イベント クラスを選択できます。Showplans のノード ID で、クエリ オプティマイザがクエリ実行プランの生成時に実行する各操作が特定されます。これらの操作はオペレータと呼ばれ、Showplan の各オペレータにはノード ID があります。Hash Warning イベントの ObjectID 列は Showplan のノード ID に対応するので、エラーの原因であるオペレータつまり操作を判別できます。Showplan イベント クラスの詳細については、「SQL Server Profiler のイベント クラスを使用した実行プランの表示」を参照してください。 |
Hash Warning イベント クラスのデータ列
データ列名 |
データ型 |
説明 |
列 ID |
フィルタの適用 |
---|---|---|---|---|
ApplicationName |
nvarchar |
SQL Server のインスタンスへの接続を作成したクライアント アプリケーションの名前。この列には、プログラムの表示名ではなく、アプリケーションによって渡された値が格納されます。 |
10 |
可 |
ClientProcessID |
int |
クライアント アプリケーションが実行されているプロセスに対し、ホスト コンピュータが割り当てた ID。クライアントによってクライアント プロセス ID が指定された場合、このデータ列にデータが格納されます。 |
9 |
可 |
DatabaseID |
int |
USE database ステートメントで指定されたデータベースの ID。特定のインスタンスについて USE database ステートメントが実行されていない場合は、既定のデータベースの ID となります。SQL Server Profiler では、ServerName データ列がトレースにキャプチャされ、そのサーバーが利用可能な場合、データベースの名前が表示されます。データベースに対応する値は、DB_ID 関数を使用して特定します。 |
3 |
可 |
DatabaseName |
nvarchar |
ユーザーのステートメントが実行されているデータベースの名前。 |
35 |
可 |
EventClass |
int |
イベントの種類 = 55。 |
27 |
不可 |
EventSequence |
int |
要求内の特定のイベントのシーケンス。 |
51 |
不可 |
EventSubClass |
int |
イベント サブクラスの種類。 0 = 再帰 1 = 保留 |
21 |
可 |
GroupID |
int |
SQL トレース イベントが発生したワークロード グループの ID。 |
66 |
可 |
HostName |
nvarchar |
クライアントが実行されているコンピュータの名前。クライアントによりホスト名が指定されている場合は、このデータ列に値が格納されます。ホスト名を指定するには、HOST_NAME 関数を使用します。 |
8 |
可 |
IntegerData |
int |
再帰レベル (ハッシュの再帰のみ)。 |
25 |
可 |
IsSystem |
int |
イベントがシステム プロセスで発生したか、ユーザー プロセスで発生したかを示します。1 = システム、0 = ユーザーです。 |
60 |
可 |
LoginName |
nvarchar |
ユーザーのログイン名。SQL Server セキュリティ ログイン、または <DOMAIN>\<username> の形式で表された Windows ログイン資格情報です。 |
11 |
可 |
LoginSid |
image |
ログイン ユーザーのセキュリティ ID 番号 (SID)。この情報は、sys.server_principals カタログ ビューで参照できます。各 SID はサーバーのログインごとに一意です。 |
41 |
可 |
NTDomainName |
nvarchar |
ユーザーが所属する Windows ドメイン。 |
7 |
可 |
NTUserName |
nvarchar |
Windows のユーザー名。 |
6 |
可 |
ObjectID |
int |
パーティション再分割に関係するハッシュ チームのルートのノード ID。Showplan のノード ID と一致します。 |
22 |
可 |
RequestID |
int |
ステートメントが含まれている要求の ID。 |
49 |
可 |
ServerName |
nvarchar |
トレースされている SQL Server のインスタンスの名前。 |
26 |
|
SessionLoginName |
nvarchar |
セッションを開始したユーザーのログイン名。たとえば、Login1 を使用して SQL Server に接続し、Login2 でステートメントを実行すると、SessionLoginName には Login1 が表示され、LoginName には Login2 が表示されます。この列には、SQL Server ログインと Windows ログインの両方が表示されます。 |
64 |
可 |
SPID |
int |
イベントが発生したセッションの ID。 |
12 |
可 |
StartTime |
datetime |
イベントの開始時刻 (取得できた場合)。 |
14 |
可 |
TransactionID |
bigint |
トランザクションにシステムが割り当てた ID。 |
4 |
可 |
XactSequence |
bigint |
現在のトランザクションを説明するトークン。 |
50 |
可 |