Oracle 11gR2 – 查看功能列评估
副问题[/!--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笔记录. 可是,假如我在该内部查询中添加重要的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语句插手的.) 值得留意的是,在我运行表明打算之前网络统计数据以使其尽也许精确. 我对此的领略是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子句中删除了一些不存在的语句. (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |