過去の桐井戸端BBS (桐ver.8)
14841 索引の有無で結合結果が変わる 野良犬 2002/01/23-13:44
おかしな現象に出くわしましたので、なにか情報お願いします。

"cust.tbl","item.tbl","sales.tbl"の3つの表があります。
その3つを自然結合する結合表"sales.viw"があります。
cust,itemがマスター、salesが明細にあたり17件のレコードがあります。
結合表にはsalesと同じ件数が表示されます。
ここまでは普通です。

 ところが、sales.tblに重複禁止索引を定義すると結合の件数が 17件 > 6件 に減ります。
 この現象が私の環境では何度でも再現されます。
圧縮して
http://homepage2.nifty.com/alioth/
に置いてますので、他の環境でも検証いただけると助かります。
尚、管理工学研究所に問い合わせた結果は、sales.viw で"全レコードを抽出"にチェックをつけてください とのことでした。

もちろん、これらの3つの表と結合表を問題を再現できる最小構成として作成したもので本来の目的ではありません。
 索引の有無は抽出結果に影響しないのは当たり前のことだと思っていたのですが。
この様な現象に遭遇した方おられますか?

14843 Re:索引の有無で結合結果が変わる 野良犬 2002/01/23-14:51
記事番号14841へのコメント
みなさんこんにちは。

 この件について、先程管理工学研究所より回答を頂きました。
回避策として、以下のどちらかで対応してくださいとのことでした。
・重複禁止索引を止める。
・重複禁止索引をそのままにして、別に整列項目が1個の索引を作成する。

使用中の表に複数の整列項目からなる重複禁止索引を定義している場合、
ただしく抽出されているか確認したほうがいいと思います。

方法としては、

1.抽出件数を確認
2.重複禁止をいったんはずす。
3.同じ条件で再抽出、件数を確認

これでおおかたチェックはできますが、完全ではないですね。困った。


14846 Re:索引の有無で結合結果が変わる ONnoji 2002/01/23-16:42
記事番号14843へのコメント
野良犬さん
>"cust.tbl","item.tbl","sales.tbl"の3つの表があります。
>その3つを自然結合する結合表"sales.viw"があります。

すいませんが、解決策ではありません。
感想になりますが…。

3つを自然結合するというのはリレーショナル演算の教科書にはあまり見かけませんね。
最初の2つの自然結合の結果によって3つめの結合結果が変わるような気がしますが…

例えばDOS桐の結合は10個というくらいの優れものではありますが、
(すいません、Windows桐の場合は幾つだったか調べていませんが…)
最初の2つは問題ありませんが、残りとの関係は…ちょっと困ることがあったように記憶しています。
結合を2度行えばうまくいくと思いますが…未確認です。(^^ゞ
14852 Re:索引の有無で結合結果が変わる 野良犬 2002/01/24-09:07
記事番号14846へのコメント
すいません、自然結合というのは曖昧でいしたね。
3つの表を"内部結合"しています。
内部結合ですと、3つの表を、どの順序で結合しても結果は同じはずです。(理論上)
もっとも、結合速度やレコードの順序は変わるでしょうが。

 問題なのは、索引を追加すると結果が変わることです。速度改善の為に索引を後から
定義することも多いですが、その場合、速度は比べても抽出結果までは普通確認しないですよね。
たくさん一括処理をくんでると、その結果がいつも正しかったのかどうかを検査するのが大変です。

戻る