最近、サーバーをOracle 11からOracle 12cに移行し、いくつかの厄介な問題に遭遇しました。それらの1つは、いくつかのレポートで次のエラーが発生することです。
ORA-01792:表またはビューの列の最大数は1000です
はい、大丈夫、私はいくつかの制限がある必要があることを理解しています。問題は、クエリが以前に機能していて、DBがすべての列をロードする理由がないことです。クエリ内のどのテーブルにも1000を超える列はありません。それらを組み合わせることができます。だから私がすべてからselect *をした場合;結果セットがビュー/テーブルと事実上同じであるため、出力が限界に達することを理解しています(それは何ですか?ここで推測しているだけですか?)
「問題のクエリ」は、一連の大きなテーブルといくつかの小さなテーブルを複数回結合するため、列の総数は1000を超える可能性があります。
ただし、クエリでは30列程度しか選択されません。結合に使用するフィールドを追加します。バックグラウンドでインデックスによって使用されるいくつかの追加フィールドでさえ、クエリの実行に必要な最大50〜70列を追加する可能性があります。これらの情報はすべて、クエリおよびテーブル情報内で適切に定義されています。それでは、なぜDBは追加の列すべてを気にするのでしょうか。
これまで読んだ解決策は、クエリを変更するか、この警告/エラーを無効にすることです。どちらも私には解決策ではありません。警告を無効にするために私が考えることができる唯一の理由は、Oracleが以前にユーザーに通知することを決定したことと、この「問題」が両方のバージョンのバックグラウンドに存在したことです。
これについて何かアイデアはありますか?または、「大きな」クエリがどのように処理されるかについての私の理解は?
My Oracle Supportによれば、ORA-01792
は未公開のバグが原因で発生します。
Oracleでは、エラーを回避するために、クエリやビューの定義を変更することをお勧めします。ただし、SQLを調整できない場合は、次の方法でチェックを無効にできます。
SQL> alter system set "_fix_control"='17376322:OFF';
または、暫定パッチ(パッチ19509982)を適用して、デフォルトでエラーを無効にすることもできます。
参考文献:
「古い」結合構文に変更すると役立つようです。
から:
select ...
from table1 t1
left join table2 on t1.id = t2.fid
に:
select ...
from table t1, table t2
where t1.id = t2.fid (+)