Oracle表與索引的分析及索引重建(轉)
.分析表與索引(analyze 不會重建索引)
analyze table tablename compute statistics
等同於 analyze table tablename compute statistics for table for all indexes for all columns
for table 的統計資訊存在於檢視:user_tables 、all_tables、dba_tables
for all indexes 的統計資訊存在於檢視: user_indexes 、all_indexes、dba_indexes
for all columns 的統計資訊存在於檢視:user_tab_columns、all_tab_columns、dba_tab_columns
注:分析表與索引見 AnalyzeAllTable儲存過程
2、一般來講可以採用以下三種方式來手工分析索引。
analyze index idx_t validate structure:
analyze index idx_t compute statistics:
analyze index idx_t estimate statistics sample 10 percent
1)analyze index idx_t validate structure:
這段分析語句是用來分析索引的block中是否有壞塊兒,那麼根據分析我們可以得到索引的結構資料,這些資料會保留到
index_stats中,來判斷這個索引是否需要rebuild. 需要注意的是這樣的分析是不會收集索引的統計資訊的。
2)validate structure有二種模式: online, offline, 一般來講預設的方式是offline。
當以offline的模式analyze索引時,會對table加一個表級共享鎖,對目前table的一些實時DMl操作會產生一定的影響。
而以online模式分析時候,則不會加任何lock,但在index_stats中是看不到任何資訊的。
3)analyze index idx_t compute statistics:
用來統計索引的統計資訊(全分析),主要為CBO服務。
4)analyze index idx_t estimate statistics sample 10 percent
主要是用來指定比例進行抽樣分析,也是為CBO服務. 例中是抽樣10%
3.重建索引
alter index index_name rebuild tablespace tablespace_name
alter index index_name rebuild tablespace tablespace_name 加入表空間名,會將指定的索引移動到指定的表空間當中。
注:
analyze 操作只是統計資訊,並將統計資訊存放起來供日後分析SQL使用,不進行重建之類的具體實施性操作,因此要重建索引的話
還是要用 alter index index_name rebuild
4、其他的統計方法
1)DBMS_STATS:這個當然是最強大的分析包了
--建立統計資訊歷史保留表
exec dbms_stats.create_stat_table(ownname => 'scott',stattab => 'stat_table');
--匯出整個scheme的統計資訊
exec dbms_stats.export_schema_stats(ownname => 'scott',stattab => 'stat_table');
--分析scheme
Exec dbms_stats.gather_schema_stats(ownname => 'test',options => 'GATHER AUTO',
estimate_percent => dbms_stats.auto_sample_size,
method_opt => 'for all indexed columns',
degree => 6 );
--分析表
exec dbms_stats.gather_table_stats(ownname => 'TEST',tabname => 'sm_user',estimate_percent => 10,method_opt=> 'for all indexed columns') ;
--分析索引
exec dbms_stats.gather_index_stats(ownname => 'TEST',indname => 'pk_user_index',estimate_percent => '10',degree => '4') ;
--如果發現執行計劃走錯,刪除表的統計資訊
exec dbms_stats.delete_table_stats(ownname => 'TEST',tabname => 'SM_USER') ;
--匯入錶的歷史統計資訊
exec dbms_stats.import_table_stats(ownname => 'TEST',tabname => 'SM_USER',stattab => 'stat_table') ;
--如果進行分析後,大部分表的執行計劃都走錯,需要導回整個scheme的統計資訊
exec dbms_stats.import_schema_stats(ownname => 'TEST',stattab => 'SM_USER');
--匯入索引的統計資訊
exec dbms_stats.import_index_stats(ownname => 'TEST',indname => 'PK_USER_INDEX',stattab => 'stat_table')
analyze和dbms_stats不同的地方:
analyze是同時更新表和索引的統計資訊,而dbms_stats會先更新表的統計資訊,然後再更新索引的統計資訊,
這裡就有一個問題,就是當表的統計資訊更新後,而索引的統計資訊沒有被更新,這時候cbo就有可能選擇錯誤的plan
2)DBMS_UTILITY.ANALYZE_SCHEMA:可直接分析SCHEMA中所有物件
如:EXEC DBMS_UTILITY.ANALYZE_SCHEMA ('LTTFM','COMPUTE');
3)DBMS_DDL.ANALYZE_OBJECT:收集物件的的統計資訊
analyze table tablename compute statistics
等同於 analyze table tablename compute statistics for table for all indexes for all columns
for table 的統計資訊存在於檢視:user_tables 、all_tables、dba_tables
for all indexes 的統計資訊存在於檢視: user_indexes 、all_indexes、dba_indexes
for all columns 的統計資訊存在於檢視:user_tab_columns、all_tab_columns、dba_tab_columns
注:分析表與索引見 AnalyzeAllTable儲存過程
2、一般來講可以採用以下三種方式來手工分析索引。
analyze index idx_t validate structure:
analyze index idx_t compute statistics:
analyze index idx_t estimate statistics sample 10 percent
1)analyze index idx_t validate structure:
這段分析語句是用來分析索引的block中是否有壞塊兒,那麼根據分析我們可以得到索引的結構資料,這些資料會保留到
index_stats中,來判斷這個索引是否需要rebuild. 需要注意的是這樣的分析是不會收集索引的統計資訊的。
2)validate structure有二種模式: online, offline, 一般來講預設的方式是offline。
當以offline的模式analyze索引時,會對table加一個表級共享鎖,對目前table的一些實時DMl操作會產生一定的影響。
而以online模式分析時候,則不會加任何lock,但在index_stats中是看不到任何資訊的。
3)analyze index idx_t compute statistics:
用來統計索引的統計資訊(全分析),主要為CBO服務。
4)analyze index idx_t estimate statistics sample 10 percent
主要是用來指定比例進行抽樣分析,也是為CBO服務. 例中是抽樣10%
3.重建索引
alter index index_name rebuild tablespace tablespace_name
alter index index_name rebuild tablespace tablespace_name 加入表空間名,會將指定的索引移動到指定的表空間當中。
注:
analyze 操作只是統計資訊,並將統計資訊存放起來供日後分析SQL使用,不進行重建之類的具體實施性操作,因此要重建索引的話
還是要用 alter index index_name rebuild
4、其他的統計方法
1)DBMS_STATS:這個當然是最強大的分析包了
--建立統計資訊歷史保留表
exec dbms_stats.create_stat_table(ownname => 'scott',stattab => 'stat_table');
--匯出整個scheme的統計資訊
exec dbms_stats.export_schema_stats(ownname => 'scott',stattab => 'stat_table');
--分析scheme
Exec dbms_stats.gather_schema_stats(ownname => 'test',options => 'GATHER AUTO',
estimate_percent => dbms_stats.auto_sample_size,
method_opt => 'for all indexed columns',
degree => 6 );
--分析表
exec dbms_stats.gather_table_stats(ownname => 'TEST',tabname => 'sm_user',estimate_percent => 10,method_opt=> 'for all indexed columns') ;
--分析索引
exec dbms_stats.gather_index_stats(ownname => 'TEST',indname => 'pk_user_index',estimate_percent => '10',degree => '4') ;
--如果發現執行計劃走錯,刪除表的統計資訊
exec dbms_stats.delete_table_stats(ownname => 'TEST',tabname => 'SM_USER') ;
--匯入錶的歷史統計資訊
exec dbms_stats.import_table_stats(ownname => 'TEST',tabname => 'SM_USER',stattab => 'stat_table') ;
--如果進行分析後,大部分表的執行計劃都走錯,需要導回整個scheme的統計資訊
exec dbms_stats.import_schema_stats(ownname => 'TEST',stattab => 'SM_USER');
--匯入索引的統計資訊
exec dbms_stats.import_index_stats(ownname => 'TEST',indname => 'PK_USER_INDEX',stattab => 'stat_table')
analyze和dbms_stats不同的地方:
analyze是同時更新表和索引的統計資訊,而dbms_stats會先更新表的統計資訊,然後再更新索引的統計資訊,
這裡就有一個問題,就是當表的統計資訊更新後,而索引的統計資訊沒有被更新,這時候cbo就有可能選擇錯誤的plan
2)DBMS_UTILITY.ANALYZE_SCHEMA:可直接分析SCHEMA中所有物件
如:EXEC DBMS_UTILITY.ANALYZE_SCHEMA ('LTTFM','COMPUTE');
3)DBMS_DDL.ANALYZE_OBJECT:收集物件的的統計資訊
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23757700/viewspace-730832/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle表與索引的分析及索引重建Oracle索引
- oracle 索引分析及索引重建Oracle索引
- Oracle表table與索引index的分析及索引重建及統計資訊匯入匯出Oracle索引Index
- oracle 定期表及索引分析Oracle索引
- 關於oracle的索引重建問題及原因分析Oracle索引
- oracle重建索引Oracle索引
- Oracle 表的移動和索引的重建Oracle索引
- oracle重建索引(一)Oracle索引
- oracle重建索引(三)Oracle索引
- oracle重建索引(二)Oracle索引
- oracle 表分析和索引Oracle索引
- oracle批量重建索引方法Oracle索引
- 【TUNE_ORACLE】索引定期重建的利與弊Oracle索引
- Oralce中分析表及索引索引
- oracle 索引重建提示指令碼Oracle索引指令碼
- ORACLE分析表和索引的指令碼Oracle索引指令碼
- 索引的重建命令索引
- 淺談oracle中重建索引 (ZT)Oracle索引
- 淺談索引系列之索引重建索引
- 【索引】分割槽表索引重建過程的10704事件跟蹤索引事件
- Oracle資料庫索引使用及索引失效總結 轉Oracle資料庫索引
- Oracle分割槽表及分割槽索引Oracle索引
- sqlserver 全部索引重建SQLServer索引
- MSSQL Rebuild(重建)索引SQLRebuild索引
- Oracle堆組織表的索引和索引組織表Oracle索引
- oracle 索引使用及索引失效總結Oracle索引
- 關於 Oracle 分割槽索引的失效和重建Oracle索引
- 記一次Oracle分割槽表全域性索引重建的過程Oracle索引
- oracle 索引什麼時候重建和重建方法討論Oracle索引
- [轉]:bitmap索引和B*tree索引分析索引
- Analyze分析表或者索引索引
- 各版本資料庫重建索引後是否自動分析表和索引9i+10g+11g資料庫索引
- (轉)Oracle索引原理Oracle索引
- oracle 索引組織表Oracle索引
- oracle 針對普通表的索引分割槽及10g新增hash 索引分割槽Oracle索引
- 索引重建的資料來源索引
- Oracle 找出需要建立索引的表Oracle索引
- 分割槽表全域性索引與本地索引的選擇索引