Я ищу быстрое 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 имеет более чем миллион записей.
первичным ключом all_tab_columns
является владелец, имя_таблицы, имя_столбца
, поэтому поиск конкретного владельца будет выполняться быстрее (или используйте user_tab_columns
).
Запрос словаря данных Oracle - как в вашем примере, это, вероятно, самый быстрый способ.
Словарь данных кэшируется в памяти и должен быть в состоянии довольно быстро удовлетворить запрос. Вы можете получить результаты немного быстрее, если знаете фактического владельца схемы таблицы, чтобы не брать на себя расходы на поиск по всем схемам.
Этот вопрос достаточно:
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 на моем случае) . В этом запросе я вырезал ссылки на информацию, не запрошенную вами.
Почему вы хотите проверить это?
Предлагаю прочитать эту статью на AskTom. В нем объясняется, что самый быстрый способ проверить - это вообще не проверять.
http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:698008000346356376