DELETE_TABLE_STATS Procedure
DELETE_TABLE_STATS Procedure
由於Oracle的最佳化器是CBO,所以物件的統計資料對執行計劃的生成至關重要!
作用:DBMS_STATS.GATHER_TABLE_STATS統計表,列,索引的統計資訊(預設引數下是對錶進行直方圖資訊收集,包含該表的自身-表的行數、資料塊數、行長等資訊;列的分析--列值的重複數、列上的空值、資料在列上的分佈情況;索引的分析-索引頁塊的數量、索引的深度、索引聚合因子).
Syntax(語法):
DBMS_STATS.DELETE_TABLE_STATS (
ownname VARCHAR2,
tabname VARCHAR2,
partname VARCHAR2 DEFAULT NULL,
stattab VARCHAR2 DEFAULT NULL,
statid VARCHAR2 DEFAULT NULL,
cascade_parts BOOLEAN DEFAULT TRUE,
cascade_columns BOOLEAN DEFAULT TRUE,
cascade_indexes BOOLEAN DEFAULT TRUE,
statown VARCHAR2 DEFAULT NULL,
no_invalidate BOOLEAN DEFAULT to_no_invalidate_type (
get_param('NO_INVALIDATE')),
force BOOLEAN DEFAULT FALSE);
引數說明:
ownname:要分析表的擁有者
tabname:要分析的表名.
partname:分割槽的名字,只對分割槽表或分割槽索引有用.
estimate_percent:取樣行的百分比,取值範圍[0.000001,100],null為全部分析,不取樣. 常量:DBMS_STATS.AUTO_SAMPLE_SIZE是預設值,由oracle決定最佳取取樣值.
block_sapmple:是否用塊取樣代替行取樣.
method_opt:決定histograms資訊是怎樣被統計的.method_opt的取值如下(預設值為FOR ALL COLUMNS SIZE AUTO):
for all columns:統計所有列的histograms.
for all indexed columns:統計所有indexed列的histograms.
for all hidden columns:統計你看不到列的histograms
for columns SIZE | REPEAT | AUTO | SKEWONLY:統計指定列的histograms.N的取值範圍[1,254]; REPEAT上次統計過的histograms;AUTO由oracle決定N的大小;SKEWONLY multiple end-points
with the same value which is what we define by "there is skew in thedata
degree:決定並行度.預設值為null.
granularity:Granularity of statistics to collect ,only pertinent if the table is partitioned.
cascade:是收集索引的資訊.預設為FALSE.
stattab:指定要儲存統計資訊的表,statid如果多個表的統計資訊儲存在同一個stattab中用於進行區分.statown儲存統計資訊表的擁有者.以上三個引數若不指定,統計資訊會直接更新到資料字典.
no_invalidate: Does not invalidate the dependent cursors if set to TRUE. The procedure invalidates the dependent cursors immediately if set to FALSE.
force:即使表鎖住了也收集統計資訊.
例子:
execute dbms_stats.gather_table_stats(ownname => 'owner',tabname => 'table_name' ,estimate_percent => null ,method_opt => 'for all indexed columns' ,cascade => true)
----------------------------------------------------------------------------------------------------------------------
自從Oracle8.1.5引入dbms_stats包,Experts們便推薦使用dbms_stats取代analyze。 理由如下
1.dbms_stats可以並行分析
2.dbms_stats有自動分析的功能(alter table monitor )
3.analyze 分析統計資訊的不準確some times
1,2好理解,且第2點實際上在VLDB中是最吸引人的;3以前比較模糊,看了metalink236935.1 解釋,analyze在分析Partition表的時候,有時候會計算出不準確的Global statistics .
原因是,dbms_stats會實在的去分析表全域性統計資訊(當指定引數);而analyze是將表分割槽(區域性)的statistics 彙總計算成表全域性statistics ,可能導致誤差。
如果想分析整個使用者或資料庫,還可以採用工具包,可以並行分析
Dbms_utility(8i以前的工具包)
Dbms_stats(8i以後提供的工具包)
如:
dbms_stats.gather_schema_stats(User,estimate_percent=>100,cascade=> TRUE);
dbms_stats.gather_table_stats(User,TableName,degree => 4,cascade => true);
如何使用dbms_stats分析統計資訊? --建立統計資訊歷史保留表
sql> exec dbms_stats.create_stat_table(ownname => 'scott',stattab => 'stat_table') ;
--匯出整個scheme的統計資訊
sql> exec dbms_stats.export_schema_stats(ownname => 'scott',stattab => 'stat_table') ;
--分析scheme
Exec dbms_stats.gather_schema_stats(
ownname => 'scott',
options => 'GATHER AUTO',
estimate_percent => dbms_stats.auto_sample_size,
method_opt => 'for all indexed columns ',
degree => 6 )
--分析表
sql> exec dbms_stats.gather_table_stats(ownname => 'scott',tabname => 'work_list',estimate_percent => 10,method_opt=> 'for all indexed columns') ;
--分析索引
SQL> exec dbms_stats.gather_index_stats(ownname => 'crm2',indname => 'IDX_ADM_PERMISSION_PID_MID',estimate_percent => '10',degree => '4') ;
--如果發現執行計劃走錯,刪除表的統計資訊
SQL>dbms_stats.delete_table_stats(ownname => 'scott',tabname => 'work_list') ;
--匯入錶的歷史統計資訊
sql> exec dbms_stats.import_table_stats(ownname => 'scott',tabname => 'work_list',stattab => 'stat_table') ;
--如果進行分析後,大部分表的執行計劃都走錯,需要導回整個scheme的統計資訊
sql> exec dbms_stats.import_schema_stats(ownname => 'scott',stattab => 'stat_table');
--匯入索引的統計資訊
SQL> exec dbms_stats.import_index_stats(ownname => 'crm2',indname => 'IDX_ADM_PERMISSION_PID_MID',stattab => 'stat_table')
--檢查是否匯入成功
SQL> select table_name,num_rows,a.blocks,a.last_analyzed from all_tables a where a.table_name='WORK_LIST';
分析資料庫(包括所有的使用者物件和系統物件):gather_database_stats
分析使用者所有的物件(包括表、索引、簇):gather_schema_stats
分析表:gather_table_stats
分析索引:gather_index_stats
刪除資料庫統計資訊:delete_database_stats
刪除使用者方案統計資訊:delete_schema_stats
刪除表統計資訊:delete_table_stats
刪除索引統計資訊:delete_index_stats
刪除列統計資訊:delete_column_stats
設定表統計資訊:set_table_stats
設定索引統計資訊:set_index_stats
設定列統計資訊:set_column_stats
可以檢視錶 DBA_TABLES來檢視錶是否與被分析過,如:
SELECT TABLE_NAME, LAST_ANALYZED FROM DBA_TABLES
這是對命令與工具包的一些總結
1、對於分割槽表,建議使用DBMS_STATS,而不是使用Analyze語句。
a) 可以並行進行,對多個使用者,多個Table
b) 可以得到整個分割槽表的資料和單個分割槽的資料。
c) 可以在不同級別上Compute Statistics:單個分割槽,子分割槽,全表,所有分割槽
d) 可以倒出統計資訊
e) 可以使用者自動收集統計資訊
2、DBMS_STATS的缺點
a) 不能Validate Structure
b) 不能收集CHAINED ROWS, 不能收集CLUSTER TABLE的資訊,這兩個仍舊需要使用Analyze語句。
c) DBMS_STATS 預設不對索引進行Analyze,因為預設Cascade是False,需要手工指定為True
3、對於oracle 9裡面的External Table,Analyze不能使用,只能使用DBMS_STATS來收集資訊。
由於Oracle的最佳化器是CBO,所以物件的統計資料對執行計劃的生成至關重要!
作用:DBMS_STATS.GATHER_TABLE_STATS統計表,列,索引的統計資訊(預設引數下是對錶進行直方圖資訊收集,包含該表的自身-表的行數、資料塊數、行長等資訊;列的分析--列值的重複數、列上的空值、資料在列上的分佈情況;索引的分析-索引頁塊的數量、索引的深度、索引聚合因子).
Syntax(語法):
DBMS_STATS.DELETE_TABLE_STATS (
ownname VARCHAR2,
tabname VARCHAR2,
partname VARCHAR2 DEFAULT NULL,
stattab VARCHAR2 DEFAULT NULL,
statid VARCHAR2 DEFAULT NULL,
cascade_parts BOOLEAN DEFAULT TRUE,
cascade_columns BOOLEAN DEFAULT TRUE,
cascade_indexes BOOLEAN DEFAULT TRUE,
statown VARCHAR2 DEFAULT NULL,
no_invalidate BOOLEAN DEFAULT to_no_invalidate_type (
get_param('NO_INVALIDATE')),
force BOOLEAN DEFAULT FALSE);
引數說明:
ownname:要分析表的擁有者
tabname:要分析的表名.
partname:分割槽的名字,只對分割槽表或分割槽索引有用.
estimate_percent:取樣行的百分比,取值範圍[0.000001,100],null為全部分析,不取樣. 常量:DBMS_STATS.AUTO_SAMPLE_SIZE是預設值,由oracle決定最佳取取樣值.
block_sapmple:是否用塊取樣代替行取樣.
method_opt:決定histograms資訊是怎樣被統計的.method_opt的取值如下(預設值為FOR ALL COLUMNS SIZE AUTO):
for all columns:統計所有列的histograms.
for all indexed columns:統計所有indexed列的histograms.
for all hidden columns:統計你看不到列的histograms
for columns SIZE | REPEAT | AUTO | SKEWONLY:統計指定列的histograms.N的取值範圍[1,254]; REPEAT上次統計過的histograms;AUTO由oracle決定N的大小;SKEWONLY multiple end-points
with the same value which is what we define by "there is skew in thedata
degree:決定並行度.預設值為null.
granularity:Granularity of statistics to collect ,only pertinent if the table is partitioned.
cascade:是收集索引的資訊.預設為FALSE.
stattab:指定要儲存統計資訊的表,statid如果多個表的統計資訊儲存在同一個stattab中用於進行區分.statown儲存統計資訊表的擁有者.以上三個引數若不指定,統計資訊會直接更新到資料字典.
no_invalidate: Does not invalidate the dependent cursors if set to TRUE. The procedure invalidates the dependent cursors immediately if set to FALSE.
force:即使表鎖住了也收集統計資訊.
例子:
execute dbms_stats.gather_table_stats(ownname => 'owner',tabname => 'table_name' ,estimate_percent => null ,method_opt => 'for all indexed columns' ,cascade => true)
----------------------------------------------------------------------------------------------------------------------
自從Oracle8.1.5引入dbms_stats包,Experts們便推薦使用dbms_stats取代analyze。 理由如下
1.dbms_stats可以並行分析
2.dbms_stats有自動分析的功能(alter table monitor )
3.analyze 分析統計資訊的不準確some times
1,2好理解,且第2點實際上在VLDB中是最吸引人的;3以前比較模糊,看了metalink236935.1 解釋,analyze在分析Partition表的時候,有時候會計算出不準確的Global statistics .
原因是,dbms_stats會實在的去分析表全域性統計資訊(當指定引數);而analyze是將表分割槽(區域性)的statistics 彙總計算成表全域性statistics ,可能導致誤差。
如果想分析整個使用者或資料庫,還可以採用工具包,可以並行分析
Dbms_utility(8i以前的工具包)
Dbms_stats(8i以後提供的工具包)
如:
dbms_stats.gather_schema_stats(User,estimate_percent=>100,cascade=> TRUE);
dbms_stats.gather_table_stats(User,TableName,degree => 4,cascade => true);
如何使用dbms_stats分析統計資訊? --建立統計資訊歷史保留表
sql> exec dbms_stats.create_stat_table(ownname => 'scott',stattab => 'stat_table') ;
--匯出整個scheme的統計資訊
sql> exec dbms_stats.export_schema_stats(ownname => 'scott',stattab => 'stat_table') ;
--分析scheme
Exec dbms_stats.gather_schema_stats(
ownname => 'scott',
options => 'GATHER AUTO',
estimate_percent => dbms_stats.auto_sample_size,
method_opt => 'for all indexed columns ',
degree => 6 )
--分析表
sql> exec dbms_stats.gather_table_stats(ownname => 'scott',tabname => 'work_list',estimate_percent => 10,method_opt=> 'for all indexed columns') ;
--分析索引
SQL> exec dbms_stats.gather_index_stats(ownname => 'crm2',indname => 'IDX_ADM_PERMISSION_PID_MID',estimate_percent => '10',degree => '4') ;
--如果發現執行計劃走錯,刪除表的統計資訊
SQL>dbms_stats.delete_table_stats(ownname => 'scott',tabname => 'work_list') ;
--匯入錶的歷史統計資訊
sql> exec dbms_stats.import_table_stats(ownname => 'scott',tabname => 'work_list',stattab => 'stat_table') ;
--如果進行分析後,大部分表的執行計劃都走錯,需要導回整個scheme的統計資訊
sql> exec dbms_stats.import_schema_stats(ownname => 'scott',stattab => 'stat_table');
--匯入索引的統計資訊
SQL> exec dbms_stats.import_index_stats(ownname => 'crm2',indname => 'IDX_ADM_PERMISSION_PID_MID',stattab => 'stat_table')
--檢查是否匯入成功
SQL> select table_name,num_rows,a.blocks,a.last_analyzed from all_tables a where a.table_name='WORK_LIST';
分析資料庫(包括所有的使用者物件和系統物件):gather_database_stats
分析使用者所有的物件(包括表、索引、簇):gather_schema_stats
分析表:gather_table_stats
分析索引:gather_index_stats
刪除資料庫統計資訊:delete_database_stats
刪除使用者方案統計資訊:delete_schema_stats
刪除表統計資訊:delete_table_stats
刪除索引統計資訊:delete_index_stats
刪除列統計資訊:delete_column_stats
設定表統計資訊:set_table_stats
設定索引統計資訊:set_index_stats
設定列統計資訊:set_column_stats
可以檢視錶 DBA_TABLES來檢視錶是否與被分析過,如:
SELECT TABLE_NAME, LAST_ANALYZED FROM DBA_TABLES
這是對命令與工具包的一些總結
1、對於分割槽表,建議使用DBMS_STATS,而不是使用Analyze語句。
a) 可以並行進行,對多個使用者,多個Table
b) 可以得到整個分割槽表的資料和單個分割槽的資料。
c) 可以在不同級別上Compute Statistics:單個分割槽,子分割槽,全表,所有分割槽
d) 可以倒出統計資訊
e) 可以使用者自動收集統計資訊
2、DBMS_STATS的缺點
a) 不能Validate Structure
b) 不能收集CHAINED ROWS, 不能收集CLUSTER TABLE的資訊,這兩個仍舊需要使用Analyze語句。
c) DBMS_STATS 預設不對索引進行Analyze,因為預設Cascade是False,需要手工指定為True
3、對於oracle 9裡面的External Table,Analyze不能使用,只能使用DBMS_STATS來收集資訊。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31397003/viewspace-2141631/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Procedure加密加密
- Oracle Wrap ProcedureOracle
- alter package/procedurePackage
- MySQL中使用procedureMySql
- 怎樣加密procedure加密
- sql primary key procedureSQL
- Procedure to create Distribution model
- Image Noise Reduction Develop Proceduredev
- Procedure for Setting Partner FunctionsFunction
- How to rename an Oracle stored procedureOracle
- EXECUTE IMMEDIATE dynamic sql in procedureSQL
- 分頁procedure (SQL Server)SQLServer
- oracle 中呼叫 store procedureOracle
- Oracle stored procedure to send emailOracleAI
- the procedure:delete the data of one tabledelete
- (C language Sample ) Compile procedureCompile
- Building a Dynamic Oracle ETL ProcedureUIOracle
- execute shell script from stored procedure
- 找到procedure中reference的物件物件
- [Developer] Oracle send mail procedure(2)DeveloperOracleAI
- Oracle之procedure的基礎使用Oracle
- PLSQL Procedure 引起 ORA-04030SQL
- mysql procedure 中 repeat &cursor 的用法。MySql
- stored procedure 收集session wait 資訊SessionAI
- PLSQL 呼叫 返回 遊標(Cursor)PROCEDURESQL
- adodb執行Procedure的方法
- SQL 建立儲存過程PROCEDURESQL儲存過程
- [Developer] Oracle sendmail procedure(1)(轉載)DeveloperOracleAI
- stored procedure 收集session wait 資訊(轉)SessionAI
- Mysql關於procedure、function的詳解MySqlFunction
- PL/SQL 05 儲存過程 procedureSQL儲存過程
- DB2 PL/SQL Example: Sleep ProcedureDB2SQL
- [Procedure]Oracle之分頁儲存過程Oracle儲存過程
- 用Oracle傳送郵件procedure (zt)Oracle
- Oracle 基礎 ----procedure(儲存過程)Oracle儲存過程
- Procedure 效能檢測與調整方法
- mysql 儲存過程 procedure 批次建表MySql儲存過程
- mybatis3呼叫瀚高procedure報錯MyBatisS3