Oracle數(shù)據(jù)庫統(tǒng)計信息方法詳解
一、統(tǒng)計信息查看
官方文檔:
Optimizer Statistics Concepts (oracle.com)
1.1 表統(tǒng)計信息查看
SELECT OWNER,
TABLE_NAME,
PARTITION_NAME,
OBJECT_TYPE,
NUM_ROWS,
BLOCKS,
EMPTY_BLOCKS,
AVG_SPACE,
CHAIN_CNT,
AVG_ROW_LEN,
to_char(LAST_ANALYZED, 'yyyy-mm-dd hh24:mi:ss') LAST_ANALYZED,
USER_STATS
FROM DBA_TAB_STATISTICS
WHERE OWNER='CMXBUSI'
AND TABLE_NAME = 'T02';
1.2 索引統(tǒng)計信息查看
SELECT INDEX_NAME AS NAME,
BLEVEL,
LEAF_BLOCKS AS LEAF_BLKS,
DISTINCT_KEYS AS DST_KEYS,
NUM_ROWS,
CLUSTERING_FACTOR AS CLUST_FACT,
AVG_LEAF_BLOCKS_PER_KEY AS LEAF_PER_KEY,
AVG_DATA_BLOCKS_PER_KEY AS DATA_PER_KEY,
LAST_ANALYZED
FROM DBA_IND_STATISTICS where
TABLE_OWNER='CMXBUSI' AND
TABLE_NAME='T02';
select table_name,index_name,leaf_blocks,blevel,distinct_keys,avg_leaf_blocks_per_key,avg_data_blocks_per_key,clustering_factor,num_rows from dba_indexes where owner = 'SCOTT' and table_name = 'T1';1.3 列統(tǒng)計信息查看
方法一:
SELECT COLUMN_NAME,
NUM_DISTINCT,
LOW_VALUE,
HIGH_VALUE,
DENSITY ,
NUM_NULLS ,
AVG_COL_LEN ,
HISTOGRAM,
NUM_BUCKETS
FROM DBA_TAB_COL_STATISTICS
WHERE OWNER='CMXBUSI'
AND TABLE_NAME = 'T02';
方法二:
a.owner ||'.'||a.table_name name ,
a.column_name,
b.num_rows,
a.num_distinct Cardinality,
a.num_distinct/b.num_rows selectivity,
num_nulls,density,
a.histogram,
a.num_buckets
from dba_tab_col_statistics a,dba_tables b
where a.owner=b.owner
and a.table_name=b.table_name
and a.owner=upper('CMXBUSI')
and a.table_name=upper('T02')
and a.column_name=upper('ID');
方法三:
select table_name,column_name,num_distinct,low_value,high_value,histogram,density from dba_tab_columns where owner = 'SCOTT' and table_name = 'T1';二、DBMS_STATS收集統(tǒng)計信息
dbms_stas 包不僅能夠對表進行分析,它還可以對數(shù)據(jù)庫分析進行管理。 按照功能可以分一下幾類:
(1) 性能數(shù)據(jù)的收集
(2) 性能數(shù)據(jù)的設置
(3) 性能數(shù)據(jù)的刪除
(4) 性能數(shù)據(jù)的備份和恢復
1.性能數(shù)據(jù)的收集 這個包的下面四個存儲過程分別收集 index、table、schema、database 的統(tǒng)計信息: dbms_stats.gather_table_stats 收集表、列和索引的統(tǒng)計信息(當 cascade 為true 時,分析表、列(索引)信息); dbms_stats.gather_schema_stats 收集 schema 下所有對象的統(tǒng)計信息; dbms_stats.gather_index_stats 收集索引的統(tǒng)計信息; dbms_stats.gather_system_stats 收集系統(tǒng)統(tǒng)計信息 dbms_stats.gather_dictionary_stats: 所有字典對象的統(tǒng)計; dbms_stats.GATHER_DATABASE_STATS:分析數(shù)據(jù)庫信息 dbms_stats.create_stat_table 創(chuàng)建存放統(tǒng)計信息表 dbms_stats.auto_sample_size 采樣值 2.性能數(shù)據(jù)的設置 設置表統(tǒng)計信息:dbms_stats.set_table_stats 設置索引統(tǒng)計信息:dbms_stats.set_index_stats 設置列統(tǒng)計信息:dbms_stats.set_column_stats 3.性能數(shù)據(jù)的刪除 刪除數(shù)據(jù)庫統(tǒng)計信息:dbms_stats.delete_database_stats 刪除用戶方案統(tǒng)計信息:dbms_stats.delete_schema_stats 刪除表統(tǒng)計信息:dbms_stats.delete_table_stats 刪除索引統(tǒng)計信息:dbms_stats.delete_index_stats 刪除列統(tǒng)計信息:dbms_stats.delete_column_stats 4.性能數(shù)據(jù)的備份和恢復 dbms_stats.EXPORT_COLUMN_STATS:導出列的分析信息 dbms_stats.EXPORT_INDEX_STATS:導出索引分析信息 dbms_stats.EXPORT_SYSTEM_STATS:導出系統(tǒng)分析信息 dbms_stats.EXPORT_TABLE_STATS:導出表分析信息 dbms_stats.EXPORT_SCHEMA_STATS:導出方案分析信息 dbms_stats.EXPORT_DATABASE_STATS:導出數(shù)據(jù)庫分析信息 dbms_stats.IMPORT_COLUMN_STATS:導入列分析信息 dbms_stats.IMPORT_INDEX_STATS:導入索引分析信息 dbms_stats.IMPORT_SYSTEM_STATS:導入系統(tǒng)分析信息 dbms_stats.IMPORT_TABLE_STATS:導入表分析信息 dbms_stats.IMPORT_SCHEMA_STATS:導入方案分析信息 dbms_stats.IMPORT_DATABASE_STATS:導入數(shù)據(jù)庫分析信息
2.1 收集統(tǒng)計信息步驟
1.檢查統(tǒng)計信息 set linesize 300; SELECT OWNER,TABLE_NAME,NUM_ROWS,LAST_ANALYZED FROM dba_tables where TABLE_NAME in ( 'T_S_TYPE', 'T_EDF_TASK' ); 2.針對運行效率慢的SQL情況,按表收集統(tǒng)計信息: sqlplus / as sysdba <<EOF exec DBMS_STATS.GATHER_TABLE_STATS(OWNNAME => '用戶名',TABNAME => '表名' ,ESTIMATE_PERCENT => 0.1 ,METHOD_OPT => 'FOR ALL INDEXED COLUMNS' ,CASCADE => TRUE,DEGREE => 30); EOF ps:ESTIMATE_PERCENT => 0.1 為采樣比例 3.針對運行效率慢的SQL情況,按用戶收集統(tǒng)計信息: sqlplus / as sysdba <<EOF exec DBMS_STATS.GATHER_schema_STATS(OWNNAME => 'CCICJY' ,ESTIMATE_PERCENT => 0.1 ,METHOD_OPT => 'FOR ALL INDEXED COLUMNS' ,CASCADE => TRUE,DEGREE => 30); EOF 4.查看統(tǒng)計信息是否執(zhí)行 select * from dba_scheduler_jobs; select * from dba_scheduler_jobs WHERE JOB_NAME='GATHER_STATS_JOB';
2.2 DBMS_STATS.GATHER_TABLE_STATS使用詳解
DBMS_STATS.GATHER_TABLE_STATS的語法如下:
DBMS_STATS.GATHER_TABLE_STATS (ownname VARCHAR2, tabname VARCHAR2, partname VARCHAR2, estimate_percent NUMBER, block_sample BOOLEAN, method_opt VARCHAR2, degree NUMBER, granularity VARCHAR2, cascade BOOLEAN, stattab VARCHAR2, statid VARCHAR2, statown VARCHAR2, no_invalidate BOOLEAN, force BOOLEAN);
參數(shù)說明:
1.ownname:要分析表的擁有者
2.tabname:要分析的表名.
3.partname:分區(qū)的名字,只對分區(qū)表或分區(qū)索引有用.
4.estimate_percent:采樣行的百分比,取值范圍[0.000001,100],null為全部分析,不采樣.
常量:DBMS_STATS.AUTO_SAMPLE_SIZE是默認值,由oracle決定最佳取采樣值.
5.block_sapmple:是否用塊采樣代替行采樣.
6.method_opt:決定histograms信息是怎樣被統(tǒng)計的(抽樣方法)
method_opt的取值如下(默認值為FOR ALL COLUMNS SIZE AUTO):
for table:只統(tǒng)計表
for all columns:分析所有的列
for all indexes:只分析統(tǒng)計相關索引
for all indexed columns:只統(tǒng)計有索引的表列
for all hidden columns:分析所有隱藏列(函數(shù)索引等
for columns <list> SIZE <N> | REPEAT | AUTO | SKEWONLY:統(tǒng)計指定列的histograms.
N的取值范圍[1,254];
REPEAT:上次統(tǒng)計過的histograms;
AUTO:由oracle決定N的大小;
skewonly:Oracle 確定需要收集檢查每個索引中每列值的分布
例如:
method_opt=>'for all columns size skewonly'
method_opt=>'for all columns size repeat'
method_opt=>'for all columns size auto'
7.degree:決定并行度.默認值為null.
分析索引速度加快,根據(jù) cpu 數(shù)量來設置,一般在業(yè)務空閑的時候 degree 可設為 cpu 數(shù)量-1,繁忙的時候就再小點。
8.granularity:要收集的統(tǒng)計信息的粒度(僅在表已分區(qū)時才相關)
根據(jù)將優(yōu)化的 SQL語句,優(yōu)化器可以選擇使用分區(qū)統(tǒng)計或全局統(tǒng)計,對于大多數(shù)系統(tǒng)這兩種統(tǒng)計都是很
重要的,Oracle 推薦將 GRANULARITY 設置為 AUTO 同時收集全部信息。
①'AUTO'-根據(jù)分區(qū)類型確定粒度。這是默認值。
②'ALL' -收集所有(子分區(qū),分區(qū)和全局)統(tǒng)計信息
③'GLOBAL' -收集全球統(tǒng)計數(shù)據(jù)
④'GLOBAL AND PARTITION'-收集全局和分區(qū)級別的統(tǒng)計信息。即使它是一個復合分區(qū)對象,也不會收集任何子分區(qū)級別統(tǒng)計信息。
⑤'PARTITION '-收集分區(qū)級別的統(tǒng)計信息
⑥'SUBPARTITION' -收集子分區(qū)級別的統(tǒng)計信息
⑦'DEFAULT'-收集全局和分區(qū)級別的統(tǒng)計信息。該選項已過時,并且當前受支持,但僅出于遺留原因才包含在文檔中。您應該使用“ GLOBAL AND PARTITION”來實現(xiàn)此功能。請注意,默認值現(xiàn)在是'AUTAUTO'。
9.cascade:是收集索引的信息.默認為FALSE.
10.stattab:用戶統(tǒng)計信息表標識符,用于描述將當前統(tǒng)計信息保存在何處
statid如果多個表的統(tǒng)計信息存儲在同一個stattab中用于進行區(qū)分,標識符
statown存儲統(tǒng)計信息表的擁有者.包含的架構stattab(如果不同于ownname)
以上三個參數(shù)若不指定,統(tǒng)計信息會直接更新到數(shù)據(jù)字典.
11.no_invalidate: 通過不同的參數(shù)配置,可以實現(xiàn)對 Oracle 失效共享游標行為的控制TRUE,F(xiàn)ALSE
如果取值為 true,表示不進行游標失效動作,原有的 shared cursor 保持原有狀態(tài)。
如果取值為 false,表示將統(tǒng)計量對象相關的所有 cursor 全部失效。
如果設置為auto_invalidate,根據(jù)官方文檔,Oracle 自己決定 shared cursor 失效動作。
從 10G 開始,Oracle 就將 auto_invalidate 作為默認的統(tǒng)計量收集行為。
select dbms_stats.get_param(pname => 'no_invalidate') from dual;
12.force:即使表鎖住了也收集統(tǒng)計信息.
13.options 分析模式
使用 4 個預設的法子之一,這個選項能把握 Oracle 統(tǒng)計的刷新方法:
gather——重新分析整個(Schema)。
gather empty——只分析目前還沒有統(tǒng)計的表。
gather stale——只重新分析修改量超過 10%的表(這些修改包含插入、更新和刪除)。
gather auto——重新分析以前沒有統(tǒng)計的對象,以及統(tǒng)計數(shù)據(jù)過期(變臟)的對象。
注意,使用 gather auto 相似于組合使用 gather stale 和 gather empty。注意,不論 gather stale 仍是 gather auto,都請求進行監(jiān)視。假如你施行一個alter table xxx monitoring 命令,Oracle 會用 dba_tab_modifications 視圖來跟蹤發(fā)生變動的表。這樣一來,你就確實地知道,自從上一次剖析統(tǒng)計數(shù)據(jù)以來,發(fā)生了多少次插入、更新和刪除操作。
14.objlist: 指定對象列表
15.obj_filter_list:A list of object filters
16.gather_sys:只收集 sys 的對象。
17.stattype:統(tǒng)計信息類型。允許的唯一值是DATA。2.3 收集直方圖
直方圖收集方法
1. 語法格式
對于dbms_stats包,是通過指定method_opt參數(shù)實現(xiàn)的,該參數(shù)可接受值如下:
1.1統(tǒng)計所有列的histograms(直方圖).
for all [indexed | hidden] columns [size_clause]
1.2統(tǒng)計指定列的histograms(直方圖).
for columns [size_clause] column | attribute [size_clause] [,column | attribute [size_clause]...]
例如:
for columns column size 1
for columns column size auto
其中size_clause必須符合以下格式:size [整數(shù)值 | repeat | auto | skewonly]
整數(shù)值:直方圖的Bucket數(shù),范圍為[1,254],為1表示刪除列上直方圖信息
repeat:只對已有直方圖的列收集直方圖信息
auto:由oracle決定是否對列收集直方圖,以及使用哪類直方圖。oracle默認只對用過的列(where條件中出現(xiàn)過的列)自動收集直方圖統(tǒng)計信息,oracle會在sys.col_usage$基表中記錄各列的使用情況。在自動收集直方圖統(tǒng)計信息時先查該表,如果列未被使用過,則不會收集。
skewonly:只對傾斜列收集直方圖
2.距離
2.1 對表所有列以auto方式收集直方圖
exec dbms_stats.gather_table_stats(ownname => 'USER01',tabname => 'TAB01',method_opt=> 'for all columns size auto');
2.2 對表所有有索引的列以auto方式收集直方圖
exec dbms_stats.gather_table_stats(ownname => 'USER01',tabname => 'TAB01',method_opt=> 'for all indexed columns size auto');
2.3 對表的empno和deptno列以auto方式收集直方圖
exec dbms_stats.gather_table_stats(ownname => 'USER01',tabname => 'TAB01',method_opt=> 'for columns size auto empno deptno');
2.4 對表的empno和deptno列收集直方圖,并指定Bucket數(shù)為10
exec dbms_stats.gather_table_stats(ownname => 'USER01',tabname => 'TAB01',method_opt=> 'for columns size 10 empno deptno');
2.5 對表的empno和deptno列收集直方圖,指定empno列Bucket數(shù)為10,deptno列Bucket數(shù)為5
exec dbms_stats.gather_table_stats(ownname => 'USER01',tabname => 'TAB01',method_opt=> 'for columns empno size 10 deptno size 5')
3.查詢直方圖
SELECT COLUMN_NAME,NOTES,HISTOGRAM FROM DBA_TAB_COL_STATISTICS WHERE TABLE_NAME = 'SALES2';
select * from user_histograms;2.4 收集數(shù)據(jù)庫統(tǒng)計信息
gather_database_stats 收集數(shù)據(jù)庫級別的統(tǒng)計信息
GATHER_DATABASE_STATS 語法與參數(shù)
DBMS_STATS.GATHER_DATABASE_STATS (
estimate_percent NUMBER DEFAULT to_estimate_percent_type(get_param('ESTIMATE_PERCENT')),
block_sample BOOLEAN DEFAULT FALSE,
method_opt VARCHAR2 DEFAULT get_param('METHOD_OPT'),
degree NUMBER DEFAULTto_degree_type(get_param('DEGREE')),
granularity VARCHAR2 DEFAULT GET_PARAM('GRANULARITY'),
cascade BOOLEAN DEFAULT
to_cascade_type(get_param('CASCADE')),
stattab VARCHAR2 DEFAULT NULL,
statid VARCHAR2 DEFAULT NULL,
options VARCHAR2 DEFAULT 'GATHER',
objlist OUT ObjectTab,
statown VARCHAR2 DEFAULT NULL,
gather_sys BOOLEAN DEFAULT TRUE,
no_invalidate BOOLEAN DEFAULT to_no_invalidate_type (
get_param('NO_INVALIDATE')),
obj_filter_list ObjectTab DEFAULT NULL);
gather_database_stats 測試:
SQL>exec DBMS_STATS.gather_database_stats; SQL>exec DBMS_STATS.gather_database_stats(estimate_percent => 15); SQL>exec DBMS_STATS.GATHER_DATABASE_STATS(estimate_percent=>10,Degree=>8, Cascade=>TRUE, Granularity=>'ALL');
過程:
SQL> exec DBMS_STATS.gather_database_stats; PL/SQL procedure successfully completed
查看進程
SQL> select distinct sid, serial# from v$session_longops where opname like'%Gather%';
SID SERIAL#
---------- ----------
459 20726
select distinct sid, serial# from v$session_longops where opname like'%gather_database_stats%';如果要終止:
SQL> alter system kill session '459,20726'; System altered
2.5 收集用戶統(tǒng)計信息
1)、GATHER_SCHEMA_STATS 語法與參數(shù)
DBMS_STATS.GATHER_SCHEMA_STATS (
ownname VARCHAR2,
estimate_percent NUMBER DEFAULT to_estimate_percent_type(get_param('ESTIMATE_PERCENT')),
block_sample BOOLEAN DEFAULT FALSE,
method_opt VARCHAR2 DEFAULT get_param('METHOD_OPT'),
degree NUMBER DEFAULTto_degree_type(get_param('DEGREE')),
granularity VARCHAR2 DEFAULT GET_PARAM('GRANULARITY'),
cascade BOOLEAN DEFAULTto_cascade_type(get_param('CASCADE')),
stattab VARCHAR2 DEFAULT NULL,
statid VARCHAR2 DEFAULT NULL,
options VARCHAR2 DEFAULT 'GATHER',
objlist OUT ObjectTab,
statown VARCHAR2 DEFAULT NULL,
no_invalidate BOOLEAN DEFAULT to_no_invalidate_type (
get_param('NO_INVALIDATE')),
force BOOLEAN DEFAULT FALSE,
obj_filter_list ObjectTab DEFAULT NULL);
GATHER_SCHEMA_STATS2.5.2 重新收集用戶所有的統(tǒng)計信息
begin
dbms_stats.gather_schema_stats(ownname => 'CMXBUSI',
options => 'gather',
estimate_percent => 100,
method_opt => 'for all indexed columns',
degree => 2);
end;
/2.5.3 重新收集用戶以前沒有統(tǒng)計的對象
begin
dbms_stats.gather_schema_stats(ownname => 'CMXBUSI',
options => 'gather auto',
estimate_percent =>dbms_stats.AUTO_SAMPLE_SIZE,
method_opt => 'for all columns size auto',
cascade => true,
degree => 2);
end;
/2.5.4 收集用戶分區(qū)表和索引信息
begin
dbms_stats.gather_schema_stats(ownname => 'CMXBUSI',
estimate_percent => 10,
cascade => true,
granularity => 'all',
degree => 2);
end;
/2.6 收集表的統(tǒng)計信息
收集統(tǒng)計信息的方法之 gather_table_stats
1)統(tǒng)計信息的函數(shù) dbms_stats.gather_table_stats 介紹:
dbms_stats.gather_table_stats (
ownname varchar2,
tabname varchar2,
partname varchar2 default null,
estimate_percent number default to_estimate_percent_type
(get_param('estimate_percent')),
block_sample boolean default false,
method_opt varchar2 default get_param('method_opt'),
degree number default to_degree_type(get_param('degree')),
granularity varchar2 default get_param('granularity'),
cascade boolean defaultto_cascade_type(get_param('cascade')),
stattab varchar2 default null,
statid varchar2 default null,
statown varchar2 default null,
no_invalidate boolean default to_no_invalidate_type (
get_param('no_invalidate')),
force boolean default false);2)gather_table_stats 測試:
–查看表的統(tǒng)計信息
SQL>select table_name, blocks, empty_blocks, num_rows from SQL>dba_tables where owner = 'SCOTT' and table_name = 'T1'; SQL>select table_name, blocks, empty_blocks, num_rows,LAST_ANALYZED fromdba_tables where owner = 'SCOTT' and table_name = 'T1'; SQL>select table_name,sample_size,num_rows,round(sample_size/num_rows*100,1)"%" from dba_tables where owner = 'SCOTT' and table_name = 'T1'; SQL>select table_name,sample_size,num_rows,round(sample_size/num_rows*100,1)"%" from dba_tables where owner = 'SCOTT' order by table_name;
–查看表列的統(tǒng)計信息
SQL>select table_name,column_name,last_analyzed,num_distinct,low_value,high_value,histogram,density from dba_tab_columns where owner = 'SCOTT' and table_name ='T1';
–查看表索引的統(tǒng)計信息
SQL>select table_name,index_name,last_analyzed,leaf_blocks,blevel,distinct_keys,avg_leaf_blocks_per_key,avg_data_blocks_per_key,clustering_factor,num_rows fromdba_indexes where owner = 'SCOTT' and table_name = 'T1';
–情形1:收集表,包括表的所有列和索引的統(tǒng)計信息
SQL>analyze table ITPUX_M10 delete statistics;
SQL>begin
>dbms_stats.gather_table_stats(ownname => 'SCOTT',
>tabname => 'T1',
>estimate_percent =>dbms_stats.AUTO_SAMPLE_SIZE,
>method_opt => 'for all indexed columns',
>cascade => true,
>degree => 2);
>end;
>/–情形2:只收集表的統(tǒng)計信息,采樣比例為 15%
SQL>analyze table ITPUX_M10 delete statistics;
SQL>begin
>dbms_stats.gather_table_stats(ownname => 'SCOTT',
>tabname => 'T1',
>estimate_percent => 15,
>method_opt => 'for table',
>cascade => false,
>degree => 2);
>end;
>/–情形3:只收集表的統(tǒng)計信息,其中兩列的信息不收集直方圖
SQL>analyze table T1 delete statistics;
SQL>begin
>dbms_stats.gather_table_stats(ownname => 'SCOTT',
>tabname => 'T1',
>estimate_percent => 100,
>method_opt => 'for columns size 1 object_name status',
>cascade => false,
>degree => 2);
>end;
>/–情形4:只收集表的信息,表所有列以及表所有索引的統(tǒng)計信息
SQL>begin
>dbms_stats.gather_table_stats(ownname => 'SCOTT',
>tabname => 'T1',
>estimate_percent => 100,
>cascade => true,
>degree => 2);
>end;
>/–情形5:(包括表,分區(qū)表,子分區(qū))
SQL>begin
>dbms_stats.gather_table_stats(ownname => 'SCOTT',
>tabname => 'T1',
>estimate_percent => 18,
>cascade => true,
>granularity => 'ALL', --全局的表,分區(qū)表,子分區(qū)表
>degree => 2);
>end;
>/–情形6:分區(qū)級的統(tǒng)計信息收集
SQL>begin
>dbms_stats.gather_table_stats(ownname => 'SCOTT',
>tabname => 'T1',
>partname => '分區(qū)名',
>estimate_percent => 5,
>cascade => true,
>granularity => 'PARTITION',
>method_opt => 'for all indexes columns',
>degree => 2);
>end;
>/–情形7:刪除表的統(tǒng)計信息
SQL>begin >dbms_stats.delete_table_stats (ownname => 'SCOTT',tabname >=>'T1'); >end; >/
2.7 收集index 的統(tǒng)計信息
1)gather_index_stats 語法
DBMS_STATS.GATHER_INDEX_STATS (
ownname VARCHAR2,
indname VARCHAR2,
partname VARCHAR2 DEFAULT NULL,
estimate_percent NUMBER DEFAULT to_estimate_percent_type (GET_PARAM('ESTIMATE_PERCENT')),
stattab VARCHAR2 DEFAULT NULL,
statid VARCHAR2 DEFAULT NULL,
statown VARCHAR2 DEFAULT NULL,
degree NUMBER DEFAULT to_degree_type(get_param('DEGREE')),
granularity VARCHAR2 DEFAULT GET_PARAM('GRANULARITY'),
no_invalidate BOOLEAN DEFAULT to_no_invalidate_type (GET_PARAM('NO_INVALIDATE')),
force BOOLEAN DEFAULT FALSE);2.8 數(shù)據(jù)字典表收集
GATHER_DICTIONARY_STATS:
DBMS_STATS.GATHER_DICTIONARY_STATS (
comp_id VARCHAR2 DEFAULT NULL,
estimate_percent NUMBER DEFAULT to_estimate_percent_type (get_param('ESTIMATE_PERCENT')),
block_sample BOOLEAN DEFAULT FALSE,
method_opt VARCHAR2 DEFAULT get_param('METHOD_OPT'),
degree NUMBER DEFAULT to_degree_type(get_param('DEGREE')),
granularity VARCHAR2 DEFAULT GET_PARAM('GRANULARITY'),
cascade BOOLEAN DEFAULT to_cascade_type(get_param('CASCADE')),
stattab VARCHAR2 DEFAULT NULL,
statid VARCHAR2 DEFAULT NULL,
options VARCHAR2 DEFAULT 'GATHER AUTO',
objlist OUT ObjectTab,
statown VARCHAR2 DEFAULT NULL,
no_invalidate BOOLEAN DEFAULT to_no_invalidate_type (get_param('NO_INVALIDATE')),
obj_filter_list ObjectTab DEFAULT NULL);SQL> exec DBMS_STATS.GATHER_DICTIONARY_STATS (estimate_percent=>100, Degree=>8, Cascade=>TRUE, Granularity=>'ALL');
2.9 動態(tài)性能表收集
動態(tài)性能表統(tǒng)計信息采集GATHER_FIXED_OBJECTS_STATS
DBMS_STATS.GATHER_FIXED_OBJECTS_STATS (
stattab VARCHAR2 DEFAULT NULL,
statid VARCHAR2 DEFAULT NULL,
statown VARCHAR2 DEFAULT NULL,
no_invalidate BOOLEAN DEFAULT to_no_invalidate_type (get_param('NO_INVALIDATE')));SQL> exec DBMS_STATS.GATHER_FIXED_OBJECTS_STATS;
測試:
v$lock 視圖訪問慢解決方法
V$ 視圖訪問慢–解決方法
分析:可能是有數(shù)據(jù)字典統(tǒng)計信息過久,造成。
SQL>exec dbms_stats.gather_fixed_objects_stats;
2.10 收集所有數(shù)據(jù)字典的fixed table 的統(tǒng)計信息
請勿在業(yè)務高峰期間執(zhí)行。
如果需要單獨對這張fixed_table 進行統(tǒng)計分析也可以用:
SQL>exec DBMS_STATS.GATHER_TABLE_STATS ('SYS', 'X$KSUSE');
SQL>exec dbms_stats.gather_table_stats(ownname=>'SYS',tabname=>'RECYCLEBIN$');然后確認統(tǒng)計信息的正確性:
SQL>select count(*) from sys.tab_stats$; SQL>select num_rows, last_analyzed from user_tab_statistics where table_name ='X$KSUSE';
關于基表的查詢:
SQL>select VIEW_DEFINITION from v$fixed_view_definition where view_name='V$LOCK';
or:
SQL>select dbms_metadata.get_ddl('VIEW', 'DBA_EXTENTS') from dual;三、analyze收集統(tǒng)計信息
三大功能
① 搜集和刪除索引、表和簇的統(tǒng)計信息
② 驗證表、索引和簇的結構
③ 鑒定表和簇和行遷移和行鏈接
3.1 表情況查詢
查看表的統(tǒng)計信息
select table_name, blocks, empty_blocks, num_rows from dba_tables where owner = 'CMXBUSI' and table_name = 'T02';
查看表列的統(tǒng)計信息
select table_name, column_name, num_distinct, low_value, high_value, histogram, density from dba_tab_columns where owner = 'CMXBUSI' and table_name = 'T02';
查看表索引的統(tǒng)計信息
select * from dba_indexes leaf_blocks, -- 索引中葉子塊數(shù)據(jù) blevel, -- B 樹索引等級 distinct_keys, -- 不同索引值的數(shù)量 avg_leaf_blocks_per_key, -- 索引中的每個值平均在多少個葉子塊中,如果是主鍵/唯一就是 1. avg_data_blocks_per_key, -- 通過索引中的一個值指向表中的數(shù)據(jù)塊,應數(shù)據(jù)塊數(shù)量的平均值。 clustering_factor, -- 聚集因子,越小越好,越大越不好。num_rows --索引的行數(shù)量。 SELECT TABLE_NAME,INDEX_NAME,LEAF_BLOCKS,blevel,DISTINCT_KEYS,AVG_LEAF_BLOCKS_PER_KEY,AVG_DATA_BLOCKS_PER_KEY,CLUSTERING_FACTOR from dba_indexes WHERE TABLE_OWNER='CMXBUSI' and table_name = 'T02';
3.2 表收集
analyze table t1 compute statistics for table;
3.3 表字段收集
analyze table T1 compute statistics for all columns;
3.4 索引字段收集
analyze table T1 compute statistics for all indexed columns;
3.5 同時收集表,表字段,索引字段
analyze table T1 compute statistics;
3.6 索引收集
analyze table T1 compute statistics for all indexes;
3.7 同時收集表,表字段,索引
analyze table T1 compute statistics for table for all indexes for all columns;
3.8 刪統(tǒng)計信息
analyze table t1 delete statistics;
3.9 驗證表,索引,分區(qū)的結構
analyze table T1 validate structure; analyze table CMXBUSI.T01 validate structure;
四、知識總結
這是對命令與工具包的總結:
1、對于分區(qū)表,建議使用DBMS_STAT,而不是使用analyze語句。
a)可以并行進行,對多個用戶,多個table
b)可以得到整個分區(qū)表的數(shù)據(jù)和單個分區(qū)的數(shù)據(jù)。
c)可以在不同級別上compute statics:單個分區(qū)、子分區(qū)、全表、所有分區(qū)。
d)可以導出統(tǒng)計信息
e)可以用戶自動收集統(tǒng)計信息
DBMS_STATS的缺點
a)不能validate strtucture
b)不能收集CHAINED ROWS,不能收集CLUSTER TABLE的信息,這兩個仍舊需要使用analyze語句。
c)DBMS_STATS默認不對索引進行analyze,因為默認cascade是false,需要手工指定為True。
總結
到此這篇關于Oracle數(shù)據(jù)庫統(tǒng)計信息的文章就介紹到這了,更多相關Oracle統(tǒng)計信息內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Oracle數(shù)據(jù)庫 DGbroker三種保護模式的切換
這篇文章主要介紹了Oracle數(shù)據(jù)庫 DGbroker三種保護模式的切換 的相關資料,需要的朋友可以參考下2015-12-12
Oracle啟用“_optimizer_skip_scan_enabled” 參數(shù)導致NC系統(tǒng)卡死問題解決方法
這篇文章主要介紹了Oracle啟用“_optimizer_skip_scan_enabled” 參數(shù)導致NC系統(tǒng)卡死問題解決方法,本文給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧2024-08-08
詳解Oracle如何將txt文件中的數(shù)據(jù)導入數(shù)據(jù)庫
這篇文章主要介紹了Oracle如何將txt文件中的數(shù)據(jù)導入數(shù)據(jù)庫,文中通過代碼示例和圖文結合的方式給大家講解的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下2024-03-03
使用imp和exp命令對Oracle數(shù)據(jù)庫進行導入導出操作詳解
這篇文章主要介紹了使用imp和exp命令對Oracle數(shù)據(jù)庫進行導入導出操作詳解,文中通過示例介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-07-07
在Oracle實例關閉時如何修改spfile的參數(shù)詳解
這篇文章主要給大家介紹了關于在Oracle實例關閉時如何修改spfile參數(shù)的相關資料,文中通過示例代碼介紹的非常詳細,對大家具有一定的參考學習價值,需要的朋友們下面跟著小編來一起學習學習吧。2017-07-07
Linux環(huán)境下重啟Oracle數(shù)據(jù)庫詳細圖文教程
Linux系統(tǒng)下網(wǎng)站出現(xiàn)問題的時候,可通過重啟oracle數(shù)據(jù)庫進行處理,這篇文章主要給大家介紹了關于Linux環(huán)境下重啟Oracle數(shù)據(jù)庫詳細圖文教程的相關資料,需要的朋友可以參考下2023-12-12

