Memory Optimized Table (メモリ最適化テーブル / Hekaton) は統計情報の更新が従来のテーブルと異なっています。
今回の投稿では統計情報の更新についてまとめてみたいと思います。
Memory Optimized Table の統計情報については Statistics for Memory-Optimized Tables に記載されています。
以下のクエリを実行して、統計情報の状態を確認してみます。
SELECT |
MemTable が Memory Optimized Table、Table_1 が通常のデータテーブルとなります。
インデックスに設定されている統計情報の no_recompute がテーブルによって違っていることが確認できます。
no_recompute ですが、統計情報の自動更新オプションとなります。
Memory Optimized Table では統計情報の自動更新が無効となっているのがデフォルトの設定となります。
そのため、統計情報の更新は手動で実施する必要があります。
統計情報の自動更新の設定に関しては変更することができません。
以下のようなクエリで統計情報の更新を実施してみます。
UPDATE STATISTICS [dbo].[MemTable] ([PK_MemTable]) |
この形式で統計情報の更新を行おうとすると以下のエラーとなります。
Memory Optimized Table の統計情報については使用できるオプションに制限があり、NORECOMPUTE (統計情報の自動更新を行わない) で実行する必要があります。
実際には以下のようなクエリで統計情報を更新します。
# RESAMPLE でもよいですが。
UPDATE STATISTICS [dbo].[MemTable] ([PK_MemTable]) WITH FULLSCAN,NORECOMPUTE |
なお、UPDATE STATISTICS だけでなく、sp_updatestats を使用して統計情報の更新もできます。
以下の手順は冒頭に紹介した BOL の内容になります。
Create tables and indexes. Indexes are specified inline in the CREATE TABLE statements.
Load data into the tables.
Update statistics on the tables.
Create stored procedures that access the tables.
Run the workload, which can contain a mix of natively compiled and interpreted Transact-SQL stored procedures, as well as ad hoc batches.
Memory Optimized Table の統計情報についてはデータをロードし終わった後に作成し、そのあとにネイティブストアドプロシージャ等を作成することがガイドラインとして推奨されています。
また、ネイティブストアドプロシージャについては作成時、再起動時の初回実行等でコンパイルが発生し、それ以外のリコンパイルは発生しないため、データが増えてきたときの最新の統計の利用については気を付ける必要があります。
Memory Optimized Table でも最適な実行プランを生成するためには統計情報の最新化が必要となりますが、最新の統計情報を使用してクエリを実行するためにはどうするかということを注意して利用する必要があります。
いちからはじめる Memory Optimized Table その 1
いちからはじめる Memory Optimized Table その 2
いちからはじめる Memory Optimized Table その 3
いちからはじめる Memory Optimized Table その 4
いちからはじめる Memory Optimized Table その 5
いちからはじめる Memory Optimized Table その 6
いちからはじめる Memory Optimized Table その 7
いちからはじめる Memory Optimized Table その 8
いちからはじめる Memory Optimized Table その 9 ←今回の投稿