首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何找到视图列的基表列?

如何找到视图列的基表列?
EN

Database Administration用户
提问于 2016-08-08 15:12:11
回答 2查看 580关注 0票数 3

我规划,管理和支持一个ERP应用程序。我最常见的任务之一是了解数据的来源,在应用程序中查找特定报表字段与其数据输入字段之间的链接。为此,我必须手动检查一个或多个视图的DDL,以便理解表列,以便将一个视图的表列与另一个视图的表列匹配。这个手动任务可能需要检查四个或五个抽象层。

是否有更快的方法来检查元数据,以查找如何从其基表列中计算视图列?是否有方法检查Oracle的执行计划,以查看重写的查询,从而跳过对中间视图的手动检查?

EN

回答 2

Database Administration用户

回答已采纳

发布于 2016-08-08 23:07:09

从12c开始,我们有数据库管理系统_UTILITY.EXPAND_SQL_文本

您基本上将查询文本传递给第一个输入参数,并通过第二个输出参数接收重写的查询。

但是既然你是11.2,你还不能用这个。但是,您可以收集优化器跟踪。如果您已经运行了查询,并拥有它的sql_id:

代码语言:javascript
复制
begin
  dbms_sqldiag.dump_trace
  (
    p_sql_id=>'1a2b3c4d5e6f',
    p_child_number=>0,
    p_component=>'optimizer',
    p_file_id=>'optimzer_trace'
  );
end;
/

或者,如果您不知道sql_id,并且之前没有运行查询:

代码语言:javascript
复制
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'[]'语法甚至允许我们复制和粘贴整个查询,而不需要擦除字符串文本。

代码语言:javascript
复制
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
/
票数 5
EN

Database Administration用户

发布于 2016-08-08 22:41:46

你有执行计划的权限吗?这将显示Oracle如何将视图列解析为基本索引或表。您可以创建简单的、虚拟的查询,将重点放在您感兴趣的特定项上。

票数 1
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/146190

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档