2010-02-16 74 views
7

我正在寻找一个快速的sql语句来确定某个字段是否存在于表中。确定ORACLE表中是否存在字段的快速方法

其实我用这句话

​​

我想一定是确定是否列存在于ORACLE最快的方式。

UPDATE

我优化更大的软件系统,使得多次调用该查询,我不能修改的源代码;(,只我可以修改存储在外部文件中的查询。

表ALL_TAB_COLUMNS有超过一百万条记录。

+1

如果性能是这个查询的问题,那听起来你的数据模型有问题。你能解释为什么你需要这个吗? – 2010-02-16 21:05:35

+0

为什么你需要对此进行快速查询?阅读表格描述输出有什么问题?或者为什么你不能读取创建模型的DDL? – 2010-02-16 21:09:38

回答

9

all_tab_columns主键是owner, table_name, column_name所以寻找一个特定的所有者会更快(或使用user_tab_columns)。

+1

+1用于添加所有者。没有桌主,结果将是无用的。鉴于此,我会看到用SELECT 1 FROM DUAL替换它的效果。 如果你想要一个有用的answwer,它可能会支付首先检查USER_TAB_COLUMNS,然后检查ALL_SYNONYMS是否有特定的同义词或PUBLIC同义词,然后与表所有者一起转到ALL_TAB_COLUMNS。注意:你可以有指向同义词的同义词等,所以正确答案会比较慢。 – 2010-02-16 23:55:20

1

查询Oracle数据字典 - 就像你的例子那样,可能是最快的方法。

数据字典缓存在内存中,应该能够很快地满足查询。如果您知道表的实际模式所有者,那么您可能会得到稍微更快的结果 - 这样您就不会承担针对所有模式进行搜索的成本。

1

此查询足够了:

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)。在这个查询中,我已经删除了您未请求的信息的引用。

无论如何,你为什么要检查这个?

0

这SQL查询会给所有有表列 'NAVIGATION_ID' 用户 'DSGIDEV' 的名字

SELECT * FROM all_tab_cols其中列名= 'NAVIGATION_ID' 和业主= 'DSGIDEV'

因此,使用您的所有者ID名称更改您要搜索的列和拥有者的列名。

相关问题