index有時候可能會比表大!
之前沒有想過這個問題,第一次看到這樣的說法是在piner的面試題中。當時覺得有點意思,這幾天細讀doc,上面也提到了這樣的說法:
Consider an index on a table on which a lot of DML has been performed. Because of the DML, the size of the index can increase to the point where each block is only 50% full, or even less. If the index refers to most of the columns in the table, then the index could actually be larger than the table.
[@more@]doc:
Re-creating Indexes
You might want to re-create an index to compact it and minimize fragmented space, or to change the index's storage characteristics. When creating a new index that is a subset of an existing index or when rebuilding an existing index with new storage characteristics, Oracle might use the existing index instead of the base table to improve the performance of the index build.
Note: To avoid calling |
However, there are cases where it can be beneficial to use the base table instead of the existing index. Consider an index on a table on which a lot of DML has been performed. Because of the DML, the size of the index can increase to the point where each block is only 50% full, or even less. If the index refers to most of the columns in the table, then the index could actually be larger than the table. In this case, it is faster to use the base table rather than the index to re-create the index.
Use the ALTER
INDEX
... REBUILD
statement to reorganize or compact an existing index or to change its storage characteristics. The REBUILD
statement uses the existing index as the basis for the new one. All index storage statements are supported, such as STORAGE
(for extent allocation), TABLESPACE
(to move the index to a new tablespace), and INITRANS
(to change the initial number of entries).
Usually, ALTER
INDEX
... REBUILD
is faster than dropping and re-creating an index, because this statement uses the fast full scan feature. It reads all the index blocks using multiblock I/O, then discards the branch blocks. A further advantage of this approach is that the old index is still available for queries while the rebuild is in progress
--===================================
SQL> create table t(id ,name) as select object_id , object_name from dba_objects
;
表已建立。
SQL> desc t
名稱 是否為空? 型別
----------------------------------------- -------- ----------------------------
ID NUMBER
NAME VARCHAR2(128)
SQL> create index idx_t on t(id , name);
索引已建立。
SQL> analyze table t compute statistics;
表已分析。
SQL> select blocks from user_tables where table_name='T';
BLOCKS
----------
70
SQL> select leaf_blocks from user_indexes where index_name='IDX_T';
LEAF_BLOCKS
-----------
77
已經看出了index比表大,為什麼這樣?這裡主要是t只有id和name,而index也包含了id和name,但是別忘了index還包含了rowid!
SQL> delete from t where id<=5000;
已刪除4928行。
SQL> commit;
提交完成。
SQL> alter table t move ;
表已更改。
SQL> analyze table t compute statistics;
analyze table t compute statistics
*
第 1 行出現錯誤:
ORA-01502: 索引 'XYS.IDX_T' 或這類索引的分割槽處於不可用狀態
SQL> alter index idx_t rebuild;
索引已更改。
SQL> analyze table t compute statistics for all indexes;
表已分析。
SQL> select blocks from user_tables where table_name='T';
BLOCKS
----------
70
SQL> select leaf_blocks from user_indexes where index_name='IDX_T';
LEAF_BLOCKS
-----------
55
SQL> insert into t select object_id , object_name from dba_objects;
已建立15810行。
SQL> commit;
提交完成。
SQL> analyze table t compute statistics for all indexes;
表已分析。
SQL> select blocks from user_tables where table_name='T';
BLOCKS
----------
70
SQL> select leaf_blocks from user_indexes where index_name='IDX_T';
LEAF_BLOCKS
-----------
148
SQL>
透過執行dml操作,這次效果更加明顯,index顯然比表t大!
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/19602/viewspace-1002902/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- index為什麼可能會比table大很多Index
- (大表小技巧)有時候 2 小時的 SQL 操作,可能只要 1 分鐘SQL
- Drop table時候會徹底刪除index, Truncate 時候會清除index 但是index資料還是保留在HIndex
- MySQL什麼時候會使用內部臨時表?MySql
- 什麼時候使用z-index?Index
- 建立index時候要用到排序空間Index排序
- 什麼時候會用到透明加密表空間呢?加密
- 技術有時候看純英文的會好點
- Laravel 日誌有時候有許可權有時候沒有許可權?Laravel
- 當你學會炒菜的時候,你就學會了大資料大資料
- insert的時候使用append會不會影響到表的大小APP
- Scrum不是一顆銀彈,有時可能會浪費大量時間 - RemoHJansenScrumREM
- 設定placeholder時候 focus時候文字沒有隱藏
- select 表的時候如果別的會話TRUNCATE DROP PURGE表後會是什麼結果會話
- input設定寬高時候會出現top有內邊距:
- selenium 在 docker 上 截圖有時候正常,有時候圖片全黑-黑屏Docker
- 【折騰】發表文章的時候yaml檔案頭不會被解析YAML
- 為什麼有時候spring mvc的interceptor會執行兩次SpringMVC
- FICO財務顧問配置時候,可能常用T-code
- 什麼時候 AngularJS 會超越 jQueryAngularJSjQuery
- sendto傳送UDP包的時候,如果發不出去,可能是沒有bind的原因UDP
- 大表裡有資料時表分割槽參考指令碼指令碼
- OneThink什麼時候會有基於thinkphp5開發的啊?PHP
- 對於沒有任何統計資訊的表,ORACLE可能會動態取樣。Oracle
- 測試開發的技術是否在混沌探索時期,這時候抓住機會就可能一飛沖天
- 身邊同事技術比你差,你會有看不起同事的時候嗎?
- 我在設計資料庫的時候會考慮到哪些資料欄位將來可能會發生變更。資料庫
- 什麼時候會傳送options請求
- mysql什麼時候會發生file sortMySql
- 蘋果新款MacBook Pro可能會有SD卡插槽蘋果MacSD卡
- SAP CRM中介軟體下載時,為什麼有時候會生成一個奇怪的BDOC容器
- 用例,有時候也叫做需求場景
- 魅族E釋出會什麼時候召開 魅族新品釋出會有什麼亮點
- 雲遊戲平臺取代次時代主機?可能還沒到時候遊戲
- online 建立index的時候,oracle會等待insert , update的行(假設不超過table的30% ) cIndexOracle
- shiro 什麼時候會進入 doGetAuthorizationInfo() ?
- Oracle 什麼時候select會產生redo?Oracle
- mysql建立表的時候對欄位和表新增COMMENTMySql