web-dev-qa-db-ja.com

SQL Serverのパフォーマンスが突然低下する

SQL Server 2005を使用していて、最近予測できなくなっており、その理由について頭を悩ませています。秒単位で実行されたクエリは計画を変更し、数分かかっています(フルテーブルスキャンまたはインデックススプールで時間を取っています)。最初で最も明白なことは、統計が古くなってオプティマイザが混乱することですが、私はこれはそうではないと確信しています-第一に、基礎となるデータが大幅に変更されていないためです(たとえば、1年のデータに1日のデータを追加するなど)もう1つは、テーブルの自動作成です。2番目に、統計の自動作成と統計の自動更新の両方がtrueであるためです。ただし、オプティマイザisは混乱します。チューニングアドバイザーでSQLを実行すると、複数列のCREATE STATISTICSステートメントはそれを修正しているようです(SQLの次のビットが誤動作するまで)。

これを根本原因とするアプローチに使用できる戦略のアイデアはありますか? 「通常の」統計では不十分な理由は何ですか?

13
Gaius

トップウェイトがSOS_SCHEDULER_YIELDの場合、CPUにプレッシャーがかかっているように見えます。しかし、これは、デザインがクエリに対して十分ではなくなっているなど、他の原因が原因である可能性があります。 1日分のデータを追加するだけだと言っていましたが、転換点に達する可能性があります。

クエリはどのように発行されますか?動的SQLですか?ストアドプロシージャを使用していますか? sp_executesqlを使用していますか?パラメータスニッフィングのケースがある可能性はありますか?あなたのdbデザインはどのように見えますか? PKとFKの関係とは何ですか?

良い計画の例はありますか?適切なプランを決定できる場合は、プランガイドを使用して、特定の方法でクエリを強制的に実行できます。

良い計画が失敗した例を挙げていただけますか?

最後に、Adam Machanicからsp_whoIsActive( http://whoisactive.com/ )のコピーを取得し、それを使用して、実行中のクエリの詳細を判断します。そして、sp_whoIsActiveからの出力をキャプチャできるようにしたい場合は、ここにアクセスしてください http://www.littlekendra.com/2011/02/01/whoisactive/

8
SQLRockstar

から [〜#〜] msdn [〜#〜]

"昇順または降順のキー列で挿入操作が発生しますIDENTITYやリアルタイムのタイムスタンプ列などの昇順または降順のキー列の統計は、より頻繁に必要になる場合がありますクエリオプティマイザーが実行するよりも統計の更新。挿入操作では、新しい値を昇順または降順の列に追加します。追加された行の数が少なすぎるため、統計の更新をトリガーできません。統計が最新でなく、クエリが最新のものから選択した場合行を追加すると、現在の統計にこれらの新しい値のカーディナリティの見積もりが含まれなくなります。これにより、カーディナリティの見積もりが不正確になり、クエリのパフォーマンスが低下する可能性があります。

たとえば、最新の注文日からカーディナリティの見積もりを含めるように統計が更新されていない場合、最新の注文日から選択するクエリは、カーディナリティの見積もりが不正確になります。

メンテナンス後の操作テーブルのトランケートや大きなパーセンテージの一括挿入など、データの分布を変更するメンテナンス手順を実行した後、統計を更新することを検討してください行。これにより、クエリが統計の自動更新を待つ間、クエリ処理の将来の遅延を回避できます。」

システムで時々「EXEC sp_updatestats」を使用するか(しばらくスケジュールされます)、すべてのオブジェクトで関数STATS_DATEを使用して、統計が実際に最後に更新された日時を確認し、それ以降に時間があまりに長い場合は、UPDATEを使用します。その特定のオブジェクトの統計。私の経験では、自動統計が有効になっていても、自動更新をトリガーしなかった挿入操作のために、統計を時々更新することを余儀なくされています。

私の個人コードを追加するには(統計更新の動的ステートメントを作成する毎週のジョブで使用):

select distinct
        'update statistics [' + stats.SchemaName + '].[' + stats.TableName + ']'
            + case when stats.RowCnt > 50000 then ' with sample 30 percent;'
            else 
                ';' end
        as UpdateStatement
    from (
        select
            ss.name SchemaName,
            so.name TableName,
            so.id ObjectId,
            st.name AS StatsName, 
            STATS_DATE(st.object_id, st.stats_id) AS LastStatisticsUpdateDate
            , si.RowModCtr
            , (select case si2.RowCnt when 0 then 1 else si2.RowCnt end from sysindexes si2 where si2.id = si.id and si2.indid in (0,1)) RowCnt
        from sys.stats st
            join sysindexes si on st.object_id = si.id and st.stats_id = si.indid
            join sysobjects so on so.id = si.id and so.xtype = 'U' --user table
            join sys.schemas ss on ss.schema_id = so.uid
    ) stats
    where cast(stats.RowModCtr as float)/cast(stats.RowCnt as FLOAT)*100 >= 10 --more than 10% of the rows have changed
    or ( --update statistics that were not updated for more than 3 months (and rows no > 0)
        datediff(month, stats.LastStatisticsUpdateDate, getdate()) >= 3
        and stats.RowCnt > 0
    )

ここでは、統計が3か月以上更新されていないか、最後の統計が更新されてから行の10%以上が変更されたすべてのオブジェクトを取得します。

8
Marian

私の推測では、1つ以上のテーブルが大きくなりすぎて、現在の統計を失効としてマークするために必要な変更の20%に達しないため、自動更新統計が起動し、それでも十分な更新(または挿入)があると思います)統計を更新すると、非常に役立ちます。 SQL 2000からSQL 2008にアップグレードした後、特定の環境で同じことが最近見つかりました。

上記の回答で述べた他のサイトに加えて、以下のオンラインリソースをチェックすることをお勧めします。

1)Red-Gateには、Holger Schmelingによる "SQL Server Statistics"を含むダウンロード可能な無料の電子ブックが多数あります。

http://www.red-gate.com/our-company/about/book-store/

「500行を超えるテーブルでは、リンクされた統計情報を無効にするために、列のデータの少なくとも20%を変更する必要がありました」

2)SQL Sentryには無料のPlan Explorerツールがあり、SQLプラン内の問題(クエリ内の特定のテーブルの実際の行数と比較した行数が多すぎる、または少なすぎるなど)を追跡できます。 SSMSから実際の実行プランを保存し、プランエクスプローラーを使用してプランのさまざまな部分をウォークスルーするだけです。グラフィック実行プランを使用したSSMSで情報を利用できないわけではありませんが、SQL Sentryのツールを使用すると、はるかに見やすくなります。

http://www.sqlsentry.com/plan-Explorer/sql-server-query-view.asp

3)STATS_DATE()を使用して、最も関心のあるクエリのテーブルの統計更新日を自分で確認します。次のディスカッションにあるクエリを使用して、最も古い統計を取得する簡単なクエリを見つけることができます。

http://blog.sqlauthority.com/2010/01/25/sql-server-find-statistics-update-date-update-statistics/

これが役に立てば幸いです!

Red-Gateの本は特にお楽しみいただけると思います。

-ジェフ

3
Jeff