Je cherche une phrase SQL rapide pour déterminer quand il existe un champ ou non dans une table.
En réalité, j'utilise cette phrase p> Je pense qu'il y pense Doit être un moyen le plus rapide de déterminer si une colonne existe ou non dans Oracle. p> update strong> p> J'épuise un système de logiciels plus grand qui fait plusieurs appels qui apportent plusieurs appels à cette requête, je ne peux pas modifier le code source; (, seulement je peux modifier la requête qui est stockée dans un fichier externe. P> La table All_Tab_Columns a plus d'un million d'enregistrements. P> < / p>
6 Réponses :
La clé principale de all_tab_columns code> est
propriétaire, name_name, colonne_name code> SO suite pour un propriétaire particulier sera plus rapide (ou utilisez
user_tab_columns code>). p>
+1 pour ajouter le propriétaire. Sans un propriétaire de table, le résultat sera assez inutile. Étant donné que je verrais que l'effet de la remplacer par un Select 1 de Dual serait. Si vous souhaitez une réponse utile, cela peut payer pour vérifier d'abord user_tab_columns, puis tous les_synonymes de synonyme spécifique ou synonyme public, puis allez à all_tab_columns avec le propriétaire de la table. Remarque: Vous pouvez avoir des synonymes pointant sur Synonymes, etc., une réponse correcte sera donc plus lente.
Querifier le dictionnaire de données Oracle - comme vous le fait, c'est probablement le moyen le plus rapide. P>
Le dictionnaire de données est mis en cache en mémoire et devrait être capable de satisfaire la requête assez rapidement. Vous pourrez peut-être obtenir des résultats légèrement plus rapides si vous connaissez le propriétaire du schéma réel de la table - de sorte que vous n'abumiez pas le coût de la recherche contre tous les schémas. P>
Je suggère de lire cet article Asktom. Il explique que le moyen le plus rapide de vérifier n'est pas de vérifier du tout. P>
http: // asktom.oracle.com/pls/asktom/f?p=100:11:0:0:::::111:0:0::698008000346356376 P>
Cette requête est suffisante:
select null from sys.col$ c , sys.obj$ o , sys.obj$ ot where o.name = 'MYTABLE' and c.name = 'MYCOLUMN' and o.obj# = c.obj# and o.owner# = userenv('SCHEMAID') and ot.type#(+) = 13 and (o.type# in (3, 4) or (o.type# = 2 and not exists (select null from sys.tab$ t where t.obj# = o.obj# and (bitand(t.property, 512) = 512 or bitand(t.property, 8192) = 8192))))
Cette requête SQL donnera le nom de tout le tableau avec la colonne 'Navigation_ID' pour l'utilisateur 'DSGIDEV' P>
Sélectionnez * à partir d'all_tab_cols où column_name = 'Navigation_ID' et propriétaire = 'dsgidev' strong> p> p>
Ainsi, modifiez le nom de la colonne avec la colonne que vous souhaitez rechercher et propriétaire avec le nom d'identification de votre propriétaire. P>
ez, le moyen le plus rapide est simplement créer une fonction comme ceci:
Si la performance est un problème sur cette requête, cela ressemble à quelque chose de mal avec votre modèle de données. Pouvez-vous expliquer pourquoi vous avez besoin de cela?
Pourquoi avez-vous besoin d'une requête rapide pour cela? Quel est le problème avec la lecture de la table décrire la sortie? Ou pourquoi ne pouvez-vous pas lire le DDL qui a créé le modèle?