加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长百科 > 正文

Oracle 11gR2 – 查看功能列评估

发布时间:2021-01-12 18:45:00 所属栏目:站长百科 来源:网络整理
导读:对付具有为列界说的函数以及何时评估这些函数的Oracle视图,我好像有一个稀疏的题目. 假设我有以下视图和函数界说: CREATE OR REPLACE VIEW test_view_one ASSELECT column_one,a_package.function_that_returns_a_value(column_one) function_columnFROM a_
副问题[/!--empirenews.page--]

对付具有为列界说的函数以及何时评估这些函数的Oracle视图,我好像有一个稀疏的题目.

假设我有以下视图和函数界说:

CREATE OR REPLACE VIEW test_view_one AS
SELECT column_one,a_package.function_that_returns_a_value(column_one) function_column
FROM   a_table;

CREATE OR REPLACE PACKAGE BODY a_package AS 
    FUNCTION function_that_returns_a_value(p_key  VARCHAR2) RETURN VARCHAR2 IS
       CURSOR a_cur IS
          SELECT value
            FROM table_b
           WHERE key = p_key;
      p_temp   VARCHAR2(30);
    BEGIN
    -- Code here to write into a temp table. The function call is autonomous.
      OPEN a_cur;
      FETCH a_cur INTO p_temp;
      CLOSE a_cur;

      RETURN p_temp;
    END function_that_returns_a_value;
END a_package;

凡是,我但愿假如function_column包括在查询中,那么对付该查询带回的每一行,该函数都将运行.这在某些环境下好像是正确的,但对其他环境则否则.

譬喻,假设我有以下内容:

SELECT pageouter,* 
FROM(WITH page_query AS (SELECT * 
                           FROM test_view_one
                         ORDER BY column_one)
SELECT page_query.*,ROWNUM as innerrownum
FROM page_query
WHERE rownum <= 25) pageouter WHERE pageouter.innerrownum >= 1

在这种环境下,该内部查询(查询test_view_one)会带回约莫90,000笔记录.
假如我将函数界说为插入姑且表,那么我可以汇报该函数运行25次,每次返回一次.正是我所等候的.

可是,假如我在该内部查询中添加重要的where子句,譬喻

SELECT pageouter,* 
  FROM(WITH page_query AS (SELECT * 
                             FROM test_view_one
                            WHERE EXISTS (SELECT 'x' FROM some_table WHERE ...)
                            AND NOT EXISTS (SELECT 'x' FROM some_other_table WHERE ...)
                            AND EXISTS (SELECT 'x' FROM another_table WHERE ...)
                           ORDER BY column_one)
  SELECT page_query.*,ROWNUM as innerrownum
  FROM page_query
  WHERE rownum <= 25) pageouter WHERE pageouter.innerrownum >= 1

然后内部查询返回的行数是60,000,假如我然后查询姑且表,我可以汇报该函数已经运行了60,000次.不出所料,这险些粉碎了查询的机能.

上面的查询作为分页实现的一部门运行,这就是为什么我们只返回25行,这就是为什么我们只必要为这25行运行函数的缘故起因.

我应该增补一下,假如我变动WHERE子句(即我删除了一些前提),那么查询将返回到本身的举动,只运行现实带回的25行的函数.

有没有人知道评估视图中的函数的时刻?可能无论怎样确定导致它的缘故起因可能确定何时评估成果的要领(我已经搜查了表明打算,而且哪里好像没有任何对象可以放弃它).假如我知道那么我可以找到题目的办理方案,但好像除了“他们将为每一行带返来运行”之外的文档很少,这在某些环境下显然不是这种环境.

我完全领略,假如没有事变模式,很难弄清晰正在产生什么,但假如您必要更多信息,请随时扣问.

很是感激

要求的附加信息.

以下是我从出产情形中得到的现实表明打算.表名与上述查询不匹配(现实上涉及的表要多得多,但它们都是由WHERE子句中的NOT EXISTS语句插手的.)
DEMISE表相等于上述查询中的A_TABLE.

值得留意的是,在我运行表明打算之前网络统计数据以使其尽也许精确.

我对此的领略是VIEW行是评估函数的位置,这些函数在行被过滤之后产生.我的领略显然有缺陷!

以是这是一个糟糕的打算,将该成果称为60,000次…

Execution Plan
----------------------------------------------------------

-------------------------------------------------------------------------------------------
| Id  | Operation                              | Name        | Rows  | Bytes | Cost (%CPU)|
-------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                       |             |     5 | 10230 |   984   (1)|
|   1 |  FAST DUAL                             |             |     1 |       |     2   (0)|
|   2 |  FAST DUAL                             |             |     1 |       |     2   (0)|
|*  3 |  VIEW                                  |             |     5 | 10230 |   984   (1)|
|*  4 |   COUNT STOPKEY                        |             |       |       |            |
|   5 |    VIEW                                |             |     5 | 10165 |   984   (1)|
|*  6 |     SORT ORDER BY STOPKEY              |             |     5 |   340 |   984   (1)|
|   7 |      COUNT                             |             |       |       |            |
|*  8 |       FILTER                           |             |       |       |            |
|*  9 |        HASH JOIN RIGHT OUTER           |             |  5666 |   376K|   767   (1)|
|* 10 |         INDEX RANGE SCAN               | USERDATAI1  |     1 |    12 |     2   (0)|
|* 11 |         HASH JOIN RIGHT ANTI           |             |  5666 |   309K|   765   (1)|
|* 12 |          INDEX FAST FULL SCAN          | TNNTMVINI1  |     1 |    17 |    35   (0)|
|* 13 |          HASH JOIN RIGHT ANTI          |             |  6204 |   236K|   729   (1)|
|* 14 |           INDEX RANGE SCAN             | CODESGENI3  |     1 |    10 |     2   (0)|
|* 15 |           INDEX FULL SCAN              | DEMISEI4    |  6514 |   184K|   727   (1)|
|  16 |            NESTED LOOPS                |             |     1 |    25 |     3   (0)|
|  17 |             NESTED LOOPS               |             |     1 |    25 |     3   (0)|
|* 18 |              INDEX RANGE SCAN          | PROPERTY_GC |     1 |    15 |     2   (0)|
|* 19 |              INDEX UNIQUE SCAN         | CODESGENI1  |     1 |       |     0   (0)|
|* 20 |             TABLE ACCESS BY INDEX ROWID| CODESGEN    |     1 |    10 |     1   (0)|
|  21 |        TABLE ACCESS FULL               | QCDUAL      |     1 |       |     3   (0)|
|* 22 |        INDEX RANGE SCAN                | DMSELEASI4  |     1 |    21 |     2   (0)|
|* 23 |        INDEX RANGE SCAN                | TNNTMVINI1  |     1 |    17 |     1   (0)|
|  24 |        TABLE ACCESS FULL               | QCDUAL      |     1 |       |     3   (0)|
-------------------------------------------------------------------------------------------

这是个好打算.这会将函数挪用25次,可是从where子句中删除了一些不存在的语句.

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读