10g與11g在處理 >= nvl(:b1,0) and
SQL> create table t as select * from dba_objects;
表已建立。
SQL> create index t_idx on t(object_id);
索引已建立。
SQL> exec dbms_stats.gather_table_stats(user,'T',null,null);
PL/SQL 過程已成功完成。
SQL> var b1 number;
SQL> var b2 number;
SQL> exec :b1:=null;
PL/SQL 過程已成功完成。
SQL> exec :b2:=null;
PL/SQL 過程已成功完成。
先看看在10g下的表現,10.2.0.4以下
SQL_ID 66gnjuyzgnhv3, child number 0
-------------------------------------
select * from t where t.object_id >= nvl(:b1,0) and t.object_id <=
nvl(:b2,9999999999999999)
Plan hash value: 1865580073
---------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 41 (100)| |
| 1 | CONCATENATION | | | | | |
|* 2 | FILTER | | | | | |
|* 3 | TABLE ACCESS FULL | T | 13313 | 1118K| 36 (3)| 00:00:01 |
|* 4 | FILTER | | | | | |
| 5 | TABLE ACCESS BY INDEX ROWID| T | 663 | 57018 | 5 (0)| 00:00:01 |
|* 6 | INDEX RANGE SCAN | T_IDX | 120 | | 2 (0)| 00:00:01 |
---------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter((NVL(:B1,0)<=NVL(:B2,9999999999999999) AND :B2 IS NULL))
3 - filter(("T"."OBJECT_ID"<=9999999999999999 AND
"T"."OBJECT_ID">=NVL(:B1,0)))
4 - filter((NVL(:B1,0)<=NVL(:B2,9999999999999999) AND :B2 IS NOT NULL))
6 - access("T"."OBJECT_ID">=NVL(:B1,0) AND "T"."OBJECT_ID"<=:B2)
加no_expand hint後
SQL_ID apa0a127u80u7, child number 0
-------------------------------------
select /*+ no_expand */ * from t where t.object_id >= nvl(:b1,0) and
t.object_id <= nvl(:b2,9999999999999999)
Plan hash value: 1401356643
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 36 (100)| |
|* 1 | FILTER | | | | | |
|* 2 | TABLE ACCESS FULL| T | 13315 | 1118K| 36 (3)| 00:00:01 |
---------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter(NVL(:B1,0)<=NVL(:B2,9999999999999999))
2 - filter(("T"."OBJECT_ID">=NVL(:B1,0) AND
"T"."OBJECT_ID"<=NVL(:B2,9999999999999999)))
而10.0.2.5及11g則直接是後者。大概又是一個最佳化器改進的例子吧
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/19423/viewspace-1048915/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle中處理空值的函式nvl-nvl2-lnnvl-nullif的用法Oracle函式Null
- BANG:B站影片影像分析與處理引擎
- nvl、nvl2與nullif函式用法區別Null函式
- 用decode和nvl處理null值時需要注意的地方Null
- nvl, nvl2, nullifNull
- 新學一個函式nvl2(a,b,c)函式
- Oracle 10g RAC故障處理Oracle 10g
- 10g資料庫例項使用11g asm錯誤問題處理資料庫ASM
- ORACLE 從10G 單機 並升級到11G RAC時報錯分析處理Oracle
- redhat7 搭建oracle 11g RAC 問題與處理RedhatOracle
- oracle 10g rac 網路故障處理Oracle 10g
- OracleAS 10g 修改IP問題處理Oracle
- sql tuning—分析10與11g在處理rownum及rowid的效能區別—part1SQL
- Oracle-nvl和nvl2函式Oracle函式
- oracle 10g cluster rac vip始終在節點2的問題處理Oracle 10g
- ORACLE 10G rac故障處理一例Oracle 10g
- hdu 1753 Java 高精度處理 大明A+BJava
- [Developer] NVL,NVL2,NULLIF,COALESCE,DECADE,CASEDeveloperNull
- 在oracle中處理日期Oracle
- BBED在Oracle 10g/11g上安裝筆記Oracle 10g筆記
- 在10g/11g中如何檢視SQL Profiles資訊SQL
- oracle 10g 與11g統計資訊區別Oracle 10g
- 處理 Oracle7/8/8i/9i/10g/11g 中的 Oracle 塊損壞Oracle
- 龍芯1B晶片處理器介紹晶片
- 傅立葉在影像處理應用
- 在處理鏈中呼叫APD
- Calendar類在Java中的應用與日期時間處理Java
- [20170516]nvl與非NULL約束.txtNull
- ITL與事務處理
- oracle 10G rac 執行dbca 報錯處理方法Oracle 10g
- 11g包dbms_parallel_execute在海量資料處理過程中的應用Parallel
- ORACLE 11G DATAGUARD 日誌中斷處理方案Oracle
- 11g 邏輯備庫簡單故障處理
- 11g 上RMAN-08137的處理
- ORACLE 11G EM 配置命令及問題處理Oracle
- 11G使用者密碼大小寫處理密碼
- ORACLE 11G OCM備考之建立EM與EM登陸異常的處理Oracle
- 關於create database語句在10g,11g中的不同Database