ITPUB??ì3
12月微软Hyper-V虚拟化沙龙主题征集
ITPUB论坛 » Oracle开发 » 很少受关注的SQL中一些函数调用秘密

标题: [精华] 很少受关注的SQL中一些函数调用秘密
  本主题由 System 于 2008-9-11 05:00 解除限时置顶 
离线 nyfor
Oracle Fan


来自 苏州
精华贴数 7
个人空间 0
技术积分 8321 (155)
社区积分 478 (1610)
注册日期 2002-1-6
论坛徽章:17
现任管理团队成员     
      

发表于 2008-9-10 09:17 


QUOTE:
原帖由 newkid 于 2008-9-10 03:16 发表
刚才试了下,NO_MERGE HINT确实起作用了,但它不能防止ORACLE把  filter("N"=1) 改写为 filter("PKG"."INC_N"()=1),因此出来的答案总是不对劲。

任何分析函数也能够和ROWNUM一样起作用:

exec pkg.reset_n;

select * from (select pkg.inc_n n, count(*) over() from t) v where n = 1;

奇怪, 我怎么没发现NO_MERGE 起作用了呢, 我不管加不加, 其执行计划的 Access predicates, Filter predicates 没有任何变化, 都是 Filter("SCOTT"."PKG"."INC_N"() = 1)

9i, 10g 环境下我测试出都这样.


__________________
 
帮助别人,也在帮助自己!
Oracle Version 9.2.0
Oracle Version 10.2.0

看别人不顺眼是自己修养不够!
只看该作者    顶部
离线 nyfor
Oracle Fan


来自 苏州
精华贴数 7
个人空间 0
技术积分 8321 (155)
社区积分 478 (1610)
注册日期 2002-1-6
论坛徽章:17
现任管理团队成员     
      

发表于 2008-9-10 09:24 


QUOTE:
原帖由 newkid 于 2008-9-10 03:54 发表
能否做几个 9I 下DETERMINISTIC函数的试验?

Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
Connected as scott

SQL>
SQL> create or replace package pkg
  2  is
  3    function get_n return number;
  4    function inc_n return number deterministic;
  5    procedure reset_n;
  6  end;
  7  /

Package created
SQL> create or replace package body pkg
  2  is
  3    g_n number;
  4    function get_n return number
  5    is
  6    begin
  7      return g_n;
  8    end;
  9  
10    function inc_n return number deterministic
11    is
12    begin
13      g_n := g_n + 1;
14      return g_n;
15    end;
16  
17    procedure reset_n
18    is
19    begin
20      g_n := 0;
21    end;
22  begin
23    g_n := 0;
24  end;
25  /

Package body created
SQL> exec pkg.reset_n;

PL/SQL procedure successfully completed
SQL> select pkg.inc_n from t;

     INC_N
----------
         1
         1
         1

SQL>
以下是在9i上:
Connected to Personal Oracle9i Release 9.2.0.1.0
Connected as scott

SQL>
SQL> create or replace package pkg
  2  is
  3    function get_n return number;
  4    function inc_n return number deterministic;
  5    procedure reset_n;
  6  end;
  7  /

Package created
SQL> create or replace package body pkg
  2  is
  3    g_n number;
  4    function get_n return number
  5    is
  6    begin
  7      return g_n;
  8    end;
  9  
10    function inc_n return number deterministic
11    is
12    begin
13      g_n := g_n + 1;
14      return g_n;
15    end;
16  
17    procedure reset_n
18    is
19    begin
20      g_n := 0;
21    end;
22  begin
23    g_n := 0;
24  end;
25  /

Package body created
SQL> exec pkg.reset_n;

PL/SQL procedure successfully completed
SQL> select pkg.inc_n from t;

     INC_N
----------
         1
         2
         3

SQL>
9i下 声明函数为 deterministic 的语法已经支持, 但是似乎该特性尚未实现.


__________________
 
帮助别人,也在帮助自己!
Oracle Version 9.2.0
Oracle Version 10.2.0

看别人不顺眼是自己修养不够!
只看该作者    顶部
在线/呼叫 newkid
资深新手
老程序员


来自 银河系
精华贴数 2
个人空间 0
技术积分 2778 (579)
社区积分 0 (121048)
注册日期 2004-6-26
论坛徽章:5
生肖徽章2007版:马生肖徽章2007版:鸡2008北京奥运纪念徽章:垒球2008北京奥运纪念徽章:羽毛球  
      

发表于 2008-9-10 09:48 
NO_MERGE确实修改了执行计划,在FILTER和SELECT之间加进了一层“VIEW”,但FILTER还是没变。
我也试了 NO_PUSH_PRED, NO_PUSH_SUBQ, 但都改变不了 FILTER。


__________________
只看该作者    顶部
离线 kmpx
VICTORY


精华贴数 0
个人空间 0
技术积分 1078 (1713)
社区积分 1 (43006)
注册日期 2006-10-8
论坛徽章:1
2008北京奥运纪念徽章:铁人三项     
      

发表于 2008-9-10 10:27 
看得偶晕了


__________________
别揣着糊涂装明白
只看该作者    顶部
离线 wuhuaT
勿忘我


来自 勿问我
精华贴数 0
个人空间 0
技术积分 1873 (891)
社区积分 479 (1485)
注册日期 2008-1-14
论坛徽章:10
2008北京奥运纪念徽章:羽毛球2008北京奥运纪念徽章:田径2008北京奥运纪念徽章:羽毛球数据库板块每日发贴之星ERP板块每日发贴之星生肖徽章2007版:兔
生肖徽章2007版:鸡生肖徽章2007版:蛇生肖徽章2007版:牛   

发表于 2008-9-10 10:31 
感觉比较深奥,还看不懂


__________________
活到老,学到老,玩到老,乐到老
只看该作者    顶部
离线 jason_tu
T-Mac


精华贴数 0
个人空间 0
技术积分 356 (5829)
社区积分 681 (1218)
注册日期 2007-5-28
论坛徽章:12
授权会员生肖徽章2007版:狗生肖徽章2007版:鼠生肖徽章2007版:狗生肖徽章2007版:牛生肖徽章2007版:虎
生肖徽章2007版:猪生肖徽章2007版:虎生肖徽章2007版:牛生肖徽章2007版:猴生肖徽章2007版:狗生肖徽章2007版:鸡

发表于 2008-9-10 16:18 
支持


__________________
搶分 搶章 搶紅包!
MSN:tzj_815@hotmail.com
只看该作者    顶部
离线 renminyan
初级会员



精华贴数 0
个人空间 0
技术积分 65 (23193)
社区积分 0 (665304)
注册日期 2005-10-22
论坛徽章:3
生肖徽章2007版:鼠生肖徽章2007版:猴生肖徽章2007版:鸡   
      

发表于 2008-9-10 17:44 
初看有白,不过最后发现楼主是位研究者,学习了,谢谢


只看该作者    顶部
离线 iamclq
Chx


来自 FuJian
精华贴数 0
个人空间 6
技术积分 776 (2515)
社区积分 34 (6045)
注册日期 2006-9-4
论坛徽章:7
授权会员2008北京奥运纪念徽章:铁人三项生肖徽章2007版:鸡数据库板块每日发贴之星数据库板块每日发贴之星数据库板块每日发贴之星
生肖徽章2007版:鼠     

发表于 2008-9-20 23:57 
这个实验做得很有意义,让我增长了不长见识


只看该作者    顶部
离线 lukytoday
DBA山寨版


来自 sichuan
精华贴数 0
个人空间 0
技术积分 63 (23765)
社区积分 3 (23235)
注册日期 2008-9-26
论坛徽章:0
      
      

发表于 2008-11-2 15:51 
着急啊,现在只有看的份。就算着急,也热血沸腾的。我顶


__________________
Never never never give up。
只看该作者    顶部
离线 lukytoday
DBA山寨版


来自 sichuan
精华贴数 0
个人空间 0
技术积分 63 (23765)
社区积分 3 (23235)
注册日期 2008-9-26
论坛徽章:0
      
      

发表于 2008-11-2 15:54 
擂台似的,远远的瞧着,啥时才能跳上去来两拳。


__________________
Never never never give up。
只看该作者    顶部
相关内容


CopyRight 1999-2006 itpub.net All Right Reserved.
北京皓辰广域网络信息技术有限公司. 版权所有
E-mail:Webmaster@itpub.net
京ICP证:010037号 联系我们 法律顾问