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;
知道的解釋下!!!


**********本博客所有內容均爲原創,如有轉載請注明作者和出處!!!**********
QQ: 252803295
Email:dbathink@hotmail.com
尖峰官網:http://www.jianfengedu.com
尖峰淘寶:http://jianfengedu.taobao.com
WEIBO:http://weibo.com/guoyJoe0218
尖峰OCP認證考試群297227448  
尖峰OCM認證考試群99606943
尖峰MySQL研究院群314746420
尖峰JAVA研究院群 315405063  
尖峰Hadoop研究院群366294602
尖峰線上技術分享群252296815
尖峰SQL優化研究院群250057366


更多相關文章
  • 出處:http://www.webp2p.com/downloads/ASimpleIM.htm主站:http://www.webp2p.com/本章中將以一個簡單的VB例子來引導你快速進入PRTX的世界.如果使用其它語言,調用方式是一樣的. 這個簡單的即時通訊,有用戶注冊,用戶登錄和好友列表顯示功 ...
  • hive 0.7版本以後新增了兩個函數,比原來的函數更能提高運行效率.json_tuple  使用方法與介紹 json_tuple(jsonStr, p1, p2, ..., pn) - like get_json_object, but it takes multiple names and re ...
  • 創建兩個線程 Thread threadP1; Thread threadP2; private void button1_Click(object sender, EventArgs e) { threadP1 = new Thread(new ThreadStart(PA)); threadP1 ...
  • 是這樣的.我將DB連接封閉到了一個DBConnection.php中其中一開始我的構造方法是這樣來寫的function __construct() {        require_once("dbsys_config.inc");//DB的配置信息手工修改即可        $ ...
  • 獲得更多資料歡迎進入我的網站或者 csdn或者博客園本節主要介紹print,import和input,t函數,包括他們在python2.7和python3 的區別以及用法.下面附有之前的文章: python入門之字典 python入門之字符串 python入門之列表和元組 python入門之軟件安裝 ...
  • 在介紹open函數時,我們詳細介紹過O_EXCL標志的作用.它和O_CREAT一起作用時,就會先測試需要創建的文件在不在,不在就會創建該文件.如果存在,就出錯返回.但這裏的測試和出錯是一個原子操作.什麽意思呢,就是說測試和創建是一個不可分割的步驟,他們要麽都不執行,要麽就都執行.不會發生測試完後,c ...
  • 在類中,有兩個與衆不同的成員函數,那就是構造函數和析構函數.當構造函數與析構函數遭遇繼承和多態,它們的運行狀況又會出現什麽變化呢?多態性是在父類或各子類中執行最合適成員函數.一般來說,只會選擇父類或子類中的某一個成員函數來執行.這可給析構函數帶來了麻煩!如果有的資源是父類的構造函數申請的,有的資源是 ...
  • 用new和調用一個函數的區別:如果函數返回值是一個值類型(Number.String.Boolen)時,new函數將會返回這個函數的實例對象,而如果這個函數的返回值是一個引用類型(Object.Array.Funtion)時,new函數和直接調用函數的結果相同.測試代碼如下:<script t ...
一周排行
  • 首先需要將mysql的bin目錄設置到環境變量path中.然後登錄CMD 輸入命令連接伺服器上的mysql. 當表中存在中文的時候需要設置mysql的編碼格式,方法是 : set names gbk; 連接:mysq ...
  • IOS專案實戰-登錄解析
    用戶登錄,一般是所有程序都有的基礎功能,在IOS中的登錄頁面用到了哪些控件,怎麽布局才能提 ...
  • 在 Swift 中,有兩種類型的語句:簡單語句和控制流語句.簡單語句是最常見的,用于構造表達式和聲明.控制流語句則用于控制程序執行的流程,Swift 中有三種類型的控制流語句:循環語句.分支語句和控制傳遞語句. 循環 ...
  • linux 用戶賬戶管理
       用戶賬戶管理是我們經常用到的,尤其是對于系統管理員來說,更應該是熟練掌握.   對于 ...
  • 錯誤提示說:你在保存對象過程中,該對象有一個屬性(外鍵)關聯的另外一個未持久化的對象(未保存的對象);即你關聯了一個不存在的記錄;  解決方法1,是先保存"被關聯"的那個對象,才能保存先前的那個對 ...
  •     最近需要用python根據收集到的數據進行繪圖,決定使用rrd數據庫,然後配合rrdtool來繪圖,故學習一下rrdtool的用法. 用法如下: 創建:create(...)create(args..): S ...
  • 從oralce有了installclient後,基本沒有安裝過oracle客戶端,最近要用sqlldr.因爲要在windows平台用, 必須要裝客戶端,如果是linux的話,設置一下,copy過去就能用.安裝出現了E ...
  • 這幾天一直在搞suse下的mplyaer.ffmpeg等源碼編譯安裝,總結出源碼軟件安裝三部曲,網上稱爲經典三部曲. 這三步分別爲: 1. ./configure [options] 2. make 3. make ...
  • str 爲某一字符串NSString *str = RowArr[indexPath.row];                 NSRange allRange = NSMakeRange(0, str.lengt ...
  • 普通的 INSERT INTO 插入:INSERT INTO card(cardno, cardnum) VALUES('1111', '100'); INSERT INTO card(cardno, cardnum ...