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;
知道的解释下!!!
**********本博客所有内容均为原创,如有转载请注明作者和出处!!!********** QQ: 252803295 Email: [email protected] Blog: http://blog.csdn.net/guoyJoe ITPUB: http://www.itpub.net/space-uid-28460966.html OCM: http://education.oracle.com/education/otn/YGuo.HTM 答案在: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 |