我规划,管理和支持一个ERP应用程序。我最常见的任务之一是了解数据的来源,在应用程序中查找特定报表字段与其数据输入字段之间的链接。为此,我必须手动检查一个或多个视图的DDL,以便理解表列,以便将一个视图的表列与另一个视图的表列匹配。这个手动任务可能需要检查四个或五个抽象层。
是否有更快的方法来检查元数据,以查找如何从其基表列中计算视图列?是否有方法检查Oracle的执行计划,以查看重写的查询,从而跳过对中间视图的手动检查?
发布于 2016-08-08 23:07:09
从12c开始,我们有数据库管理系统_UTILITY.EXPAND_SQL_文本。
您基本上将查询文本传递给第一个输入参数,并通过第二个输出参数接收重写的查询。
但是既然你是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语句.
编辑:WITH子句允许我们在SQL中执行此操作,而无需单独调用PL/SQL。q'[]'语法甚至允许我们复制和粘贴整个查询,而不需要擦除字符串文本。
WITH
FUNCTION get_expanded_sql_text_ (
input_sql_text_ IN CLOB) RETURN CLOB
IS
output_sql_text_ CLOB;
BEGIN
dbms_utility.expand_sql_text (
input_sql_text => input_sql_text_,
output_sql_text => output_sql_text_);
RETURN output_sql_text_;
END get_expanded_sql_text_;
SELECT get_expanded_sql_text_(q'[SELECT 'Hello, World!' FROM DUAL]') AS expanded_sql_text
FROM DUAL
/发布于 2016-08-08 22:41:46
你有执行计划的权限吗?这将显示Oracle如何将视图列解析为基本索引或表。您可以创建简单的、虚拟的查询,将重点放在您感兴趣的特定项上。
https://dba.stackexchange.com/questions/146190
复制相似问题