統計IO:
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Workfile'. Scan count 128, logical reads 5952, physical reads 576, read-ahead reads 6080, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Table1'. Scan count 9, logical reads 90450, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
だから、いくつかの質問
1。なぜ統計IOプロファイラーよりも高い読み取りを示しますか?。
KB314648 に関しては、ProfilerがStatistics IOよりも高い数値を報告する場合は問題ありません。しかし、プロファイラーは92283
記述されたクエリで読み取り、同じ実行。それは、プロファイラーがワークファイル/ワークテーブルの読み取りをカウントしないことを意味しますか?
2。 「Worktable」と「Workfile」の違いは何ですか
私は found を持っています:
それらの間に物理的な違いはありますか?
3。この特定のケースに「ワークテーブル」があるのはなぜですか?
論理読み取りが0の場合、なぜワークテーブルがあるのですか?統計に含まれているIO(見積もりが間違っている場合)必要がある可能性があるという理由だけで?
technet にある説明は曖昧なようです。
4。 Workfileの「物理読み取り」とはどういう意味ですか?
これは、クエリに十分なメモリが割り当てられていないため、クエリの実行中にデータをディスクに書き込む必要があったことを意味しますか(ハッシュマッチに関する黄色の警告)。 Statistics IO物理読み取りでワークテーブル/ワークファイルを表示するときはいつでも、クエリに十分なメモリが割り当てられておらず、クエリのいくつかの中間結果をtempdbディスクに書き込む必要があったと思いますか?論理読み取りのみが表示されるときはいつでも、RAMが使用されますか?
5。 1つの「ワークファイル」とは、1つの目的で使用される1つのテーブルを意味しますか?
複数のワークファイル/ワークテーブルがある場合、それがどの操作に使用されているのかわかりませんか?
1。なぜ統計IOはプロファイラーよりも高い読み取りを示しますか?
わかりません、ごめんなさい。ナレッジベースの記事で言及されているように、測定値が異なるため、多くの場合、違いがあります。これについて私が知っている追加のドキュメントはありません。詳細なテストを通じていくつかのことを推測できる可能性がありますが、バージョンやビルド全体で一貫性が保たれることが保証されるわけではありません。 バグの可能性 を説明する前に、意図した動作に十分な一貫性がありません。
2。 「Worktable」と「Workfile」の違いは何ですか
どちらも内部オブジェクトです。それ以外の場合は、名前が示すとおりです。ワークテーブルはテーブルのような構造で、ワークファイルはファイルのようなものです。詳細な構造は表示されませんが、いくつかの広範な機能は、メソッドを検査し、デバッガーで実行パスをたどることによって識別できます。
3。この特定のケースに「ワークテーブル」があるのはなぜですか?
(行モード)ハッシュ操作には常に作業テーブルが必要です。これは、入力をハッシュパーティション(テーブルパーティションに関連しないオーバーロードされた用語)に分散する際、およびステータスを追跡するために内部的に使用されます。ハッシュ出力テーブルが統計出力でゼロ以外を報告するのを見たことがありませんが、実際に調べたことはありません。
4。 Workfileの「物理読み取り」とはどういう意味ですか?
作業ファイルは、ハッシュパーティションが流出したときに使用されるメカニズムの一部です。文書化されていませんが、実行エンジンが作業ファイルからこぼれたハッシュパーティションを取得すると、物理的および先読みが行われます。
5。 1つの「ワークファイル」とは、1つの目的で使用される正確に1つのテーブルを意味しますか?
私が覚えているように、複数のインスタンスがあるかもしれません。特定のSTATISTICS IO
行を特定のオブジェクトまたはプランノードに関連付ける方法を知る方法はありません。これは、長年の制限です。これはSQL Server 2016で変更される可能性がありますが、内部の一時オブジェクトに適用されるかどうかはテストしていません。
結局のところ、実行後の計画で他の情報を調べることで学習できるものを超えて、ワークファイルとワークテーブルのSTATISTICS IO
出力から学習するのに役立つそれほど多くのはありません(またはDMV、拡張イベントなどを介して)。回答が不完全だったことをお詫びしますが、それは頭のてっぺんから提供できる最高の方法です。