none
SQL Server 2005 SELECTステートメントで条件に一致するデータを稀に返さない RRS feed

  • 質問

  • こんにちは saitaです。

    過去に導入したシステムで、資材が古いのですが、SQL Server 2005 x64 で、SELECTステートメントで条件に一致するデータが返されないことが稀にあるという現象に悩まされています。

    SELECT カラムリスト from 顧客テーブル where 顧客ID='nnnnn' 

    という大変シンプルなクエリです。顧客IDはPKです。

    一日あたり500件程度の該当クエリアクセスがあり、ほとんどは意図した顧客データを返すのですが、まれに(数週間に一回、一か月に一回、など…) 、顧客テーブルに存在する顧客IDを検索しているのに、戻ってくるデータが0件となる場合があるように見えるのです。

    アプリケーションの動作は、「データが0件」の場合は「新規会員」として処理をするようになっており、オペレータがすぐに異常に気がついて、再度同じ操作をします。すると、その際には、意図したデータが取得できてしまいます。このわずかな時間差でバックグラウンドで登録プロセスが流れているのかとも考え調査したのですが、その顧客IDはとっくの昔に登録されていました。また、この現象が発生する顧客IDに傾向はなく、ランダムに発生しているように見えます。

    SQL Serverというよりは、アプリケーションの(データ取得してからの)動作不具合とも考えられるのですが、アプリケーションもまたシンプルな処理で、不具合が見つかっていません。

    上記のような現象はあり得るでしょうか。実はfixが出ていた、より後発のSPで直るなど、情報をご存じでしたら、教えていただけないでしょうか。

    環境は、

    SQL Server 2005 x64 Standard ver 9.0.3042

    Windows Sever 2003 R2 x64 Standard ver 5.2.3790

    MDAC 2000.86.3959

    です。

    よろしくお願いいたします。

    2014年3月24日 19:18

回答

  • SELECT カラムリスト from 顧客テーブル where 顧客ID='nnnnn'
    という大変シンプルなクエリです。顧客IDはPKです。

    例えば顧客IDの型が文字列以外で、クエリ毎に型変換が行われている等はありませんか? それはそうとクエリパラメーターは使われていないのでしょうか。何にせよ「アプリケーションに不具合は見つかっていません」ではなく、渡したクエリ・パラメーターなどを記録して原因を調査する以外にないとは思います。

    実はfixが出ていた、より後発のSPで直るなど、情報をご存じでしたら、教えていただけないでしょうか。
    SQL Server 2005 x64 Standard ver 9.0.3042

    使用されているバージョンはSP2で現在はSP4+CU3まで出ていますね。ご自身で探しましょうよ。

    • 回答としてマーク 星 睦美 2014年3月26日 6:37
    2014年3月24日 23:37
  • Management Studio などで直接 SELECT クエリ実行して 同様のばらつきがあるのであれば

    SQL Server 側データベースの問題もあるかもしれません。

     → SQL Server 自体でというわけではなくてどちらかというと該当データベースの中身の問題です。
      DBCC などで構造チェックしてみるとソフト的に壊れかけの可能性もあるのやも?

    逆に問題ないなら 佐祐理 さんのおっしゃる通りで 実際にアプリが最終的に発行している SQL を何らかの手段でログに取って
    見るのが正解なのでありましょう。

    • 回答としてマーク 星 睦美 2014年3月26日 6:37
    2014年3月25日 0:43
  • >戻ってくるデータが0件となる場合があるように見えるのです。

    結果が0件であると確認ができていないということでしょうか? であれば、ひょっとしてネットワーク機器の不調によるタイムアウトが発生しているということはないでしょうか? 再度実行すると取得できるという状況は、通常は考えられません。再度実行して取得できるとなると、単純、複雑なクエリに関係なく、ロジックに依存していないということです。(同時実行制御の問題など、完全にロジックを否定はできませんが・・・)
    頻度的に1万回に1回ぐらいの割合で起きているようですので、テスト的にプログラムを作って1万回のクエリを実行することも考えられます。

    それにしても、単純なselect文で取得できないことがあるというデータベースはデータベースとは呼べませんし、ましてや商品として販売されているということは考えにくいことです。よって、それがバグフィックスとしてサポート情報に載ることも考えにくいことですが、一応、以下で検索することができます。

    (検索例)
    Microsoft サポート
    http://support.microsoft.com/search/default.aspx?query=sql+server+2005+select+%EF%BC%90%E4%BB%B6&mode=a&spid=global&catalog=LCID%3D1041&x=0&y=0


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    • 回答の候補に設定 星 睦美 2014年3月26日 6:36
    • 回答としてマーク 星 睦美 2014年3月26日 6:37
    2014年3月25日 7:40

すべての返信

  • SELECT カラムリスト from 顧客テーブル where 顧客ID='nnnnn'
    という大変シンプルなクエリです。顧客IDはPKです。

    例えば顧客IDの型が文字列以外で、クエリ毎に型変換が行われている等はありませんか? それはそうとクエリパラメーターは使われていないのでしょうか。何にせよ「アプリケーションに不具合は見つかっていません」ではなく、渡したクエリ・パラメーターなどを記録して原因を調査する以外にないとは思います。

    実はfixが出ていた、より後発のSPで直るなど、情報をご存じでしたら、教えていただけないでしょうか。
    SQL Server 2005 x64 Standard ver 9.0.3042

    使用されているバージョンはSP2で現在はSP4+CU3まで出ていますね。ご自身で探しましょうよ。

    • 回答としてマーク 星 睦美 2014年3月26日 6:37
    2014年3月24日 23:37
  • Management Studio などで直接 SELECT クエリ実行して 同様のばらつきがあるのであれば

    SQL Server 側データベースの問題もあるかもしれません。

     → SQL Server 自体でというわけではなくてどちらかというと該当データベースの中身の問題です。
      DBCC などで構造チェックしてみるとソフト的に壊れかけの可能性もあるのやも?

    逆に問題ないなら 佐祐理 さんのおっしゃる通りで 実際にアプリが最終的に発行している SQL を何らかの手段でログに取って
    見るのが正解なのでありましょう。

    • 回答としてマーク 星 睦美 2014年3月26日 6:37
    2014年3月25日 0:43
  • >戻ってくるデータが0件となる場合があるように見えるのです。

    結果が0件であると確認ができていないということでしょうか? であれば、ひょっとしてネットワーク機器の不調によるタイムアウトが発生しているということはないでしょうか? 再度実行すると取得できるという状況は、通常は考えられません。再度実行して取得できるとなると、単純、複雑なクエリに関係なく、ロジックに依存していないということです。(同時実行制御の問題など、完全にロジックを否定はできませんが・・・)
    頻度的に1万回に1回ぐらいの割合で起きているようですので、テスト的にプログラムを作って1万回のクエリを実行することも考えられます。

    それにしても、単純なselect文で取得できないことがあるというデータベースはデータベースとは呼べませんし、ましてや商品として販売されているということは考えにくいことです。よって、それがバグフィックスとしてサポート情報に載ることも考えにくいことですが、一応、以下で検索することができます。

    (検索例)
    Microsoft サポート
    http://support.microsoft.com/search/default.aspx?query=sql+server+2005+select+%EF%BC%90%E4%BB%B6&mode=a&spid=global&catalog=LCID%3D1041&x=0&y=0


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    • 回答の候補に設定 星 睦美 2014年3月26日 6:36
    • 回答としてマーク 星 睦美 2014年3月26日 6:37
    2014年3月25日 7:40
  • 佐祐理さん、アドバイスありがとうございます。

    型変換等は発生しておりません。

    ログ出力や既知の情報に関してはご指摘の通りで、関連部署と調整中です。ありがとうございました。

    2014年3月26日 4:58
  • SHIMSOFTさん、アドバイスありがとうございます。

    Management Studioで手動で試す限りは再現しません、が、別プログラムでの同等クエリ連続実行による検証も進めようと思います。

    ありがとうございました。

    2014年3月26日 5:02
  • trapemiyaさん、アドバイスありがとうございます。

    ネットワークのタイムアウトは別のエラーになるため、それは発生していません。

    結果が0件であるとアプリケーションの上層では確認されているのですが、ADO.NETで結果を受信してから、その判断をアプリケーションがするところまで何層かあるので、本当に、受け取った瞬間に件数が0なのか、という確信が取れていない、ということです。

    個人的にも、SQL Serverにこんな問題があるとは信じにくいので、なにか別の問題が、たまたまこういう姿で表面化しているのではないかと考えていて、その場合、もっとも怪しいのはアプリケーション処理なのですが、複数人によるコードレビュ―においては、判断する部分で0件ならば、受け取った時点でも0件のはず、という結論になっています。

    他の方もおっしゃってくださいましたが、ログ等の仕込みや、別プログラムでの連続検証を関連部署と調整してすすめようと思います。

    ありがとうございました。

    2014年3月26日 5:07