我正在尋找一個快速的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