none
統計情報更新直後のSQL文の影響 RRS feed

  • 質問

  • SQLServer(2005)での統計情報更新について、ご質問です。

     

    周囲の数人に聞いた話なのですが、統計情報更新の仕様として、

    「更新直後に実行されたSQL文に対してインデックスが最適化される」という仕様があるのでしょうか?

     

    例えば、あるインデックスの統計情報更新の直後に全件検索に近いSQL文を発行したばあい、

    そのインデックスは同じようなSQL文に関して最適化されてしまい、

    完全一致検索などに関してはパフォーマンスが落ちてしまうというような仕様です。

     

    Webや書籍で探してみたところ、そのような記述は見つからなかったのですが、

    上記のような動きで、

    直後のSQL文が統計情報に影響を及ぼすようなことがあるのでしょうか?

    2009年1月27日 10:00

回答

  • こんにちは、naginoです。

    統計情報は、データをサンプリングして作成されます。
    データには依存しますが、実行しているクエリには影響を受けません。
    統計情報を元にクエリの実行プランが決まるのであって、クエリを元に統計情報が決まるのではありません。

    統計情報の更新については、統計情報が古い状態の場合既定では統計情報をバックグラウンドで自動更新しますが、その間のクエリに対しては古い統計情報を元に実行されるため、その間は非効率な実行プランが選択されることはあります。

    インデックスの最適化については、自動で最適化されることはありませんので、フラグメンテーションに対しては再編成か再構成を手動で行う必要があります。
    (多くはジョブで夜間にメンテナンスしてしまうことが多いと思われますが)

    なお、パラメータ化されたクエリで、パラメータによって取得件数が大きく異なる場合では、実行プランのキャッシュが使われてしまう場合にパフォーマンスが落ちることはありますが、統計情報やインデックスとは別の話題ですよね・・・。

    少々視点が異なるのですが、インデックスと統計については関連情報が以下に詳しく記載されていますので、よろしければご参照ください。

    ご参考になれば幸いです。

    2009年1月27日 13:46

すべての返信

  • こんにちは、naginoです。

    統計情報は、データをサンプリングして作成されます。
    データには依存しますが、実行しているクエリには影響を受けません。
    統計情報を元にクエリの実行プランが決まるのであって、クエリを元に統計情報が決まるのではありません。

    統計情報の更新については、統計情報が古い状態の場合既定では統計情報をバックグラウンドで自動更新しますが、その間のクエリに対しては古い統計情報を元に実行されるため、その間は非効率な実行プランが選択されることはあります。

    インデックスの最適化については、自動で最適化されることはありませんので、フラグメンテーションに対しては再編成か再構成を手動で行う必要があります。
    (多くはジョブで夜間にメンテナンスしてしまうことが多いと思われますが)

    なお、パラメータ化されたクエリで、パラメータによって取得件数が大きく異なる場合では、実行プランのキャッシュが使われてしまう場合にパフォーマンスが落ちることはありますが、統計情報やインデックスとは別の話題ですよね・・・。

    少々視点が異なるのですが、インデックスと統計については関連情報が以下に詳しく記載されていますので、よろしければご参照ください。

    ご参考になれば幸いです。

    2009年1月27日 13:46
  • naginoさん、

    ご回答ありがとうございます。

     

    >データには依存しますが、実行しているクエリには影響を受けません。
     
    やはり、そうなのですか。
    周囲の人に、直後に実行したクエリがその後の実行計画に影響するという説明を受けたのですが、
    どこかに勘違いがあるみたいですね。
     
     
    >統計情報の更新については、統計情報が古い状態の場合既定では統計情報をバックグラウンドで自動更新しますが、その間のクエリに対しては古い統計情報を元に実行されるため、その間は非効率な実行プランが選択されることはあります。
     
    更新された統計情報が有効になるタイミングにも疑問があったので、大変参考になります。
     
    ここ最近持っていた疑問がかなり解消されました。
    ありがとうございます。
    2009年1月28日 0:05