約18 TBの非常に大規模なデータベースの統計の更新を管理する方法に関する専門家のアドバイスをここで探しています。
最近、パフォーマンスの問題に直面し始めており、それは古い統計が原因であると考えています。
実際、exec sp_update statsを実行し、デフォルトのサンプルレート(この場合は1.2%)で更新するジョブがあります。したがって、統計を手動で更新して、いくつかの改善を確認する必要があります。
FULL SCANをスケジュールするのは難しいでしょう。私の知識によれば、私は行をサンプリングされた行と比較しています。たとえば、サイズが400 GBで1億行を超える1つのテーブルで、サンプリングされた行が約2〜4Mであることがわかります。大きなテーブルはパーティション化されています。
SQL Server 2012 Enterprise Editionを使用しています。トレースフラグ2371が有効になっていません。
このような大規模なDBの場合、統計の更新をはるかに優れた方法で利用する方法と、そのサンプルレートをどのように使用するかを提案してください。
あなたの質問に基づいて、私はあなたが経験している問題を引き起こしている可能性のある統計に関する4つの考えられる問題を考えることができます。
1。統計が自動的に頻繁に更新されない
SQL Server 2012では、統計はテーブルの行の20%以上が変更された後にのみ更新されます。つまり、10億行のテーブルの場合、統計の更新が発生する前に2億行を変更する必要があります。テーブルが大きくなると、統計の更新が頻繁に行われなくなるため、SQL Serverは、大きなテーブルの統計を更新しなくても何年も使用できます。
TF 2371 統計の更新がより頻繁に行われるようにしきい値を変更します。 SQL Server 2016では、この変更がデフォルトになっています。
2。ワークロードのクエリは 昇順キーの問題 。に対して脆弱です
毎日読み込まれる新しいデータと、データの最新日にフィルターをかけるクエリがあるテーブルを考えてみましょう。データのロード直後に統計の更新が更新されない限り、新しいデータは統計ヒストグラムのいずれにも存在しません。カーディナリティの推定値が低いため、クエリのパフォーマンスが非常に低下する可能性があります。
SQL Server 2014の新しいCEでは、この領域が改善されています。ヒストグラムの範囲外のデータを要求すると、より楽観的な推測が行われ、テーブルにはデータが存在するがヒストグラムにはデータがないと想定される場合があります。 SQL Server 2012では、統計情報をより頻繁に更新するか、または TF 4139 を有効にすることで、この問題に対処できます。 TF 4139は、インデックスが設定されている列に対してのみ機能します。 SQL Serverは、インデックスに対して非常に迅速なクエリを実行して最高値または最低値を取得し、関連する統計オブジェクトのヒストグラムを一時的に修正します。これにより、一部のクエリの計画が大幅に改善されます。
3。クエリは統計の更新を待ちます。
デフォルトでは、クエリが古い統計更新をロードすると、クエリプランを作成する前にその統計オブジェクトが更新されます。 SQL Server 2012では、サンプル統計更新はMAXDOP 1
で実行されます。大きなテーブルに対してキックオフすると、統計の更新が完了するのを待つ間にプロセスがタイムアウトする場合があります。テーブルに対して統計を更新すると、統計の更新を待つ必要がなくなるため、クエリのパフォーマンスが向上します。
この問題が発生している場合は、NORECOMPUTE
オプションを使用したより積極的な統計メンテナンスによってこれに対処できます。または、SQL Server 2016にアップグレードすることで、統計の更新を高速化することもできます。SQLServer 2016では、サンプリングされた統計の更新を並行して実行できます。
別のオプションは、AUTO_UPDATE_STATISTICS_ASYNC
オプションをオンにすることです。クエリプランが古くなった統計オブジェクトを検出すると、バックグラウンドジョブによって更新される統計オブジェクトをキューに入れます。これは悪く聞こえるかもしれませんが、そうです。クエリは古い統計で実行される場合があります。これは、自動統計の更新のコストが高すぎる、または計画の作成に十分に役立たない大規模なシステムで作業している場合など、適切な選択肢がない場合に有効にしたい種類の機能です。 Jack Liは、このオプション ここ を利用した顧客についてブログを書きました。
4。ワークロードは、自動サンプルレートよりも高いサンプルレートでの手動統計更新の恩恵を受けます。
一部のクエリとワークロードでは、許容可能なパフォーマンスを実現するために、デフォルトのサンプリングされた統計レートを超えるものが必要です。大規模なデータベースでこれを行うのは難しい場合がありますが、SQL Serverの今後のバージョンではいくつかのトリックといくつかの機能強化が役立つでしょう。
データとワークロードをよく知っている場合は、統計の自動更新をオフにできる場合があります。 FULLSCAN
を使用して、必要な統計を収集し、必要に応じて更新できます。このアプローチでは、多くの作業とサーバーへの多大な注意が必要になります。
インデックスを再構築する既存のメンテナンスプロセスがある場合(その知恵は debated )です。インデックスを再構築すると、統計情報がFULLSCAN
で自動的に更新されるため、おそらくそれを利用できます。統計を更新するメンテナンスソリューションを構築します。
特にヒストグラム列にインデックスが付けられている場合、サンプリングされた統計の収集は、フルスキャン統計よりも速くない場合があることに注意してください。 SQL Serverは、フルスキャン統計の更新を並行して実行できます。また、インデックス付き列のフルスキャンを実行するときにソートを回避できますが、列をサンプリングするときにソートを回避しません。実際、テーブルが十分に大きい場合、インデックスのない列に対する統計の更新は、tempdbがいっぱいになると失敗する可能性があります。
SQL Server 2014は 増分統計 を導入しました。パーティションテーブルがあり、1つのパーティションで多くのデータが変更されたとします。以前は、テーブルの統計を更新するには、すべてのパーティションを調べる必要がありました。この新機能を使用すると、変更されたパーティションの新しい統計を収集するだけで済みます。 SQL Serverは、統計をパーティションから1つのテーブルレベルオブジェクトにロールアップできます。
アップグレードできない場合は、一部のテーブルを パーティションビュー に変換することを検討してください。ビュー内の各テーブルは独自の統計オブジェクトを取得するため、日付に従ってデータをロードする場合、ビューのすべてのテーブルではなく、ビュー内の最新のテーブルの統計のみを更新する必要がある場合があります。
最後に、前述のように、SQL Server 2016は 並行してサンプリングされた統計 を更新できます。
SQL Server 2016以降、互換性レベル130を使用すると、統計収集のパフォーマンスを向上させるために、統計を作成するためのデータのサンプリングが並行して行われます。クエリオプティマイザーは、テーブルサイズが特定のしきい値を超えるたびに、並列サンプル統計を使用します。