真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Oracle統(tǒng)計(jì)信息(1)

Oracle統(tǒng)計(jì)信息(1)

臨潭網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)公司!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、APP開(kāi)發(fā)、響應(yīng)式網(wǎng)站開(kāi)發(fā)等網(wǎng)站項(xiàng)目制作,到程序開(kāi)發(fā),運(yùn)營(yíng)維護(hù)。創(chuàng)新互聯(lián)公司于2013年開(kāi)始到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來(lái)保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)公司。
















統(tǒng)計(jì)信息

  1. 統(tǒng)計(jì)信息概述

    統(tǒng)計(jì)信息主要是描述數(shù)據(jù)庫(kù)中表,索引的大小,規(guī)模,數(shù)據(jù)分布狀況等的一類信息。比如,表的行數(shù),塊數(shù),平均每行的大小,索引的leaf blocks,索引字段的行數(shù),不同值的大小等,都屬于統(tǒng)計(jì)信息。CBO正是根據(jù)這些統(tǒng)計(jì)信息數(shù)據(jù),計(jì)算出不同訪問(wèn)路徑下,不同join 方式下,各種計(jì)劃的成本,最后選擇出成本最小的計(jì)劃。

    在CBO(基于代價(jià)的優(yōu)化器模式)條件下,SQL語(yǔ)句的執(zhí)行計(jì)劃由統(tǒng)計(jì)信息來(lái)決定,若沒(méi)有統(tǒng)計(jì)信息則會(huì)采取動(dòng)態(tài)采樣的方式?jīng)Q定執(zhí)行計(jì)劃!可以說(shuō)統(tǒng)計(jì)信息關(guān)乎sql的執(zhí)行計(jì)劃是否正確,屬于sql執(zhí)行的指導(dǎo)思想,oracle的初始化參數(shù)statistics_level控制收集統(tǒng)計(jì)信息的級(jí)別,有三個(gè)參數(shù)值:

BASIC :---收集基本的統(tǒng)計(jì)信息

TYPICAL:--收集大部分統(tǒng)計(jì)信息(數(shù)據(jù)庫(kù)的默認(rèn)設(shè)置)

ALL:--收集全部統(tǒng)計(jì)信息

    Oracle 10g之后,Query Optimizer就已經(jīng)將CBO作為默認(rèn)優(yōu)化器,并且Oracle官方不再支持RBO服務(wù)。但是,通過(guò)優(yōu)化器參數(shù)optimizer_mode,我們可以控制Oracle優(yōu)化器生成不同模式下的執(zhí)行計(jì)劃。

  1. 如何收集統(tǒng)計(jì)信息

    1. 統(tǒng)計(jì)信息的內(nèi)容:

1)Table statistics

Number of rows --行數(shù)量

Number of blocks --block數(shù)量

Average row length --平均行的長(zhǎng)度.

2)Column statistics

Number of distinct values (NDV) in column --列中distinct的值

Number of nulls in column --列中null的值

Data distribution (histogram) --數(shù)據(jù)分布

3)Index statistics

Number of leaf blocks --子節(jié)點(diǎn)的塊數(shù)量

Levels --子節(jié)點(diǎn)數(shù)量

Clustering factor --集群因子

4)System statistics

I/O performance and utilization --IO性能和利用率

CPU performance and utilization --CPU的性能和利用率

  1. 收集統(tǒng)計(jì)信息的方式

    Oracle Statistic 的收集,可以使用analyze 命令,也可以使用DBMS_STATS 包來(lái)收集,Oracle 建議使用DBMS_STATS包來(lái)收集統(tǒng)計(jì)信息,因?yàn)镈BMS_STATS包收集的更廣,并且更準(zhǔn)確。analyze 在以后的版本中可能會(huì)被移除。

DBMS_STATS常用的幾個(gè)過(guò)程如下:

dbms_stats.gather_table_stats 收集表、列和索引的統(tǒng)計(jì)信息;

dbms_stats.gather_schema_stats收集SCHEMA下所有對(duì)象的統(tǒng)計(jì)信息;

dbms_stats.gather_index_stats收集索引的統(tǒng)計(jì)信息;

dbms_stats.gather_system_stats收集系統(tǒng)統(tǒng)計(jì)信息

dbms_stats.GATHER_DICTIONARY_STATS:所有字典對(duì)象的統(tǒng)計(jì);

DBMS_STATS.GATHER_DICTIONARY_STATS其收集所有系統(tǒng)模式的統(tǒng)計(jì)

dbms_stats.delete_table_stats刪除表的統(tǒng)計(jì)信息

dbms_stats.delete_index_stats 刪除索引的統(tǒng)計(jì)信息

dbms_stats.export_table_stats輸出表的統(tǒng)計(jì)信息

dbms_stats.create_state_table

dbms_stats.set_table_stats 設(shè)置表的統(tǒng)計(jì)

dbms_stats.auto_sample_size

analyze 命令的語(yǔ)法如下:

analyze table tablename compute statistics;

analyze table tablename compute statistics for all indexes;

analyze table tablename delete statistics;

2.3 自動(dòng)收集統(tǒng)計(jì)信息

    Oracle 的Statistic 信息的收集分兩種:自動(dòng)收集手工收集。

自動(dòng)收集的工作原理

    Oracle 的Automatic Statistics Gathering 是通過(guò)Scheduler 來(lái)實(shí)現(xiàn)收集和維護(hù)的。Job 名稱是GATHER_STATS_JOB, 該Job收集數(shù)據(jù)庫(kù)所有對(duì)象的2種統(tǒng)計(jì)信息:

(1)Missing statistics(統(tǒng)計(jì)信息缺失)

(2)Stale statistics(統(tǒng)計(jì)信息陳舊)

    該Job 是在數(shù)據(jù)庫(kù)創(chuàng)建的時(shí)候自動(dòng)創(chuàng)建,并由Scheduler來(lái)管理。Scheduler 在maintenance windows open時(shí)運(yùn)行g(shù)ather job。 默認(rèn)情況下,11g在周一到周五(晚22:00-次日2:00),通過(guò)一個(gè)job(gather_stat_job)自動(dòng)收集對(duì)象的統(tǒng)計(jì)信息。這種自動(dòng)收集統(tǒng)計(jì)信息的方式并不是收集所有對(duì)象的統(tǒng)計(jì)信息,而是收集沒(méi)有統(tǒng)計(jì)信息的對(duì)象和統(tǒng)計(jì)信息過(guò)舊的對(duì)象。然后確定優(yōu)先級(jí),再開(kāi)始進(jìn)行統(tǒng)計(jì)信息。

    Scheduler Job的stop_on_window_close 屬性控制GATHER_STATS_JOB 是否繼續(xù)。該屬性默認(rèn)值為True.如果該值設(shè)置為False,那么GATHER_STATS_JOB 會(huì)中斷, 而沒(méi)有收集完的對(duì)象將在下次啟動(dòng)時(shí)繼續(xù)收集。

    gather_stats_job 調(diào)用dbms_stats.gather_database_stats_job_proc過(guò)程來(lái)收集statistics 的信息。 該過(guò)程收集對(duì)象statistics的條件如下:

(1)對(duì)象的統(tǒng)計(jì)信息之前沒(méi)有收集過(guò)。

(2)當(dāng)對(duì)象有超過(guò)10%的rows 被修改,此時(shí)對(duì)象的統(tǒng)計(jì)信息也稱為stale statistics。

    但是對(duì)于高度變化的表在白天的活動(dòng)期間被TRUNCATE/DROP并重建或者塊加載超過(guò)本身總大小10%的對(duì)象;我們可以將這些表上的統(tǒng)計(jì)設(shè)置為NULL

可以通過(guò)以下SQL來(lái)查看job:

select job_name, program_name, enabled, stop_on_window_close

from dba_scheduler_jobs

where job_name = 'gather_stats_job';

    

控制自動(dòng)收集統(tǒng)計(jì)信息的參數(shù):STATISTICS_LEVEL

    為了決定是否對(duì)對(duì)象進(jìn)行監(jiān)控,Oracle提供了一個(gè)參數(shù)STATISTICS_LEVEL。通過(guò)設(shè)置初始化參數(shù)STATISTIC_LEVEL

  • typical 或all,就可以自動(dòng)收集統(tǒng)計(jì)信息(默認(rèn)值為TYPICAL,因此可以隨即啟用自動(dòng)收集統(tǒng)計(jì)信息的功能)。STATISTIC_LEVEL 參數(shù)的值可以激活GATHER_STATS_JOB。
  • basicSTATISTICS_LEVEL設(shè)置為basic,不僅不能監(jiān)控表,而且將禁掉如下一些10g的新功能,在10g中表監(jiān)控默認(rèn)是激活的:

        (1)ASH(Active Session History)

        (2)ASSM(Automatic Shared Memory Management)

        (3)AWR(Automatic Workload Repository)

Oracle統(tǒng)計(jì)信息(1)        (4)ADDM(Automatic Database Diagnostic Monitor)

自動(dòng)收集統(tǒng)計(jì)信息的過(guò)程講解

    當(dāng)啟動(dòng)對(duì)象的監(jiān)控后,從上次統(tǒng)計(jì)信息收集之后的的信息,如inserts,updates,deletes等,這些改變的信息會(huì)記錄到user_tab_modifications視圖。

    當(dāng)對(duì)象的數(shù)據(jù)發(fā)生改變之后,經(jīng)過(guò)幾分鐘的延時(shí),這些信息寫入user_tab_modifications視圖,然后dbms_stats.flush_database_monitoring_info過(guò)程就會(huì)發(fā)現(xiàn)這些信息,并將這些信息保存在內(nèi)存中。

    當(dāng)監(jiān)控的對(duì)象被修改的部分10%時(shí),gather_database_stats 或者gather_schema_stats 過(guò)程就會(huì)去收集這些stale statistics。

查看自動(dòng)收集統(tǒng)計(jì)信息

  1. 查看自動(dòng)收集統(tǒng)計(jì)信息的任務(wù)及狀態(tài):

select client_name,status from dba_autotask_client;

Oracle統(tǒng)計(jì)信息(1)

  1. 禁止自動(dòng)收集統(tǒng)計(jì)信息的任務(wù)

exec DBMS_AUTO_TASK_ADMIN.DISABLE(client_name => 'auto optimizer stats collection',operation => NULL,window_name => NULL);

再次查看

Oracle統(tǒng)計(jì)信息(1)

  1. 啟用自動(dòng)收集統(tǒng)計(jì)信息的任務(wù)

exec DBMS_AUTO_TASK_ADMIN.ENABLE(client_name => 'auto optimizer stats collection',operation => NULL,window_name => NULL);

  1. 獲得當(dāng)前自動(dòng)收集統(tǒng)計(jì)信息的執(zhí)行時(shí)間

col  WINDOW_NAME format a20

col REPEAT_INTERVAL format a70

col DURATION format a20

set line 180

SELECT w.window_name, w.repeat_interval,w.duration, w.enabled

 FROM dba_autotask_window_clients c, dba_scheduler_windows w

 WHERE c.window_name = w.window_name AND c.optimizer_stats = 'ENABLED';

Oracle統(tǒng)計(jì)信息(1)

下面對(duì)上圖的參數(shù)講解


FREQ關(guān)鍵字用來(lái)指定間隔的時(shí)間周期,可選參數(shù)有:YEARLY(年), MONTHLY(月), WEEKLY(周), DAILY(日), HOURLY(時(shí)), MINUTELY(分), SECONDLY(秒)等單位。



INTERVAL關(guān)鍵字用來(lái)指定間隔的頻繁,可指定的值的范圍從1-999。



BYHOUR指定一天中的小時(shí)??芍付ǖ闹档姆秶鷱?-24。16,17,18就表示每天下午的4、5、6點(diǎn)。



BYDAY關(guān)鍵字用來(lái)指定每周的哪天運(yùn)行。



BYMONTHDAY關(guān)鍵字用來(lái)指定每月中的哪一天。-1表示每月最后一天。



BYMONTH關(guān)鍵字用來(lái)指定每年的月份。



BYDATE指定日期。0310就表示3月10日。



https://blog.csdn.net/zq9017197/article/details/6985109



--WINDOW_NAME:任務(wù)名



--REPEAT_INTERVAL:任務(wù)重復(fù)間隔時(shí)間



--DURATION:持續(xù)時(shí)間



--enabled為true表明當(dāng)前的這些作業(yè)處于激活狀態(tài)


  1. 查看自動(dòng)收集統(tǒng)計(jì)信息歷史執(zhí)行情況

SELECT * FROM dba_autotask_client_history

WHERE client_name LIKE '%stats%';


-維護(hù)窗口組



select * from dba_scheduler_window_groups;



--維護(hù)窗口組對(duì)應(yīng)窗口



select * from dba_scheduler_wingroup_members



--維護(hù)窗口歷史信息



select* from dba_scheduler_windows




--查詢自動(dòng)收集任務(wù)正在執(zhí)行的job



select * from DBA_AUTOTASK_CLIENT_JOB;



--查詢自動(dòng)收集任務(wù)歷史執(zhí)行狀態(tài)



select * from DBA_AUTOTASK_JOB_HISTORY;



select * from DBA_AUTOTASK_CLIENT_HISTORY;


  1. 修改統(tǒng)計(jì)信息執(zhí)行的時(shí)間


1.關(guān)閉單個(gè)調(diào)度時(shí)間窗口,這里我們關(guān)閉MONDAY_WINDOW



BEGIN



DBMS_AUTO_TASK_ADMIN.disable (



 client_name   => 'auto optimizer stats collection',



 operation     => NULL,



 window_name   => 'MONDAY_WINDOW');



 END;



 /




--驗(yàn)證關(guān)閉情況,如下,optimizer_stats列為DISABLED



SELECT window_name,window_next_time,window_active,optimizer_stats



FROM dba_autotask_window_clients



WHERE window_name = 'MONDAY_WINDOW'



ORDER BY window_next_time;


Oracle統(tǒng)計(jì)信息(1)


					




2.開(kāi)啟單個(gè)調(diào)度時(shí)間窗口及所有時(shí)間調(diào)度窗口,只需要使用enable過(guò)程



 --注:?jiǎn)蝹€(gè)應(yīng)指定窗口名字,如window_name   => 'MONDAY_WINDOW'



 BEGIN



 DBMS_AUTO_TASK_ADMIN.enable (



 client_name   => 'auto optimizer stats collection',



 operation     => NULL,



 window_name   => 'MONDAY_WINDOW');



 END;



 /





--1.停止任務(wù)



BEGIN



DBMS_SCHEDULER.DISABLE(



name=>'"SYS"."MONDAY_WINDOW"',



force=>TRUE);



END;



/




使用如下腳本驗(yàn)證是否停止



SELECT window_name,window_next_time,window_active,optimizer_stats



FROM dba_autotask_window_clients



WHERE window_name = 'FRIDAY_WINDOW '



ORDER BY window_next_time;





--2.修改任務(wù)的持續(xù)時(shí)間,單位是分鐘



BEGIN



DBMS_SCHEDULER.SET_ATTRIBUTE(



name=>'"SYS"."FRIDAY_WINDOW"',



attribute=>'DURATION',



value=>numtodsinterval(180, 'minute'));



END;



/


Oracle統(tǒng)計(jì)信息(1)




--3.開(kāi)始執(zhí)行時(shí)間,BYHOUR=2,表示2點(diǎn)開(kāi)始執(zhí)行



BEGIN



DBMS_SCHEDULER.SET_ATTRIBUTE(



name=>'"SYS"."FRIDAY_WINDOW"',



attribute=>'REPEAT_INTERVAL',



value=>'FREQ=WEEKLY;BYDAY=MON;BYHOUR=2;BYMINUTE=0;BYSECOND=0');



END;



/


Oracle統(tǒng)計(jì)信息(1)



--4.開(kāi)啟任務(wù)



BEGIN



DBMS_SCHEDULER.ENABLE(



name=>'"SYS"."MONDAY_WINDOW"');



END;



/


  1. 修改時(shí)間窗口到特定的時(shí)間

修改時(shí)間窗口到特定的時(shí)間

--如下示例,將周五時(shí)間窗口時(shí)間到晚間23點(diǎn)30分

BEGIN

DBMS_SCHEDULER.DISABLE (name => '"SYS"."FRIDAY_WINDOW"', force => TRUE);

END;


BEGIN

DBMS_SCHEDULER.SET_ATTRIBUTE (

name => '"SYS"."FRIDAY_WINDOW"',

attribute => 'REPEAT_INTERVAL',

VALUE => 'FREQ=WEEKLY;BYDAY=FRI;BYHOUR=23;BYMINUTE=30;BYSECOND=0');

END;


BEGIN

DBMS_SCHEDULER.ENABLE (name => '"SYS"."FRIDAY_WINDOW"');

END;


--驗(yàn)證修改

SELECT w.window_name,

w.repeat_interval,

w.duration,

w.enabled

FROM dba_autotask_window_clients c, dba_scheduler_windows w

WHERE c.window_name = w.window_name

AND c.optimizer_stats = 'ENABLED'

AND c.window_name = 'FRIDAY_WINDOW';



WINDOW_NAME REPEAT_INTERVAL DURATION ENABL

--------------- ------------------------------------------------------------ ------------ --------

FRIDAY_WINDOW FREQ=WEEKLY;BYDAY=FRI;BYHOUR=23;BYMINUTE=30;BYSECOND=0 +000 04:00:0 TRUE


7、新增維護(hù)時(shí)間窗口

-- 假定我們要處理的是修改周一的時(shí)間窗口

-- 首先關(guān)閉周一的時(shí)間窗口

BEGIN

DBMS_AUTO_TASK_ADMIN.disable (

client_name => 'auto optimizer stats collection',

operation => NULL,

window_name => 'MONDAY_WINDOW');

END;

/


--接下來(lái)創(chuàng)建一個(gè)窗口并設(shè)定時(shí)間調(diào)度間隔

--如下,每周一5點(diǎn)執(zhí)行,持續(xù)時(shí)間為1小時(shí)

BEGIN

DBMS_SCHEDULER.create_window (

window_name => 'STATS_WINDOW',

resource_plan => 'DEFAULT_MAINTENANCE_PLAN',

repeat_interval => 'freq=daily;byday=MON;byhour=5;byminute=0; bysecond=0',

duration => INTERVAL '1' HOUR,

comments => 'Test window for stats task');

EXCEPTION

WHEN OTHERS

THEN

IF SQLCODE = -27477

THEN

NULL;

ELSE

RAISE;

END IF;

END;


BEGIN

DBMS_SCHEDULER.set_attribute ('STATS_WINDOW', 'SYSTEM', TRUE);

DBMS_SCHEDULER.set_attribute ('STATS_WINDOW',

'FOLLOW_DEFAULT_TIMEZONE',

TRUE);

EXCEPTION

WHEN OTHERS

THEN

IF SQLCODE = -27477

THEN

NULL;

ELSE

RAISE;

END IF;

END;

/


SQL> SELECT window_name, repeat_interval, enabled

2 FROM dba_scheduler_windows

3 WHERE window_name = 'STATS_WINDOW';


WINDOW_NAME REPEAT_INTERVAL ENABL

------------------------------ ------------------------------------------------------------ -----

STATS_WINDOW freq=daily;byday=MON;byhour=5;byminute=0; bysecond=0 TRUE


--接下來(lái)將窗口STATS_WINDOW添加到維護(hù)窗口組


BEGIN

DBMS_SCHEDULER.add_window_group_member ('MAINTENANCE_WINDOW_GROUP',

'STATS_WINDOW');

END;

/


SQL> SELECT WINDOW_NAME,

2 WINDOW_NEXT_TIME,

3 WINDOW_ACTIVE,

4 OPTIMIZER_STATS

5 FROM DBA_AUTOTASK_WINDOW_CLIENTS

6 WHERE WINDOW_NAME in ('STATS_WINDOW','MONDAY_WINDOW')

7 ORDER BY WINDOW_NEXT_TIME;


WINDOW_NAME WINDOW_NEXT_TIME WINDO OPTIMIZE

------------------------------ -------------------------------------- ----- --------

STATS_WINDOW 27-MAR-17 05.00.00.000000 AM PRC FALSE ENABLED --允許

MONDAY_WINDOW 27-MAR-17 10.00.00.000000 PM PRC FALSE DISABLED --當(dāng)前被disabled

關(guān)閉自動(dòng)統(tǒng)計(jì)信息命令,exec DBMS_SCHEDULER.DISABLE('GATHER_STATS_JOB');

啟用自動(dòng)統(tǒng)計(jì)信息命令,exec DBMS_SCHEDULER.ENABLE('GATHER_STATS_JOB');

查看自動(dòng)統(tǒng)計(jì)信息是否開(kāi)啟,

oracle 10g :SELECT OWNER,JOB_NAME,ENABLED FROM DBA_SCHEDULER_JOBS WHERE JOB_NAME = 'GATHER_STATS_JOB';

oracle 11g :select t1.owner, t1.job_name, t1.enabled from dba_scheduler_jobs t1 where t1.job_name = 'BSLN_MAINTAIN_STATS_JOB';

  1. 手動(dòng)收集統(tǒng)計(jì)信息

表的統(tǒng)計(jì)信息

包含表行數(shù),使用的塊數(shù),空的塊數(shù),塊的使用率,行遷移和鏈接的數(shù)量,pctfree,pctused的數(shù)據(jù),行的平均大?。?/p>

Oracle統(tǒng)計(jì)信息(1)select num_rows, blocks, empty_blocks, avg_space, chain_cnt, avg_row_len from user_tables;

NUM_ROWS,--表中的記錄數(shù)

BLOCKS,--表中數(shù)據(jù)所占的數(shù)據(jù)塊數(shù)

EMPTY_BLOCKS,--表中的空塊數(shù)

AVG_SPACE,--數(shù)據(jù)塊中平均的使用空間

CHAIN_CNT,--表中行連接和行遷移的數(shù)量

AVG_ROW_LEN--每條記錄的平均長(zhǎng)度

索引列的統(tǒng)計(jì)信息

    包含索引的深度(B-Tree的級(jí)別),索引葉級(jí)的塊數(shù)量,集群因子(clustering_factor), 唯一值的個(gè)數(shù)。

select blevel, leaf_blocks, distinct_keys, avg_leaf_blocks_per_key,

Oracle統(tǒng)計(jì)信息(1)avg_data_blocks_per_key, clustering_factor from user_indexes;

BLEVEL, --索引的層數(shù)

LEAF_BLOCKS,--葉子結(jié)點(diǎn)的個(gè)數(shù)

DISTINCT_KEYS, --唯一值的個(gè)數(shù)

AVG_LEAF_BLOCKS_PER_KEY, --每個(gè)KEY的平均葉塊個(gè)數(shù)

AVG_DATA_BLOCKS_PER_KEY, --每個(gè)KEY的平均數(shù)據(jù)塊個(gè)數(shù)

CLUSTERING_FACTOR --群集因子

列的統(tǒng)計(jì)信息

    包含唯一的值個(gè)數(shù),列最大小值,密度(選擇率),數(shù)據(jù)分布(直方圖信息),NUll值個(gè)數(shù)

select num_distinct,low_value, high_value,

density, num_nulls, num_buckets, histogram from user_tab_columns;

NUM_DISTINCT, --唯一值的個(gè)數(shù)

LOW_VALUE, --列上的最小值

HIGH_VALUE, --列上的最大值

DENSITY, --選擇率因子(密度)

NUM_NULLS, --空值的個(gè)數(shù)

NUM_BUCKETS, --直方圖的BUCKET個(gè)數(shù)

HISTOGRAM--直方圖的類型

對(duì)于統(tǒng)計(jì)信息的搜集,談?wù)剛€(gè)人的幾點(diǎn)理解:

1.統(tǒng)計(jì)信息默認(rèn)是存放在數(shù)據(jù)字典表中的,也只有數(shù)據(jù)字典中的統(tǒng)計(jì)信息,才會(huì)影響到CBO。

2.DBMS_STATS 提供的CREATE_STAT_TABLE 過(guò)程,只是生成一個(gè)用戶自定義的特定格式的表,用來(lái)存放統(tǒng)計(jì)信息罷了,這個(gè)表中的統(tǒng)計(jì)信息是不會(huì)影響到統(tǒng)計(jì)信息的。

3.GATHER 系列過(guò)程中,如果指定stattab,statid,statown 參數(shù)(也可以不指定),則是搜集的統(tǒng)計(jì)信息除了更新到數(shù)據(jù)字典外,還在statown 用戶下的stattab 表中存放一份,標(biāo)示為 statid;

4.EXPORT和IMPORT 系列的過(guò)程中,stattab,statid,statown 參數(shù)不能為空,分別表示把數(shù)據(jù)字典中的當(dāng)前統(tǒng)計(jì)信息導(dǎo)出到用戶自定義的表中,以及把用戶表中的統(tǒng)計(jì)信息導(dǎo)入到數(shù)據(jù)字典中,很明顯可以看出,這里的導(dǎo)入操作和上面GATHER 操作會(huì)改變統(tǒng)計(jì)信息,可能會(huì)引起執(zhí)行執(zhí)行計(jì)劃的改變,因此要慎重操作。

5.每次統(tǒng)計(jì)信息搜集前,將舊的統(tǒng)計(jì)信息備份起來(lái)是很有必要的;特別是保留一份或多份系統(tǒng)在穩(wěn)定時(shí)期的統(tǒng)計(jì)信息也是很有必要的。

6.多長(zhǎng)時(shí)間搜集一次統(tǒng)計(jì)信息,對(duì)于統(tǒng)計(jì)信息如何備份和保留,搜集統(tǒng)計(jì)信息時(shí)如何選擇合適的采樣,并行,直方圖設(shè)置等都比較重要,需要設(shè)計(jì)一個(gè)較好的統(tǒng)計(jì)信息搜集策略。

3. 統(tǒng)計(jì)信息的收集以及常用數(shù)據(jù)字典

3.1 統(tǒng)計(jì)信息常用數(shù)據(jù)字典

統(tǒng)計(jì)信息收集如下數(shù)據(jù):

(1)表自身的分析: 包括表中的行數(shù),數(shù)據(jù)塊數(shù),行長(zhǎng)等信息。

(2)列的分析:包括列值的重復(fù)數(shù),列上的空值,數(shù)據(jù)在列上的分布情況。

(3)索引的分析: 包括索引葉塊的數(shù)量,索引的深度,索引的聚合因子等。

這些統(tǒng)計(jì)信息存放在以下的數(shù)據(jù)字典里:

DBA_TABLES

DBA_OBJECT_TABLES

DBA_TAB_STATISTICS

DBA_TAB_COL_STATISTICS

DBA_TAB_HISTOGRAMS

DBA_INDEXES

DBA_IND_STATISTICS

DBA_CLUSTERS

DBA_TAB_PARTITIONS

DBA_TAB_SUBPARTITIONS

DBA_IND_PARTITIONS

DBA_IND_SUBPARTITIONS

DBA_PART_COL_STATISTICS

DBA_PART_HISTOGRAMS

DBA_SUBPART_COL_STATISTICS

DBA_SUBPART_HISTOGRAMS

3.2 OLAP和OLTP的統(tǒng)計(jì)信息

    在OLTP系統(tǒng)中,一定要收集統(tǒng)計(jì)信息而且數(shù)據(jù)庫(kù)自帶的 JOB 一定要關(guān)閉并且要自己定制統(tǒng)計(jì)信息收集策略,這是因?yàn)镺LTP系統(tǒng)中數(shù)據(jù)變化頻繁,業(yè)務(wù)非常復(fù)雜 我舉個(gè)例子:本來(lái)估算返回1W行 那么導(dǎo)致 CBO 估算返回1行

    很多的 OLAP 系統(tǒng)都不收集,直接用HINT固定,因?yàn)镺LAP系統(tǒng)I/O壓力大,表也非常大,收集統(tǒng)計(jì)信息很耗費(fèi)資源并且OLAP系統(tǒng)表的數(shù)據(jù)隨時(shí)都在變化(因?yàn)閷?shí)時(shí)在入庫(kù)),那么就需要經(jīng)常收集統(tǒng)計(jì)信息,所以O(shè)LAP系統(tǒng)收集統(tǒng)計(jì)信息不現(xiàn)實(shí)。

4. 統(tǒng)計(jì)信息的動(dòng)態(tài)采樣

    在Oracle 10g以后,如果一個(gè)表沒(méi)有做分析,數(shù)據(jù)庫(kù)將自動(dòng)對(duì)它做動(dòng)態(tài)采樣分析,所以這里采用hint的方式將動(dòng)態(tài)采樣的級(jí)別設(shè)置為0,即不使用動(dòng)態(tài)采樣。

據(jù)不同的optimizer_dynamic_sampling級(jí)別而不同,他總共有10個(gè)級(jí)別,分別如下:

Level 0: Do not use dynamic sampling.

Level 1: The number of blocks sampled is the default number of dynamic sampling blocks (32).

Level 2: The number of blocks sampled is 2 times the default number of dynamic sampling blocks.

Level 3: The number of blocks sampled is 4 times the default number of dynamic sampling blocks.

Level 4: The number of blocks sampled is 8 times the default number of dynamic sampling blocks.

Level 5: The number of blocks sampled is 16 times the default number of dynamic sampling blocks.

Level 6: The number of blocks sampled is 32 times the default number of dynamic sampling blocks.

Level 7: The number of blocks sampled is 64 times the default number of dynamic sampling blocks.

Level 8: The number of blocks sampled is 128 times the default number of dynamic sampling blocks.

Level 9: The number of blocks sampled is 256 times the default number of dynamic sampling blocks.

Level 10: Read all blocks in the table

在一個(gè)系統(tǒng)中對(duì)臨時(shí)表收集統(tǒng)計(jì)信息使用動(dòng)態(tài)采樣的方法

select /*+dynamic_sampling(t 0) */ * from t where object_id>30;

http://www.cnblogs.com/kerrycode/p/3854971.html

實(shí)驗(yàn)

對(duì)于新創(chuàng)建的表,當(dāng)訪問(wèn)此表時(shí),oracle會(huì)動(dòng)態(tài)的收集這個(gè)表的相關(guān)信息,等到晚上10點(diǎn),再將其收集到數(shù)據(jù)字典中。

[html] view plain copy

  1. SQL> set autotrace off  
  2. SQL> set linesize 1000  
  3. SQL> drop table t_sample purge;  
  4. drop table t_sample purge  
  5.            *  
  6. ERROR at line 1:  
  7. ORA-00942: table or view does not exist  
  8.     
  9.     
  10. SQL> create table t_sample as select * from dba_objects;  
  11.     
  12. Table created.  
  13.     
  14. SQL> create index idx_t_sample_objid on t_sample(object_id);  
  15.     
  16. Index created.  

新建的表,查不到統(tǒng)計(jì)信息

[html] view plain copy

  1. SQL> select num_rows, blocks, last_analyzed from user_tables where table_name = 'T_SAMPLE';  
  2.     
  3.   NUM_ROWS     BLOCKS LAST_ANAL  
  4. ---------- ---------- ---------  


[html] view plain copy

  1. SQL> set autotrace traceonly  
  2. SQL> set linesize 1000  
  3. SQL> select  * from t_sample where object_id=20;  
  4.     
  5.     
  6. Execution Plan  
  7. ----------------------------------------------------------  
  8. Plan hash value: 1453182238  
  9.     
  10. --------------------------------------------------------------------------------------------------  
  11. | Id  | Operation                   | Name               | Rows  | Bytes | Cost (%CPU)| Time     |  
  12. --------------------------------------------------------------------------------------------------  
  13. |   0 | SELECT STATEMENT            |                    |     1 |   207 |     2   (0)| 00:00:01 |  
  14. |   1 |  TABLE ACCESS BY INDEX ROWID| T_SAMPLE           |     1 |   207 |     2   (0)| 00:00:01 |  
  15. |*  2 |   INDEX RANGE SCAN          | IDX_T_SAMPLE_OBJID |     1 |       |     1   (0)| 00:00:01 |  
  16. --------------------------------------------------------------------------------------------------  
  17.     
  18. Predicate Information (identified by operation id):  
  19. ---------------------------------------------------  
  20.     
  21.    2 - access("OBJECT_ID"=20)  
  22.     
  23. Note  
  24. -----  
  25.    - dynamic sampling used for this statement (level=2)  
  26.     
  27.     
  28. Statistics  
  29. ----------------------------------------------------------  
  30.          24  recursive calls  
  31.           0  db block gets  
  32.          93  consistent gets  
  33.           1  physical reads  
  34.           0  redo size  
  35.        1608  bytes sent via SQL*Net to client  
  36.         523  bytes received via SQL*Net from client  
  37.           2  SQL*Net roundtrips to/from client  
  38.           0  sorts (memory)  
  39.           0  sorts (disk)  
  40.           1  rows processed  

- dynamic sampling used for this statement (level=2)表示動(dòng)態(tài)采樣,但是不記錄數(shù)據(jù)字典,除非手動(dòng)收集表的統(tǒng)計(jì)信息。

[html] view plain copy

  1. SQL> select num_rows, blocks, last_analyzed from user_tables where table_name = 'T_SAMPLE';  
  2.     
  3.   NUM_ROWS     BLOCKS LAST_ANAL  
  4. ---------- ---------- ---------  
  5.     
  6.     
  7. SQL>   

文章標(biāo)題:Oracle統(tǒng)計(jì)信息(1)
網(wǎng)站鏈接:http://weahome.cn/article/iippec.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部