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
查看本欄目更多精彩內容:http://www.bianceng.cnhttp://www.bianceng.cn/database/Oracle/
馬上查出,幾乎沒花時間,很快哦!
同樣再測一下固定值:比如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;
知道的解釋下!!!