2010-02-16 3 views
7

Je cherche une phrase sql rapide pour déterminer quand un champ existe ou non dans une table.Un moyen rapide de déterminer si un champ existe dans une table ORACLE

en fait, je me sers de cette phrase

Select 1 
    from dual 
    where exists (select 1 
        from all_tab_columns 
        where table_name = 'MYTABLE' 
        and column_name = 'MYCOLUMN') 

Je pense qu'il doit y avoir un meilleur moyen de déterminer si oui ou non une colonne existe dans ORACLE.

MISE À JOUR

Je l'optimisation d'un système logiciel plus qui fait 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 .

le tableau all_tab_columns a plus d'un million d'enregistrements.

+1

Si la performance est un problème sur cette requête, il semble que quelque chose ne va pas avec votre modèle de données. Pouvez-vous expliquer pourquoi vous en avez besoin? –

+0

Pourquoi avez-vous besoin d'une requête rapide pour cela? Quel est le problème avec la lecture de la table décrivent la sortie? Ou pourquoi ne pouvez-vous pas lire le DDL qui a créé le modèle? –

Répondre

9

la clé primaire de all_tab_columns est owner, table_name, column_name si la recherche d'un propriétaire particulier sera plus rapide (ou utilisez user_tab_columns).

+1

+1 pour l'ajout du propriétaire.Sans un propriétaire de table, le résultat sera plutôt inutile. Compte tenu de cela, je verrais ce que l'effet de le remplacer par un SELECT 1 FROM DUAL aurait. Si vous voulez une réponse utile, il peut être utile de vérifier d'abord USER_TAB_COLUMNS, puis ALL_SYNONYMS pour un synonyme spécifique ou un synonyme PUBLIC, puis aller à ALL_TAB_COLUMNS avec le propriétaire de la table. Note: vous pouvez avoir des synonymes pointant vers des synonymes, etc. Donc, une réponse correcte sera plus lente. –

1

Interroger le dictionnaire de données Oracle - comme vous le faites en effet, est probablement le moyen le plus rapide.

Le dictionnaire de données est mis en cache en mémoire et devrait pouvoir satisfaire la requête assez rapidement. Vous pouvez obtenir des résultats légèrement plus rapides si vous connaissez le propriétaire réel du schéma de la table - de sorte que vous n'encourez pas le coût de la recherche sur tous les schémas.

1

Cette requête suffit:

SELECT null 
    FROM user_tab_columns 
WHERE table_name = 'MYTABLE' and column_name = 'MYCOLUMN' 

Le seul moyen le plus rapide est d'interroger directement des tables internes n'est pas une méthode recommandée et vous avez besoin de subventions sur des objets sys:

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 provient de la définition USER_TAB_COLUMNS et il peut changer sur différentes versions (10gR2 sur mon cas). Dans cette requête, j'ai coupé les références à des informations que vous n'avez pas demandées.

Quoi qu'il en soit, pourquoi voulez-vous vérifier cela?

0

Cette requête SQL donnera le nom de toute la table ayant la colonne 'NAVIGATION_ID' pour l'utilisateur 'DSGIDEV'

select * from all_tab_cols où nom_colonne = 'NAVIGATION_ID' et propriétaire = 'DSGIDEV'

Ainsi, changez le nom de colonne avec la colonne que vous voulez rechercher et propriétaire avec votre nom d'identification de propriétaire.

Questions connexes