[20170703]11g增加欄位與查詢條件的變化
[20170703]11g增加欄位與查詢條件的變化.txt
--//前幾天給別人介紹12c新特性遇到一些問題,一直沒空測試看看.有空測試看看.
--//辦公環境沒有12c,使用11g應該也能說明問題.
1.環境:
SCOTT@book> @ ver1
PORT_STRING VERSION BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx 11.2.0.4.0 Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
2.建立測試環境:
create table t (a number);
insert into t select rownum from dual connect by rownum <=10;
commit;
alter table t add ( b number default 1 not null);
--//注:11g,12c下這樣也不會修改表對應的資料塊.但是如果在11g這樣執行會修改資料塊alter table t add ( b number default 1 );
--//這樣資料塊中沒有該欄位的記錄資訊,而實際上查詢是有值的,等於1.
--//另外12c下執行alter table t add ( b number );不會修改資料塊,參考連結http://blog.itpub.net/267265/viewspace-1335561/
--//應該算12c的新特性.
--//當時的總結如下:
--//增加欄位帶預設值,在12c下很快完成,不需修改表,但是以後的插入要多付出2個位元組的代價.
--//它透過增加1個隱含欄位裡面的bit來表示這些欄位從那裡來讀取.
--//後續的插入即使insert不帶這些欄位,其預設值也插入資料塊中.
insert into t select rownum+10,0 from dual connect by rownum <=1e5-10;
commit ;
--//分析表,並且在b欄位建立直方圖.
execute sys.dbms_stats.gather_table_stats ( OwnName => user,TabName => 't',Estimate_Percent => NULL,Method_Opt => 'FOR ALL COLUMNS SIZE 1 for columns b size 254 ',Cascade => True ,No_Invalidate => false)
PL/SQL procedure successfully completed.
SCOTT@book> @desc t
Name Null? Type
----- -------- --------
A NUMBER
B NOT NULL NUMBER
3.測試:
select * from t where b=1;
SCOTT@book> @ &r/dpc '' projection
PLAN_TABLE_OUTPUT
-------------------------------------
SQL_ID 2gcu8c0ucsuts, child number 0
-------------------------------------
select * from t where b=1
Plan hash value: 1601196873
---------------------------------------------------------------------------
| Id | Operation | Name | E-Rows |E-Bytes| Cost (%CPU)| E-Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 69 (100)| |
|* 1 | TABLE ACCESS FULL| T | 10 | 70 | 69 (2)| 00:00:01 |
---------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
1 - SEL$1 / T@SEL$1
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter(NVL("B",1)=1)
Column Projection Information (identified by operation id):
-----------------------------------------------------------
1 - "T"."A"[NUMBER,22], NVL("B",1)[22]
--//注意看過濾條件,可以發現過濾條件filter(NVL("B",1)=1).而12c增加的條件更加複雜.參考連結
--//http://blog.itpub.net/267265/viewspace-1335561/.
4.如果我給b增加索引,是否可以利用索引嗎?這個是我當時的疑問.
SCOTT@book> create index i_t_b on t(b);
Index created.
select * from t where b=1;
--//檢查執行計劃:
SCOTT@book> @ &r/dpc '' projection
PLAN_TABLE_OUTPUT
-------------------------------------
SQL_ID 2gcu8c0ucsuts, child number 0
-------------------------------------
select * from t where b=1
Plan hash value: 825900994
--------------------------------------------------------------------------------------
| Id | Operation | Name | E-Rows |E-Bytes| Cost (%CPU)| E-Time |
--------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 2 (100)| |
| 1 | TABLE ACCESS BY INDEX ROWID| T | 10 | 70 | 2 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | I_T_B | 10 | | 1 (0)| 00:00:01 |
--------------------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
1 - SEL$1 / T@SEL$1
2 - SEL$1 / T@SEL$1
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access(NVL("B",1)=1)
Column Projection Information (identified by operation id):
-----------------------------------------------------------
1 - "T"."A"[NUMBER,22], NVL("B",1)[22]
2 - "T".ROWID[ROWID,10], NVL("B",1)[22]
--//看來是我多慮了,oracle會使用索引.注意看Column Projection Information (identified by operation id):內容.
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-2141545/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- [20201224]order by欄位順序與查詢條件為NULL.txtNull
- 查詢/刪除重複的資料(單個欄位和多個欄位條件)
- Spark SQL解析查詢parquet格式Hive表獲取分割槽欄位和查詢條件SparkSQLHive
- 同一欄位多個查詢條件時遇到的一個問題
- 模型欄位與序列化正反向查詢模型
- 41、財務總賬科目餘額表,三欄式總賬,三欄式明細賬 查詢條件科目增加多選查詢
- mysql條件查詢MySql
- MongoDB查詢條件MongoDB
- 增加子查詢表條件篩選提高效能
- [20210208]lob欄位與查詢的問題.txt
- odoo 為可編輯列表檢視欄位搜尋新增查詢過濾條件Odoo
- 《物料清單彙總查詢》二開增加自定義欄位
- Laravel 多條件查詢Laravel
- 寫一個“特殊”的查詢構造器 – (四、條件查詢:複雜條件)
- Django框架:8、聚合查詢、分組查詢、F與Q查詢、ORM查詢最佳化、ORM事務操作、ORM常用欄位型別、ORM常用欄位引數Django框架ORM型別
- SQL Server解惑——查詢條件IN中能否使用變數SQLServer變數
- 在 with 查詢中只查詢個別欄位
- Javaweb-DQL-條件查詢JavaWeb
- 查詢條件封裝物件封裝物件
- AntDesignBlazor示例——列表查詢條件Blazor
- SpringBoot Jpa多條件查詢Spring Boot
- mongodb條件查詢不等於MongoDB
- golang beego orm 查詢條件 or andGolangORM
- 【mybatis-plus】條件查詢MyBatis
- 34. 過濾條件、多表查詢、子查詢
- 20240719資料庫關聯查詢、條件查詢資料庫
- Elasticsearch 複合查詢——多字串多欄位查詢Elasticsearch字串
- SAP 銷售條件表增強欄位
- hyperf關聯模型條件查詢模型
- 菜品條件分頁查詢
- mysql拆分字串做條件查詢MySql字串
- Linq查詢之多個排序條件排序
- Linq兩個from查詢條件
- 查詢oracle欄位預設值Oracle
- ArcGIS對欄位分割查詢操作
- Elasticsearch 單字串多欄位查詢Elasticsearch字串
- CYmysql根據json欄位內容作為查詢條件(包括json陣列)檢索資料dvnMySqlJSON陣列
- mysql like查詢 - 根據多個條件的模糊匹配查詢MySql
- MySQL:查詢欄位數量多少對查詢效率的影響MySql