3 Replies Latest reply: Jan 23, 2013 12:53 AM by user1371833 RSS

    マテリアライズドビューの結果と元SQLの結果が一致しない

    user1371833
      お世話になっております。
      マテリアライズドビューを作成したのですが、元となるSELECT文と結果が異なるデータが発生して
      原因がわかりません。どなたか経験のある方のアドバイスをいただきたくお願いします。

      <環境>
      Oracle10gEE(Linux) 10.2.0.2.0 RAC環境

      <試した事>
      2011年~2014年の製品別単価推移表のマテリアライズドビューを作成したが、
      例えばある製品の2013年度の単価だけNULLとなる。
      SELECT以下を発行した場合は問題なし。
      マテリアライズドビュー作成直後に検証しまた元データの変更もありませんので
      リフレッシュの問題はないと考えています。
      またWHERE句で元データの量を絞るとマテリアライズドビューの結果も正しくなりました。
      #元データ量は1000万件超ですが300万件で絞りました。

      <SQL>・・・横軸を月別とした単価表を作成。
      CREATE MATERIALIZED VIEW MV_PLN_TANKA
      REFRESH FORCE ON DEMAND
      AS
      SELECT
      KEY,
      SEIHIN,
      KOKYAKU,
      SUBSTR(V_MONTH,1,4) V_YEAR,
      SUM(CASE SUBSTR(MONTH,5,2) WHEN '01' THEN TANKA ELSE NULL END ) TANKA_01,
      --12か月分
      SUM(CASE SUBSTR(MONTH,5,2) WHEN '12' THEN TANKA ELSE NULL END ) TANKA_12,
      COUNT(*) N_COUNT_ALL,
      COUNT(CASE SUBSTR(MONTH,5,2) WHEN '01' THEN N_URI_TANKA ELSE NULL END ) CNT_TANKA_01,
      --12か月分
      COUNT(CASE SUBSTR(MONTH,5,2) WHEN '12' THEN N_SIKIGEN_TANKA ELSE NULL END ) CNT_TANKA_12
      FROM TANKAMST T
      GROUP BY
      KEY,
      SEIHIN,
      KOKYAKU,
      SUBSTR(MONTH,1,4);
        • 1. Re: マテリアライズドビューの結果と元SQLの結果が一致しない
          asahide
          2011年~2014年の製品別単価推移表のマテリアライズドビューを作成したが、
          例えばある製品の2013年度の単価だけNULLとなる。
          SELECT以下を発行した場合は問題なし。
          こちらは、具体的には一部だけ必ずNULLとなっているのでしょうか。
          (何度やっても?)
          それとも、毎回変わったりするものでしょうか。

          また、SELECTを発行した場合は必ず成功すると考えてよろしいでしょうか。
          またWHERE句で元データの量を絞るとマテリアライズドビューの結果も正しくなりました。
          こちらは300万件に絞ると~と言う事ですが、例えば500万件とか、990万件とかではどうなりますでしょうか。



          ご提示されている情報だと仕様通りの動作をしていないように見受けられますが。。。
          #後CASE式って若干信頼性が、、、
          • 2. Re: マテリアライズドビューの結果と元SQLの結果が一致しない
            user1371833
            早速のご回答ありがとうございます。

            試しに10.2.0.3.0の環境や11.2.0.3.の環境で約600万件では問題なく一致しました。
            件数とバージョンを変えてもう少し検証してみます。
            #バージョンの問題であれば疑問は解消します。。。。

            CASE文については最初DECODE文で作成したものが一致しなかったので、
            CASE文ならと試してみました。またDECODEに戻すかもしれません。
            • 3. Re: マテリアライズドビューの結果と元SQLの結果が一致しない
              user1371833
              件数を増やしても10.2.0.3.0の環境では再現しませんでした。
              10.2.0.2.0の問題もしくは固有の環境と推測しました。

              なお10.2.0.2.0環境下では

              SELECT * FROM 新規マテリアライズドビュー
              MINUS
              マテリアライズドビューの元SQL

              でお互いにWHERE句を付与して抽出範囲を狭めると差分が出てきますが、
              全件どうしの比較をすると差分が出てきませんでした。
              SQLレベルでは説明がつかない事象でした。。。