oracle decode性能,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,思考下面A、B两个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

OCM:    http://education.oracle.com/education/otn/YGuo.HTM

_____________________________________________________________

加群验证问题:哪些SGA结构是必需的,哪些是可选的?否则拒绝申请!!!

Oracle@Paradise  总群:127149411

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

Oracle@Paradise No.2群:121341761

Oracle@Paradise No.3群:140856036

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值