Быстрый способ определить, существует ли поле в таблице ORACLE

Я ищу быстрое sql предложение для, определяют, когда поле существует или не в таблице.

на самом деле я использую это предложение

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

Я думаю, что должен быть самый быстрый способ определить, существует ли столбец в Oracle.

ОБНОВЛЕНИЕ

Я оптимизирую большую программную систему, которая выполняет множественные вызовы к этому Запросу, я не могу изменить исходный код ;(, только я могу изменить запрос, который хранится во внешнем файле.

Таблица all_tab_columns имеет более чем миллион записей.

7
задан FerranB 16 February 2010 в 21:34
поделиться

4 ответа

первичным ключом all_tab_columns является владелец, имя_таблицы, имя_столбца , поэтому поиск конкретного владельца будет выполняться быстрее (или используйте user_tab_columns ).

9
ответ дан 6 December 2019 в 19:36
поделиться

Запрос словаря данных Oracle - как в вашем примере, это, вероятно, самый быстрый способ.

Словарь данных кэшируется в памяти и должен быть в состоянии довольно быстро удовлетворить запрос. Вы можете получить результаты немного быстрее, если знаете фактического владельца схемы таблицы, чтобы не брать на себя расходы на поиск по всем схемам.

1
ответ дан 6 December 2019 в 19:36
поделиться

Этот вопрос достаточно:

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

единственный самый быстрый путь состоит в том, чтобы подвергнуть сомнению непосредственно от внутренних столов, который не является рекомендуемым путем , и вам нужны гранты по объектам 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))))

Этот вопрос взят от определение USER_TAB_COLUMNS , и это может измениться по различным выпускам (10gR2 на моем случае) . В этом запросе я вырезал ссылки на информацию, не запрошенную вами.

Почему вы хотите проверить это?

1
ответ дан 6 December 2019 в 19:36
поделиться

Предлагаю прочитать эту статью на AskTom. В нем объясняется, что самый быстрый способ проверить - это вообще не проверять.

http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:698008000346356376

2
ответ дан 6 December 2019 в 19:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: