web-dev-qa-db-ja.com

sp_updatestats vs統計の更新

リサンプルなしで_sp_updatestats_を使用してテーブルの統計を更新することと、sample options(FULLSCAN,SAMPLE PERCENT,RESAMPLE)なしで_UPDATE STATISTICS_を使用してテーブルの統計を更新することの間に違いはありますか?

exec sp_updatestats vs update statistics tablename

_sp_updatestats_を使用してテーブルをデフォルト値NOで更新すると、統計がデフォルトのサンプリングレートで更新されます。

同様に、sample options(FULLSCAN,SAMPLE PERCENT,RESAMPLE)なしで_UPDATE STATISTICS_を使用してテーブルの統計を更新すると、デフォルトのサンプリングでテーブルの統計も更新されます。

では、両方の方法に違いはありますか?ここに何か不足していますか?

更新:

_sp_updatestats_はすべてのテーブルで実行されますが、_UPDATE STATISTICS_を使用すると、特定のテーブルの統計を更新できます。

6

リサンプルなしでsp_updatestatsを使用してテーブルの統計を更新することと、サンプルオプションなしでUPDATE STATISTICSを使用してテーブルの統計を更新することの間に違いはありますか(FULLSCAN、SAMPLE PERCENT、RESAMPLE)

@Gameiswarで既に言及されているものに加えて、sp_updatestatsで知っているもう1つの違いは、データベースのすべてのテーブルに対して実行すると、少なくとも1つの行が変更されているテーブルの統計のみを更新します。 [〜#〜] bol [〜#〜] は言う

ディスクベースのテーブルの場合、sp_updatestatsはsys.sysindexesカタログビューのrowmodctr情報に基づいて更新が必要な統計のみを更新するため、変更されていない行の統計の不要な更新が回避されます。

したがって、sp_updatestatsを実行して、すべてのテーブルのstatisticsが更新されたと表示された場合、これは正しくない/誤解を招く可能性があります。

UPDATE STATISTICSを使用する場合、統計の更新に使用するオプションはかなりたくさんあります。

さらに、フルスキャンまたはデフォルトのオプションを使用してインデックスを再構築すると、そのインデックスの統計が更新されるため、統計を再構築する必要はありません。

PS:違いが何であれ、統計を更新するために使用するメカニズムが良くないため、sp_updatestatsを使用しません。1行だけが変更され、テーブルに100K行ある場合、テーブルの統計を更新する必要があるので、消費するだけです。リソースとより多くの問題を引き起こします。

編集:

統計を選択的に更新し、sp_updatestasを実行したくない場合は、以下のクエリを使用して古い統計を除外します。このクエリはDMFを使用し、SQL Server 2008 R2 SP2 , SQL Server 2012 Sp1 and aboveから機能します。コピー元は Erin Stellatoのブログ です。

[〜#〜]注[〜#〜]:異なるテーブルには異なるしきい値があり、データベースに対して上記のクエリを微調整する必要があることを認識してください。一部のテーブルでは、行の15%または20%が変更されるまで待機しても問題ありません。ただし、実際の値とそのスキューに応じて、10%または5%で更新する必要がある場合もあります。

SELECT [sch].[name] + '.' + [so].[name] AS [TableName] ,
[ss].[name] AS [Statistic],
[sp].[last_updated] AS [StatsLastUpdated] ,
[sp].[rows] AS [RowsInTable] ,
[sp].[rows_sampled] AS [RowsSampled] ,
[sp].[modification_counter] AS [RowModifications]
FROM [sys].[stats] [ss]
JOIN [sys].[objects] [so] ON [ss].[object_id] = [so].[object_id]
JOIN [sys].[schemas] [sch] ON [so].[schema_id] = [sch].[schema_id]
OUTER APPLY [sys].[dm_db_stats_properties]([so].[object_id],
[ss].[stats_id]) sp
WHERE [so].[type] = 'U'
AND [sp].[modification_counter] > 0--change accordingly
ORDER BY [sp].[last_updated] DESC;

このような面倒な作業をすべて回避したい場合は、Ola Hallengrenの更新統計スクリプトを使用して、そのようなことの多くを処理することもできます。

5
Shanky

sp_updatestatsのコードはかなり単純です。mssqlsystemresourceデータベースのコピーを作成することにより、コードを確認できます。 mdfおよびldfファイルをどこかにコピーし、別の名前のデータベースとして添付するだけです。

[〜#〜] bol [〜#〜] で確認できるように、ステートメントは1つのパラメーターを受け取り、リサンプルします。

ALTER procedure [sys].[sp_updatestats]
    @resample char(8)='NO'
as

ここに手順全体を投稿するのは良い考えではないと思います。自分で確認することもできますが、基本的には簡単な手順です。

プロシージャ内では、データベース内のテーブルをループし、テーブルのチェックでクラスター化インデックスが無効になっていないなどの基本的なチェックを実行し、テーブルがヘカトーンであるかどうかをチェックします(テーブルの統計リストが必要かどうかを判断します) sys.statsまたはsys.indexes)から読み取られ、それがhekathonテーブルであるかどうかをチェックして、hekathonテーブルの場合にフルスキャンを追加してから、単純なUPDATE STATISTICSを実行します。

基本的に、これら3つのステートメントの1つは、データベース内のすべての統計で実行されます

-- When resample is yes
UPDATE STATISTICS [sysname].[sysname] [sysname] WITH RESAMPLE
-- When resample is no
UPDATE STATISTICS [sysname].[sysname] [sysname] 
-- For a hekathon table
UPDATE STATISTICS [sysname].[sysname] [sysname] WITH FULLSCAN

統計で自動統計が無効になっている場合を除き、NORECOMPUTE句も追加されます

したがって、自動統計が無効になっておらず、メモリ最適化テーブルにない場合は、統計ごとにUPDATE STATISTICSを呼び出すだけで大きな違いはありません。

それらの使い方には違いがあります。

Sp_updatestats:
sp_updatestatsは、データベース内のすべてのユーザー定義テーブルと内部テーブルに対して、ALLキーワードを指定することにより、UPDATE STATISTICSを実行します。このオプションを使用して単一のテーブル/インデックスの統計のみを更新するようSQLに要求することはできません。

統計の更新:
統計の更新を使用すると、PerTable/Indexの統計を更新できます。

リサンプルなしでsp_updatestatsを使用してテーブルの統計を更新することと、サンプルオプションなしでUPDATE STATISTICSを使用してテーブルの統計を更新することの間に違いはありますか(FULLSCAN、SAMPLE PERCENT、RESAMPLE)

'resample'が指定されていない場合、sp_updatestatsはデフォルトのサンプリングを使用して統計を更新します。

統計の更新では、サンプルオプション(SAMPLE、FULLSCAN、RESAMPLE)のいずれも指定されていない場合、クエリオプティマイザーはデータをサンプリングし、デフォルトでサンプルサイズを計算します。

2
TheGameiswar