クエリ オプティマイザーでは、クエリのパフォーマンスを向上させるクエリ プランを作成するために列に関する統計を使用します。 統計はデータベースのテーブルから収集され、データベース メタデータに格納されます。
統計は自動的に作成されますが、手動で作成することもできます。 たとえば、統計は、インデックスの作成時にインデックス キー列に対して自動的に作成されます。 統計の作成の詳細については、「 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) は、メモリ最適化テーブルに適したオプションです。それ以外の場合は、統計を個別に更新できるように、どのテーブルに大きな変更が加わるかを把握する必要があります。
統計は、データをサンプリングするか、フル スキャンを実行することによって生成できます。 サンプリングされた統計では、テーブル データのサンプルのみを使用してデータ分布を推定します。 Fullscan 統計では、テーブル全体がスキャンされ、データの分布が決定されます。 通常、Fullscan 統計の方が正確ですが、計算に時間がかかります。 サンプリングされた統計は、より高速に収集できます。
ディスク ベースのテーブルでは、既定でサンプリングされた統計が使用されます。 メモリ最適化テーブルでは、fullscan 統計のみがサポートされます。
CREATE STATISTICS (Transact-SQL) または UPDATE STATISTICS (Transact-SQL) を使用する場合は、メモリ最適化テーブルにFULLSCAN
オプションを指定する必要があります。
メモリ最適化テーブルの統計に関する追加の考慮事項:
メモリ最適化テーブルのインデックスは、テーブルと共に作成されます。 インデックス キー列の統計は、テーブルが空の場合に作成されます。 したがって、これらの統計は、データがテーブルに読み込まれた後に更新する必要があります。
ネイティブ コンパイル ストアド プロシージャの場合、プロシージャのコンパイル時に、プロシージャ内のクエリの実行プランが最適化されます。 これは、統計が更新されたときではなく、プロシージャが作成され、サーバーが再起動された場合にのみ発生します。 したがって、テーブルには代表的なデータ セットを含める必要があり、統計はプロシージャが作成される前に -date up-toする必要があります。 (ネイティブ コンパイル ストアド プロシージャは、データベースがオフラインになってオンラインに戻された場合、またはサーバーが再起動された場合に再コンパイルされます)。
Memory-Optimized テーブルをデプロイするときの統計のガイドライン
クエリ プランの作成時にクエリ オプティマイザーに up-to-date 統計があることを確認するには、次の 5 つの手順を使用してメモリ最適化テーブルをデプロイします。
テーブルとインデックスを作成します。 インデックスは、
CREATE TABLE
ステートメントでインラインで指定されます。テーブルにデータを読み込みます。
テーブルの統計を更新します。
テーブルにアクセスするストアド プロシージャを作成します。
ワークロードを実行します。このワークロードには、ネイティブ コンパイルおよび解釈されたストアド プロシージャとアドホック バッチの組み合わせ Transact-SQL 含めることができます。
データを読み込んで統計を更新した後でネイティブ コンパイル ストアド プロシージャを作成すると、オプティマイザーでメモリ最適化テーブルに対して使用できる統計が確保されます。 これによって、プロシージャをコンパイルすると効率的なクエリ プランが作成されます。
Memory-Optimized テーブルの統計を維持するためのガイドライン
統計を -date up-to保持するには、メモリ最適化テーブルの統計を定期的に更新します。
データが頻繁に変更される場合は、統計を頻繁に更新する必要があります。 たとえば、バッチ更新後にテーブル統計を更新します。 統計を更新した後、ネイティブ コンパイル ストアド プロシージャを削除して再作成し、更新された統計の恩恵を受けることができるようにします。
.
ワークロードのピーク時に統計を更新しないでください。
統計を更新するには:
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