2010-02-16 71 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名稱更改您要搜索的列和擁有者的列名。

相關問題