Oracle

如何找到視圖列的基表列?

  • July 24, 2020

我對 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 語句……

引用自:https://dba.stackexchange.com/questions/146190