This discussion is archived
3 Replies Latest reply: Jan 22, 2013 10:53 PM by user1371833 RSS

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

user1371833 Newbie
Currently Being Moderated
お世話になっております。
マテリアライズドビューを作成したのですが、元となる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 Expert
    Currently Being Moderated
    2011年~2014年の製品別単価推移表のマテリアライズドビューを作成したが、
    例えばある製品の2013年度の単価だけNULLとなる。
    SELECT以下を発行した場合は問題なし。
    こちらは、具体的には一部だけ必ずNULLとなっているのでしょうか。
    (何度やっても?)
    それとも、毎回変わったりするものでしょうか。

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



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

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

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

    なお10.2.0.2.0環境下では

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

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

Legend

  • Correct Answers - 10 points
  • Helpful Answers - 5 points