nvl() 与decode()两个函数哪个性能更佳?

1.创建一个测试表test,并插入一条数据
SQL> create table test(id int);
Table created.
SQL> insert into test values(1);
1 row created.
SQL> commit;
Commit complete.

2.创建一个函数,用来延时,调到到这个函数会在这里循环50000000次,会有待等
SQL> create or replace function sleep_now return number is
  2   a number;
  3    begin
  4     a:=0;
  5      while a<50000000
  6      loop
  7        a :=a+1;
  8       end loop;
  9      return a;
10     end;
11  /
Function created.

3.打开sqlplus的计时器
SQL> set timing on

4.nvl()函数测试表test中的id列的值是否为空
SQL> select nvl(id,sleep_now()) from test;
NVL(ID,SLEEP_NOW())
-------------------
                  1
Elapsed: 00:00:03.25
查表test中就一条数据花了3秒多才读完,说明什么问题呢,思考一下?
好,那我直接给个固定的值:比如10,放到nvl中执行,看是不是马上就会执行完毕?
SQL> select nvl(10,sleep_now()) from test;
NVL(10,SLEEP_NOW())
-------------------
                 10
Elapsed: 00:00:03.33
还是一样查一条数据要花3秒多,说明用nvl()函数,即使这个值非空,这个函数还是会去读后面的sleep_now()函数,这样就会消耗时间了。

5.decode()来测试同样的一条数据,看查询的时间
SQL>  select decode(id,null,sleep_now(),1) from test;
DECODE(ID,NULL,SLEEP_NOW(),1)
-----------------------------
                            1
Elapsed: 00:00:00.01
马上查出,几乎没花时间,很快哦!
同样再测一下固定值:比如10
SQL> select decode(id,10,sleep_now(),1) from test;
DECODE(ID,10,SLEEP_NOW(),1)
---------------------------
                          1
Elapsed: 00:00:00.01
同样也是马上查出
这么快查出,说明一当decode()函数查到值就不会去读后面的sleep_now()函数。

6.从第4步与第5步比较,同样的操作,明显 decode函数性能更佳。

7.最后再来个decode的例子,如何用好decode()
truncate table test;
begin
for i in 1 ..10000 loop
  insert into test values(4);
  commit;
end loop;
end;
/
SQL> select id,count(*) from test group by id;
        ID   COUNT(*)
---------- ----------
         4      10000
test中有10000条记录, id值全是4,思考下面AB两个sql语句,相对来说哪个性能更好一些?
A   select decode(id,1,'A',2,'B',3,'C',4,'D') from test;
B   select decode(id,4,'D',2,'B',3,'C',1,'A') from test;
知道的解释下!!!



**********本博客所有内容均为原创,如有转载请注明作者和出处!!!**********
Name:    guoyJoe

QQ:        252803295

Email:    oracledba_cn@hotmail.com

Blog:      http://blog.csdn.net/guoyJoe

ITPUB:   http://www.itpub.net/space-uid-28460966.html

OCM:     http://education.oracle.com/education/otn/YGuo.HTM
 _____________________________________________________________
加群验证问题:哪些SGA结构是必需的,哪些是可选的?否则拒绝申请!!!

答案在:http://blog.csdn.net/guoyjoe/article/details/8624392

Oracle@Paradise  总群:127149411

Oracle@Paradise No.1群:177089463(已满)

Oracle@Paradise No.2群:121341761

Oracle@Paradise No.3群:140856036


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值