メモリ最適化テーブルの統計
クエリ オプティマイザーでは、クエリのパフォーマンスを向上させるクエリ プランを作成するために列に関する統計を使用します。 統計はデータベースのテーブルから収集され、データベース メタデータに格納されます。
統計は自動的に作成されますが、手動で作成することもできます。 たとえば、統計は、インデックスの作成時にインデックス キー列に対して自動的に作成されます。 統計の作成の詳細については、「 Statistics」を参照してください。
テーブル データは通常、時間の経過に伴い、行が挿入、更新、または削除されて変化します。 これは、統計を定期的に更新する必要があることを意味します。 既定では、ディスク ベース テーブルの統計は、オプティマイザーが統計が古くなったと判断したときに自動的に更新されます。
メモリ最適化テーブルの統計は、既定では更新されません。 手動で更新する必要があります。 個々の列、インデックス、またはテーブルに UPDATE STATISTICS (Transact-SQL) を使用します。 sp_updatestats (Transact-SQL) を使用して、データベース内のすべてのユーザー テーブルと内部テーブルの統計を更新します。
CREATE STATISTICS (Transact-SQL) または UPDATE STATISTICS (Transact-SQL) を使用する場合は、メモリ最適化テーブルの統計の自動更新を無効にするように を指定NORECOMPUTE
する必要があります。 ディスク ベースのテーブルの場合、 sp_updatestats (Transact-SQL) は、テーブルが最後の sp_updatestats (Transact-SQL) 以降に変更された場合にのみ統計を更新します。 メモリ最適化テーブルの場合、 sp_updatestats (Transact-SQL) では常に更新された統計が生成されます。 sp_updatestats (Transact-SQL) は、メモリ最適化テーブルに適したオプションです。それ以外の場合は、統計を個別に更新できるように、どのテーブルに大きな変更が加えられたかを把握する必要があります。
統計は、データをサンプリングするか、フル スキャンを実行することによって生成できます。 サンプリング統計は、データ分布を推定するためにテーブル データのサンプルのみを使用します。 フルスキャン統計は、データの分布を調べるためにテーブル全体をスキャンします。 通常、フルスキャン統計の方が正確ですが、計算にかかる時間が長くなります。 サンプリング統計はより速く収集できます。
ディスク ベース テーブルでは、既定ではサンプリング統計が使用されます。 メモリ最適化テーブルでは、フルスキャン統計のみをサポートしています。 CREATE STATISTICS (Transact-SQL) または UPDATE STATISTICS (Transact-SQL) を使用する場合は、メモリ最適化テーブルのオプションをFULLSCAN
指定する必要があります。
メモリ最適化テーブルの統計に関するその他の注意点を次に示します。
メモリ最適化テーブルのインデックスはテーブルを使用して作成されます。 インデックス キー列の統計は、テーブルが空のときに作成されます。 したがって、これらの統計は、データがテーブルに読み込まれた後に更新する必要があります。
ネイティブ コンパイル ストアド プロシージャの場合、プロシージャのコンパイル時にプロシージャ内のクエリの実行プランが最適化されます。 これは、統計が更新されたときではなく、プロシージャが作成されたときおよびサーバーが再起動されたときにのみ発生します。 したがって、テーブルには代表的なデータのセットが含まれている必要があり、統計はプロシージャが作成される前に最新の状態にする必要があります (ネイティブ コンパイル ストアド プロシージャは、データベースがオフラインになってから再度オンラインに戻った場合、またはサーバーが再起動された場合に再コンパイルされます)。
メモリ最適化テーブルを配置するときの統計のガイドライン
クエリ オプティマイザーでクエリ プランを作成するときに最新の統計が使用されるように、次の 5 つの手順を使用してメモリ最適化テーブルを配置します。
テーブルとインデックスを作成します。 インデックスは、
CREATE TABLE
ステートメントでインラインで指定されます。テーブルにデータを読み込みます。
テーブル上の統計を更新します。
テーブルにアクセスするストアド プロシージャを作成します。
ネイティブ コンパイルおよび解釈された Transact-SQL ストアド プロシージャとアドホック バッチの組み合わせを含めることができるワークロードを実行します。
データを読み込んで統計を更新してからネイティブ コンパイル ストアド プロシージャを作成することにより、オプティマイザーで統計をメモリ最適化テーブル用に使用できます。 これによって、プロシージャをコンパイルすると効率的なクエリ プランが作成されます。
メモリ最適化テーブルでの統計の管理のガイドライン
統計を最新に保つためには、メモリ最適化テーブルの統計を定期的に更新します。
データが頻繁に変更される場合は、統計を頻繁に更新する必要があります。 たとえば、バッチ更新の後にテーブルの統計を更新します。 統計を更新した後、更新された統計の利点を得られるように、ネイティブ コンパイル ストアド プロシージャを削除して再作成します。
.
ピーク ワークロード中に統計を更新しないでください。
統計を更新するには:
SQL Server Management Studioを使用して統計更新タスクを使用してメンテナンス プランを作成する
または、以下で説明するように、Transact-SQL スクリプトを使用して統計を更新します。
1 つのメモリ最適化テーブル (myschema) の統計を更新するには Mytable)、次のスクリプトを実行します。
UPDATE STATISTICS myschema.Mytable WITH FULLSCAN, NORECOMPUTE
現在のデータベース内のすべてのメモリ最適化テーブルの統計を更新するには、次のスクリプトを実行します。
DECLARE @sql NVARCHAR(MAX) = N''
SELECT @sql += N'
UPDATE STATISTICS ' + quotename(schema_name(schema_id)) + N'.' + quotename(name) + N' WITH FULLSCAN, NORECOMPUTE'
FROM sys.tables WHERE is_memory_optimized=1
EXEC sp_executesql @sql
データベース内のすべてのテーブルの統計を更新するには、 sp_updatestats (Transact-SQL) を実行します。
次のサンプルでは、メモリ最適化テーブルの最終更新日を報告します。 この情報は、統計を更新する必要があるかどうかを判断するのに役立ちます。
select t.object_id, t.name, sp.last_updated as 'stats_last_updated'
from sys.tables t join sys.stats s on t.object_id=s.object_id cross apply sys.dm_db_stats_properties(t.object_id, s.stats_id) sp
where t.is_memory_optimized=1