2010-02-16 5 views
7

Ich bin auf der Suche nach einem schnellen SQL-Satz für bestimmen, wenn ein Feld existiert oder nicht in einer Tabelle.Schnelle Möglichkeit zu bestimmen, ob ein Feld in einer ORACLE-Tabelle vorhanden ist

tatsächlich verwende ich diesen Satz

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

ich es denke, ein schnellster Weg sein muss, um zu bestimmen, ob eine Spalte in ORACLE existiert.

UPDATE

Ich bin ein größeres Software-System zu optimieren, die mehrere Anrufe auf diese Query macht, kann ich den Quellcode ändern nicht, (kann ich die Abfrage nur ändern, die in einer externen Datei gespeichert wird .

die Tabelle all_tab_columns hat über eine Million Datensätze.

+1

Wenn die Leistung bei dieser Abfrage ein Problem darstellt, scheint es, dass mit Ihrem Datenmodell etwas nicht stimmt. Kannst du erklären, warum du das brauchst? –

+0

Warum benötigen Sie eine schnelle Abfrage dafür? Was ist los mit dem Lesen der Tabelle beschreiben Ausgabe? Oder warum können Sie nicht die DDL lesen, die das Modell erstellt hat? –

Antwort

9

der Primärschlüssel all_tab_columns ist owner, table_name, column_name so für einen bestimmten Besitzer schneller (oder user_tab_columns verwenden) wird suchen.

+1

+1 zum Hinzufügen des Besitzers.Ohne einen Tischbesitzer wird das Ergebnis ziemlich nutzlos sein. Angesichts dessen würde ich sehen, was der Effekt hätte, es durch ein SELECT 1 FROM DUAL zu ersetzen. Wenn Sie eine nützliche Antwort wünschen, kann es sich auszahlen, zuerst USER_TAB_COLUMNS und dann ALL_SYNONYMS entweder für ein bestimmtes Synonym oder ein PUBLIC-Synonym zu prüfen und dann mit dem Tabellenbesitzer zu ALL_TAB_COLUMNS zu gehen. Hinweis: Sie können Synonyme haben, die auf Synonyme usw. verweisen. Eine korrekte Antwort wird also langsamer sein. –

1

Die Abfrage des Oracle Data Dictionary - wie Sie es in der Tat tun - ist wahrscheinlich der schnellste Weg.

Das Datenwörterbuch wird im Arbeitsspeicher zwischengespeichert und sollte die Abfrage sehr schnell erfüllen können. Sie können möglicherweise etwas schnellere Ergebnisse erzielen, wenn Sie den tatsächlichen Schemaeigner der Tabelle kennen - damit Sie nicht die Kosten für die Suche nach allen Schemas aufwenden müssen.

1

Diese Abfrage ist genug:

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

Der einzige schnellste Weg ist, direkt von den internen Tabellen abfragen, die ist keine empfohlene Methode und Sie müssen Zuschüsse über sys Objekte:

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)))) 

Diese Abfrage stammt aus der USER_TAB_COLUMNS Definition und kann es verschiedene Versionen wechseln (10gR2 auf meinem Fall). Bei dieser Abfrage habe ich die Verweise auf Informationen abgeschnitten, die Sie nicht angefordert haben.

Wie auch immer, warum möchten Sie dies überprüfen?

0

Diese SQL-Abfrage wird für den Benutzer 'DSGIDEV'

select * from all_tab_cols wo column_name = 'NAVIGATION_ID' und owner = 'DSGIDEV'

Namen aller der Tabelle mit der Spalte 'NAVIGATION_ID' geben

Ändern Sie also den Spaltennamen mit der Spalte, die Sie durchsuchen möchten, und den Eigentümer mit Ihrer Eigner-ID.

Verwandte Themen