4

2行を返すはずのクエリがあります。ただし、48 行が返されます。結合されているテーブルの 1 つが存在しないように動作しています。しかし、クエリの from または where 部分を変更せずに、そのテーブルの列を select 句に追加すると、2 行が返されます。

選択に「m.*」がない場合の「Explain plan」の内容は次のとおりです。 事前にプランを説明

これは、選択に m.* を追加した後のものです。 後で計画を説明する

なぜこのように振る舞うべきなのか、誰か説明できますか?

更新: この問題は 1 つのシステムでのみ発生し、別のシステムでは発生しませんでした。DBA は、問題があるのは optimizer_features_enable を 10.2.0.5 に設定して実行しており、問題が発生していないのは optimizer_features_enable を 10.2.0.4 に設定して実行していることを確認しました。残念ながら、顧客サイトは 10.2.0.5 を実行しています。

4

2 に答える 2

2

これは、10gR2 で導入された結合の削除に関するものです。

テーブルの削除 (「結合の削除」とも呼ばれます) は、クエリから冗長なテーブルを削除します。テーブルの列が結合述語でのみ参照されている場合、そのテーブルは冗長であり、それらの結合が結果の行をフィルタリングも拡張もしないことが保証されています。Oracle が冗長なテーブルを排除する場合がいくつかあります。

多分それは関連するバグのようなものです。この記事を見てください。

于 2011-03-15T06:03:43.913 に答える