web-dev-qa-db-fra.com

la compréhension du nombre maximal de colonnes ORA-01792 dans une table ou une vue est de 1000

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?

6
Jeroen

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:

  • Bogue 19509982 Désactivation de l'augmentation de ORA-1792 par défaut
  • 11
    JSapkota

    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 (+)
    
    1
    toree