Nous avons récemment migré un serveur d'Oracle 11 vers Oracle 12c et rencontré quelques problèmes gênants. L'un d'eux est que quelques rapports donnent l'erreur suivante:
ORA-01792: le nombre maximum de colonnes dans une table ou vue est de 1000
OK, d'accord, je comprends qu'il doit y avoir des limites. Le problème est que la requête a fonctionné auparavant et que je ne vois aucune raison pour que la base de données charge toutes les colonnes. Aucune des tables de la requête ne comporte plus de 1 000 colonnes. Ensemble, ils auraient pu. Donc, si je faisais une sélection * de tout; Je comprends que la sortie se heurte à des limites car un ensemble de résultats est virtuellement la même chose qu'une vue/table (est-ce? Je devine juste ici?)
La "requête de problème" rejoint plusieurs tas de grandes tables et plusieurs plus petites plusieurs fois, donc oui, le nombre total de colonnes peut être supérieur à 1000.
Cependant, la requête ne sélectionne qu'une trentaine de colonnes. Ajoutez les champs utilisés pour la jointure et peut-être même certains champs supplémentaires utilisés par les index en arrière-plan, cela peut ajouter jusqu'à 50 à 70 colonnes nécessaires pour préformer la requête. Toutes ces informations sont bien définies dans les informations de requête et de table. Alors pourquoi diable la DB se soucierait-elle même de toutes les colonnes supplémentaires?
Les solutions que j'ai lues jusqu'à présent consistent à modifier la requête ou à désactiver cet avertissement/erreur. Les deux ne sont pas des solutions pour moi. La seule raison pour laquelle je peux penser à désactiver l'avertissement est qu'Oracle a décidé d'informer les utilisateurs plus tôt et que ce "problème" existait en arrière-plan dans les deux versions.
Des idées à ce sujet? Ou ma compréhension de la façon dont les "grandes" requêtes sont traitées?
Selon le support My Oracle, ORA-01792
est dû à un bogue non publié.
Oracle suggère de modifier la définition de la requête et/ou de la vue pour éviter l'erreur. Cependant, dans les cas où le SQL ne peut pas être ajusté, la vérification peut être désactivée par:
SQL> alter system set "_fix_control"='17376322:OFF';
Alternativement, un patch provisoire (patch 19509982) peut être appliqué pour désactiver l'erreur par défaut.
Références:
Le passage à la "vieille" syntaxe de jointure semble aider.
De:
select ...
from table1 t1
left join table2 on t1.id = t2.fid
À:
select ...
from table t1, table t2
where t1.id = t2.fid (+)