Oracle
如何找到視圖列的基表列?
我對 ERP 應用程序進行程式、管理和支持。我最常見的任務之一是了解數據的來源,在應用程序中找到特定報告欄位與其數據輸入欄位之間的連結。為此,我必須手動檢查一個或多個視圖的 DDL SQL 以了解表列,以便將一個視圖的表列與另一個視圖的表列匹配。此手動任務可能需要檢查四個或五個抽象層。
是否有更快的方法來檢查元數據以查找如何從其基表列計算視圖列?有沒有辦法檢查 Oracle 的執行計劃以查看重寫的查詢,跳過對中間視圖的手動檢查?
從 12c 開始,我們有了DBMS_UTILITY.EXPAND_SQL_TEXT。
您基本上通過第一個輸入參數傳遞查詢文本,並通過第二個輸出參數接收重寫的查詢。
但是由於您使用的是 11.2,因此您還不能使用它。但是,您可以收集優化器跟踪。如果您已經執行了查詢,並且有它的 sql_id:
begin dbms_sqldiag.dump_trace ( p_sql_id=>'1a2b3c4d5e6f', p_child_number=>0, p_component=>'optimizer', p_file_id=>'optimzer_trace' ); end; /
或者,如果您不知道 sql_id 並且之前沒有執行過查詢:
alter session set events 'trace[rdbms.sql_optimizer.*]'; -- run your query here, no need to wait for results, it just need to be hard parsed alter session set events 'trace[rdbms.sql_optimizer.*] off';
這些將生成一個跟踪文件,您可以在其中讀取並找到最終的重寫查詢。
老實說,一旦你有一些複雜的查詢,所有方法產生的輸出都很難閱讀,而且獲取它們的方法也不是那麼簡單,所以我通常最終手動閱讀和“解析”DDL 語句……