none
SQLServer 2012 R2 でイベントID=8623がでる RRS feed

  • 質問

  • おなじSQL文で検索の値を変えて同じテーブルをselectします。このとき、値が違うだけで応答が返ってくる時間がかなり違います。調べてみるとテーブルの断片化率が99%になっています。

    このような条件下でSQL文を実行するとイベントID=8623を返すことはありますでしょうか。

    断片化が進んでいるテーブルを検索するとリソースを食いつぶすことはありますか。

    よろしくお願いします。

    2016年9月7日 10:37

すべての返信

  • おなじSQL文で検索の値を変えて同じテーブルをselectします。このとき、値が違うだけで応答が返ってくる時間がかなり違います。調べてみるとテーブルの断片化率が99%になっています。

    このような条件下でSQL文を実行するとイベントID=8623を返すことはありますでしょうか。

    断片化が進んでいるテーブルを検索するとリソースを食いつぶすことはありますか。

    よろしくお願いします。

    「イベントID=8623」の方は申し訳ありませんが分かりません。
    ※というか、イベントIDを返すというのが良くわかりません。(エラーコードではなくて?)

    リソース云々については「ありますか?」という問いであれば有り得ます。

    データ量やインデックスの当たり方次第とも言えますし、
    SQL Serverのメモリやプロセッサの設定で起こらなくする事も可能だと思います。

    ほんわかした返信で申し訳ないです、、、

    2016年9月12日 1:00
  • 回答ありがとうございます。

    > 「イベントID=8623」の方は申し訳ありませんが分かりません。
    > ※というか、イベントIDを返すというのが良くわかりません。(エラーコードではなくて?)

    WindowsのイベントビュアーのIDになります。

    説明:
    クエリ プロセッサの内部リソースの不足により、クエリ プランを作成できません。これはまれなイベントで、非常に複雑なクエリ、または非常に多数のテーブルまたはパーティションを参照するクエリに限り発生します。クエリを簡単にしてください。このメッセージがエラーにより表示されたと考えられる場合、詳細についてはご購入元に問い合わせてください。

    > データ量やインデックスの当たり方次第とも言えますし、
    > SQL Serverのメモリやプロセッサの設定で起こらなくする事も可能だと思います。

    サーバのメモリやCPUの使用率を見ても問題はありません。

    以前には同じクエリーを実行してもエラーは出ませんでした。

    2016年9月12日 9:00
  • taku3n さん、こんにちは。

    8623というイベントが上がることに対する、SQL Server内部の詳細な理由という事ですと判りませんが、以下のようなことが起きているのでは?と想像しました。

    説明文:クエリ プロセッサの内部リソースの不足により、クエリ プランを作成できません。これはまれなイベントで、非常に複雑なクエリ、または非常に多数のテーブルまたはパーティションを参照するクエリに限り発生します。クエリを簡単にしてください。このメッセージがエラーにより表示されたと考えられる場合、詳細についてはご購入元に問い合わせてください。

    この説明文と99%断片化という事から、
    実行時に内部的に作成されるクエリプランが、(おそらく)断片化により複雑になったか、もしくは数量的に限界となった、という事ではないでしょうか。
    「クエリを簡単にしてください」という記述は、単に標準的にはそういった言い方になる、というだけだと思います。

    状況的に次のようなことが起こっているとは考えられないでしょうか。

    ・断片化(99%)によりレスポンスがその時その時で異なるのは普通。
     クエリがどのように断片化部分に依存しているかによる。(断片化部分に対するヒット率はクエリ毎に異なるので)
     例えば、パーセンテージでは見えてこないが、その数を見るととてつもない数である等による。
    ・実行時にクエリプランが随時作成されますが、このとき、断片化や統計情報のアンマッチにより(結果的に)生成されたクエリプランが非常に複雑になってしまっている。(統計が利用できないと判断された可能性もある)

    といったようなことで、件のIDがイベントに書き込まれた。
    という事もあるかもしれない、という想像が(ファーストステップとして)可能であると思いました。

    このような状況であるとするならば(SQL Serverが内部的にどのようなクエリプランを作成したか?は判りませんが)リソースを食いつぶす事はあり得ると思います。
    この場合のリソースとは、物理的なメモリ使用量という事ではなく、メモリ上にSQL Serverが作成する様々な管理ブロック、配列、その他諸々を指しているのだと解釈しても良いと思われます。
    「クエリ プロセッサの内部リソースの不足」はそういった意味だと思います。(自分が常々思っているだけで、実際は謎です)
    例えば、断片化されたデータをチェーンさせるための管理ブロックが予想外に多く必要になった。などあり得るかもしれません。


    断片化を解消するか、クエリヒントを付ける事で解決すると思います。
    メンテナンスプランで定期的に断片化解消させておくのも良いと思います。

    • 回答の候補に設定 星 睦美 2016年10月18日 7:24
    2016年9月13日 1:25