2010-02-16 17 views
7

Estoy buscando una oración SQL rápida para determinar cuándo existe un campo o no en una tabla.Forma rápida de determinar si existe un campo en una tabla ORACLE

realidad estoy usando esta frase

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

Creo que debe haber una manera más rápida para determinar si es o no una columna existe en ORACLE.

ACTUALIZACIÓN

estoy optimización de un sistema de software más grande que hace varias llamadas a esta consulta, no puedo modificar el código fuente; (, sólo yo puedo modificar la consulta que se almacena en un archivo externo .

los all_tab_columns tabla tiene más de un millón de registros.

+1

Si el rendimiento es un problema en esta consulta, parece que hay algún problema con su modelo de datos. ¿Puedes explicar por qué necesitas esto? –

+0

¿Por qué necesita una consulta rápida para esto? ¿Qué hay de malo en leer la tabla describir salida? ¿O por qué no puedes leer el DDL que creó el modelo? –

Respuesta

9

la clave primaria de all_tab_columns es owner, table_name, column_name por lo que buscan un propietario particular, será más rápido (o utilizar user_tab_columns).

+1

+1 para agregar el propietario.Sin un propietario de mesa, el resultado será bastante inútil. Dado eso, vería el efecto de reemplazarlo con un SELECT 1 FROM DUAL. Si desea una respuesta útil, le conviene verificar primero USER_TAB_COLUMNS, luego ALL_SYNYYMS para un sinónimo específico o un sinónimo PUBLIC, luego vaya a ALL_TAB_COLUMNS con el propietario de la tabla. Nota: puede tener sinónimos que apunten a sinónimos, etc. Por lo tanto, la respuesta correcta será más lenta. –

1

Consultar el diccionario de datos de Oracle, como tu ejemplo lo hace, es probablemente la manera más rápida.

El diccionario de datos está almacenado en la memoria caché y debería ser capaz de satisfacer la consulta bastante rápido. Es posible que obtenga resultados ligeramente más rápidos si conoce el propietario del esquema real de la tabla, para que no incurra en el costo de buscar en todos los esquemas.

1

Esta consulta es suficiente:

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

La única manera más rápida es consultar directamente de las tablas internas que no es un método recomendado y que necesita subvenciones sobre los objetos 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)))) 

Esta consulta proviene de la definición USER_TAB_COLUMNS y puede cambiar en diferentes versiones (10gR2 en mi caso). En esta consulta corté las referencias a la información que no solicitó.

De todos modos, ¿por qué quieres comprobar esto?

0

esta consulta SQL le dará a nombre de toda la columna de la tabla que tiene 'NAVIGATION_ID' para la 'DSGIDEV' usuario

seleccionar * de all_tab_cols donde nombre_columna = 'NAVIGATION_ID' y propietario = 'DSGIDEV'

Por lo tanto, cambie el nombre de la columna con la columna que desea buscar y el propietario con el nombre de su propietario.

Cuestiones relacionadas