oracle實驗記錄 (分割槽表,掃描基數的計算)
關於分割槽 card
今天pub上搜尋分割槽 ,無意中發現一個帖子
http://www.itpub.net/thread-1006757-1-1.html 08年的
問
有2種查詢方式
select * from t partition(p1);
select * from t where t.parttition_cd=1
以上查詢都在一個分割槽中,cost一樣但card不一樣 是為什麼
原因是card的計算問題
特此實驗並記錄
create table t1 太長不貼全了 (表是根據 基於成本優化書中的一個指令碼,表比較大方便分析分割槽)
partition p0200 values less than ( 200),
partition p0400 values less than ( 400),
partition p0600 values less than ( 600),
partition p0800 values less than ( 800), 重點分割槽資訊
partition p1000 values less than (1000)
)
SQL> execute dbms_stats.gather_table_stats('SYS','T1');~收集下資訊
PL/SQL procedure successfully completed.
檢視一些T1的基本資訊
SQL> select table_name,num_rows from user_tables where table_name='T1';
TABLE_NAME NUM_ROWS
------------------------------ ----------
T1 1003670
SQL> select column_name ,num_distinct,density ,num_nulls from user_tab_col_sta
stics where table_name='T1';
COLUMN_NAME NUM_DISTINCT DENSITY NUM_NULLS
------------------------------ ------------ ---------- ----------
PART_COL 911 .001097695 0
ID 1003670 9.9634E-07 0
SMALL_VC 1003670 9.9634E-07 0
PADDING 1 1 0
SQL> selEct partition_name,num_rows from user_tab_partitions where table_name='T
1';
PARTITION_NAME NUM_ROWS
------------------------------ ----------
P0200 40000*******************
P0400 119071
P0600 200286
P0800 279693
P1000 360246
SQL> select PARTITION_NAME,COLUMN_NAME,NUM_DISTINCT,DENSITY,NUM_NULLS from USER
_PART_COL_STATISTICS where table_name='T1';
PARTIT COLUMN_N NUM_DISTINCT DENSITY NUM_NULLS
------ -------- ------------ ---------- ----------
P0200 PART_COL 200 .005 0***********************
P0200 ID 40000 .000025 0
P0200 SMALL_VC 40000 .000025 0
P0200 PADDING 1 1 0
P0400 PART_COL 201 .004975124 0
P0400 ID 119071 8.3984E-06 0
P0400 SMALL_VC 119071 8.3984E-06 0
P0400 PADDING 1 1 0
P0600 PART_COL 201 .004975124 0
P0600 ID 200286 4.9929E-06 0
P0600 SMALL_VC 200286 4.9929E-06 0
PARTIT COLUMN_N NUM_DISTINCT DENSITY NUM_NULLS
------ -------- ------------ ---------- ----------
P0600 PADDING 1 1 0
P0800 PART_COL 200 .005 0
P0800 ID 279693 3.5753E-06 0
P0800 SMALL_VC 279693 3.5753E-06 0
P0800 PADDING 1 1 0
P1000 PART_COL 200 .005 0
P1000 ID 360246 2.7759E-06 0
P1000 SMALL_VC 360246 2.7759E-06 0
P1000 PADDING 1 1 0
20 rows selected.
SQL> explain plan for select * from t1 partition(P0200);
Explained.
SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 2602558080
-------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost | Pstart| Pstop |
-------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 40000 | 2734K| 42 | | |
| 1 | PARTITION RANGE SINGLE| | 40000 | 2734K| 42 | 1 | 1 |
| 2 | TABLE ACCESS FULL | T1 | 40000 | 2734K| 42 | 1 | 1 |
-------------------------------------------------------------------------------
Note
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
-----
- cpu costing is off (consider enabling it)
13 rows selected.
沒有過濾謂詞 Pstart,Pstop 都為1,在一個分割槽中 rows=p0200分割槽的num_rows=40000
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SQL> explain plan for select * from t1 where part_col=2;
Explained.
SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 2602558080
-------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost | Pstart| Pstop |
-------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 200 | 14000 | 42 | | |
| 1 | PARTITION RANGE SINGLE| | 200 | 14000 | 42 | 1 | 1 |
|* 2 | TABLE ACCESS FULL | T1 | 200 | 14000 | 42 | 1 | 1 |
-------------------------------------------------------------------------------
Predicate Information (identified by operation id):
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
---------------------------------------------------
2 - filter("PART_COL"=2)
過濾謂詞 "PART_COL"=2 rows=該分割槽的num_rows*1/該分割槽的num_distinct(是該分割槽的)=40000*1/200
=200
實際情況 複雜的多得多,跨越分割槽的card計算 會在以後有空的時候 實驗記錄下
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12020513/viewspace-608596/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle分割槽表基礎運維-04列表分割槽Oracle運維
- oracle分割槽表和分割槽表exchangeOracle
- Oracle分割槽表基礎運維-07增加分割槽(3列表分割槽)Oracle運維
- Oracle分割槽表基礎運維-06分割槽表索引Oracle運維索引
- Oracle分割槽表基礎運維-09刪除分割槽Oracle運維
- Oracle分割槽表基礎運維-05組合分割槽Oracle運維
- Oracle分割槽表基礎運維-02範圍分割槽Oracle運維
- Oracle分割槽表基礎運維-03HASH分割槽Oracle運維
- [oracle] expdp 匯出分割槽表的分割槽Oracle
- oracle分割槽表和非分割槽表exchangeOracle
- Oracle分割槽表基礎運維-07增加分割槽(2 HASH分割槽)Oracle運維
- Oracle分割槽表基礎運維-01分割槽表分類Oracle運維
- Oracle分割槽表基礎運維-07增加分割槽(1範圍分割槽)Oracle運維
- oracle 分割槽表move和包含分割槽表的lob moveOracle
- ORACLE分割槽表梳理系列Oracle
- Oracle分割槽表基礎運維-07增加分割槽(4 RANGE_HASH)Oracle運維
- Oracle分割槽表基礎運維-07增加分割槽(5RANGE_LIST)Oracle運維
- Oracle分割槽表基礎運維-07增加分割槽(6RANGE_RANGE)Oracle運維
- 對oracle分割槽表的理解整理Oracle
- oracle將表配置為分割槽表Oracle
- oracle 普通表-分割槽表改造流程Oracle
- PostgreSQL分割槽表、繼承表記錄去重方法SQL繼承
- postgresql 9.6 分割槽表測試方案與記錄SQL
- Oracle分割槽表基礎運維-08Coalescing PartitionsOracle運維
- oracle是如何進行全表掃描的Oracle
- 分割槽表-實戰
- Greenplum計算能力估算-暨多大表需要分割槽,單個分割槽多大適宜
- Oracle SQL調優之分割槽表OracleSQL
- oracle 線上重新定義,普通表改變分割槽表,分割槽表可以更改型別、分割槽欄位等Oracle型別
- Oracle 12.2之後ALTER TABLE .. MODIFY轉換非分割槽表為分割槽表Oracle
- HGDB的分割槽表實現SQL Server的分割槽檢視SQLServer
- oracle分割槽表的分類及測試Oracle
- 記一次Oracle分割槽表全域性索引重建的過程Oracle索引
- Mysql表分割槽實現MySql
- Mysql表分割槽實操MySql
- 【Oracle】 索引的掃描方式Oracle索引
- PG的非分割槽表線上轉分割槽表
- ORACLE刪除-表分割槽和資料Oracle
- Oracle12c:建立主分割槽、子分割槽,實現自動分割槽插入效果Oracle