次の方法で共有


メモリ最適化テーブルの統計

クエリ オプティマイザーでは、クエリのパフォーマンスを向上させるクエリ プランを作成するために列に関する統計を使用します。 統計はデータベースのテーブルから収集され、データベース メタデータに格納されます。

統計は自動的に作成されますが、手動で作成することもできます。 たとえば、統計は、インデックスの作成時にインデックス キー列に対して自動的に作成されます。 統計の作成の詳細については、「 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 つの手順を使用してメモリ最適化テーブルを配置します。

  1. テーブルとインデックスを作成します。 インデックスは、CREATE TABLE ステートメントでインラインで指定されます。

  2. テーブルにデータを読み込みます。

  3. テーブル上の統計を更新します。

  4. テーブルにアクセスするストアド プロシージャを作成します。

  5. ネイティブ コンパイルおよび解釈された 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  

参照

メモリ最適化テーブル