我正在寻找一个快速的sql语句来确定某个字段是否存在于表中。确定ORACLE表中是否存在字段的快速方法
其实我用这句话
我想一定是确定是否列存在于ORACLE最快的方式。
UPDATE
我优化更大的软件系统,使得多次调用该查询,我不能修改的源代码;(,只我可以修改存储在外部文件中的查询。
表ALL_TAB_COLUMNS有超过一百万条记录。
我正在寻找一个快速的sql语句来确定某个字段是否存在于表中。确定ORACLE表中是否存在字段的快速方法
其实我用这句话
我想一定是确定是否列存在于ORACLE最快的方式。
UPDATE
我优化更大的软件系统,使得多次调用该查询,我不能修改的源代码;(,只我可以修改存储在外部文件中的查询。
表ALL_TAB_COLUMNS有超过一百万条记录。
的all_tab_columns
主键是owner, table_name, column_name
所以寻找一个特定的所有者会更快(或使用user_tab_columns
)。
+1用于添加所有者。没有桌主,结果将是无用的。鉴于此,我会看到用SELECT 1 FROM DUAL替换它的效果。 如果你想要一个有用的answwer,它可能会支付首先检查USER_TAB_COLUMNS,然后检查ALL_SYNONYMS是否有特定的同义词或PUBLIC同义词,然后与表所有者一起转到ALL_TAB_COLUMNS。注意:你可以有指向同义词的同义词等,所以正确答案会比较慢。 – 2010-02-16 23:55:20
查询Oracle数据字典 - 就像你的例子那样,可能是最快的方法。
数据字典缓存在内存中,应该能够很快地满足查询。如果您知道表的实际模式所有者,那么您可能会得到稍微更快的结果 - 这样您就不会承担针对所有模式进行搜索的成本。
我建议阅读这篇AskTom文章。它解释说,最快的检查方法是不检查。
http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:698008000346356376
+1,非常appropo链接。 – DCookie 2010-02-17 00:05:58
此查询足够了:
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)。在这个查询中,我已经删除了您未请求的信息的引用。
无论如何,你为什么要检查这个?
这SQL查询会给所有有表列 'NAVIGATION_ID' 用户 'DSGIDEV' 的名字
SELECT * FROM all_tab_cols其中列名= 'NAVIGATION_ID' 和业主= 'DSGIDEV'
因此,使用您的所有者ID名称更改您要搜索的列和拥有者的列名。
如果性能是这个查询的问题,那听起来你的数据模型有问题。你能解释为什么你需要这个吗? – 2010-02-16 21:05:35
为什么你需要对此进行快速查询?阅读表格描述输出有什么问题?或者为什么你不能读取创建模型的DDL? – 2010-02-16 21:09:38