臨潭網站制作公司哪家好,找創新互聯公司!從網頁設計、網站建設、微信開發、APP開發、響應式網站開發等網站項目制作,到程序開發,運營維護。創新互聯公司于2013年開始到現在10年的時間,我們擁有了豐富的建站經驗和運維經驗,來保證我們的工作的順利進行。專注于網站建設就選創新互聯公司。
統計信息主要是描述數據庫中表,索引的大小,規模,數據分布狀況等的一類信息。比如,表的行數,塊數,平均每行的大小,索引的leaf blocks,索引字段的行數,不同值的大小等,都屬于統計信息。CBO正是根據這些統計信息數據,計算出不同訪問路徑下,不同join 方式下,各種計劃的成本,最后選擇出成本最小的計劃。
在CBO(基于代價的優化器模式)條件下,SQL語句的執行計劃由統計信息來決定,若沒有統計信息則會采取動態采樣的方式決定執行計劃!可以說統計信息關乎sql的執行計劃是否正確,屬于sql執行的指導思想,oracle的初始化參數statistics_level控制收集統計信息的級別,有三個參數值:
BASIC :---收集基本的統計信息
TYPICAL:--收集大部分統計信息(數據庫的默認設置)
ALL:--收集全部統計信息
Oracle 10g之后,Query Optimizer就已經將CBO作為默認優化器,并且Oracle官方不再支持RBO服務。但是,通過優化器參數optimizer_mode,我們可以控制Oracle優化器生成不同模式下的執行計劃。
1)Table statistics Number of rows --行數量 Number of blocks --block數量 Average row length --平均行的長度. |
2)Column statistics Number of distinct values (NDV) in column --列中distinct的值 Number of nulls in column --列中null的值 Data distribution (histogram) --數據分布 |
3)Index statistics Number of leaf blocks --子節點的塊數量 Levels --子節點數量 Clustering factor --集群因子 |
4)System statistics I/O performance and utilization --IO性能和利用率 CPU performance and utilization --CPU的性能和利用率 |
Oracle Statistic 的收集,可以使用analyze 命令,也可以使用DBMS_STATS 包來收集,Oracle 建議使用DBMS_STATS包來收集統計信息,因為DBMS_STATS包收集的更廣,并且更準確。analyze 在以后的版本中可能會被移除。
DBMS_STATS常用的幾個過程如下:
dbms_stats.gather_table_stats 收集表、列和索引的統計信息; dbms_stats.gather_schema_stats收集SCHEMA下所有對象的統計信息; dbms_stats.gather_index_stats收集索引的統計信息; dbms_stats.gather_system_stats收集系統統計信息 dbms_stats.GATHER_DICTIONARY_STATS:所有字典對象的統計; DBMS_STATS.GATHER_DICTIONARY_STATS其收集所有系統模式的統計 dbms_stats.delete_table_stats刪除表的統計信息 dbms_stats.delete_index_stats 刪除索引的統計信息 dbms_stats.export_table_stats輸出表的統計信息 dbms_stats.create_state_table dbms_stats.set_table_stats 設置表的統計 dbms_stats.auto_sample_size |
analyze 命令的語法如下:
analyze table tablename compute statistics; analyze table tablename compute statistics for all indexes; analyze table tablename delete statistics; |
Oracle 的Statistic 信息的收集分兩種:自動收集和手工收集。
自動收集的工作原理
Oracle 的Automatic Statistics Gathering 是通過Scheduler 來實現收集和維護的。Job 名稱是GATHER_STATS_JOB, 該Job收集數據庫所有對象的2種統計信息:
(1)Missing statistics(統計信息缺失)
(2)Stale statistics(統計信息陳舊)
該Job 是在數據庫創建的時候自動創建,并由Scheduler來管理。Scheduler 在maintenance windows open時運行gather job。 默認情況下,11g在周一到周五(晚22:00-次日2:00),通過一個job(gather_stat_job)自動收集對象的統計信息。這種自動收集統計信息的方式并不是收集所有對象的統計信息,而是收集沒有統計信息的對象和統計信息過舊的對象。然后確定優先級,再開始進行統計信息。
Scheduler Job的stop_on_window_close 屬性控制GATHER_STATS_JOB 是否繼續。該屬性默認值為True.如果該值設置為False,那么GATHER_STATS_JOB 會中斷, 而沒有收集完的對象將在下次啟動時繼續收集。
gather_stats_job 調用dbms_stats.gather_database_stats_job_proc過程來收集statistics 的信息。 該過程收集對象statistics的條件如下:
(1)對象的統計信息之前沒有收集過。
(2)當對象有超過10%的rows 被修改,此時對象的統計信息也稱為stale statistics。
但是對于高度變化的表在白天的活動期間被TRUNCATE/DROP并重建或者塊加載超過本身總大小10%的對象;我們可以將這些表上的統計設置為NULL
可以通過以下SQL來查看job:
select job_name, program_name, enabled, stop_on_window_close from dba_scheduler_jobs where job_name = 'gather_stats_job'; |
控制自動收集統計信息的參數:STATISTICS_LEVEL
為了決定是否對對象進行監控,Oracle提供了一個參數STATISTICS_LEVEL。通過設置初始化參數STATISTIC_LEVEL
(1)ASH(Active Session History)
(2)ASSM(Automatic Shared Memory Management)
(3)AWR(Automatic Workload Repository)
(4)ADDM(Automatic Database Diagnostic Monitor)
自動收集統計信息的過程講解
當啟動對象的監控后,從上次統計信息收集之后的的信息,如inserts,updates,deletes等,這些改變的信息會記錄到user_tab_modifications視圖。
當對象的數據發生改變之后,經過幾分鐘的延時,這些信息寫入user_tab_modifications視圖,然后dbms_stats.flush_database_monitoring_info過程就會發現這些信息,并將這些信息保存在內存中。
當監控的對象被修改的部分10%時,gather_database_stats 或者gather_schema_stats 過程就會去收集這些stale statistics。
查看自動收集統計信息
select client_name,status from dba_autotask_client;
exec DBMS_AUTO_TASK_ADMIN.DISABLE(client_name => 'auto optimizer stats collection',operation => NULL,window_name => NULL);
再次查看
啟用自動收集統計信息的任務
exec DBMS_AUTO_TASK_ADMIN.ENABLE(client_name => 'auto optimizer stats collection',operation => NULL,window_name => NULL);
獲得當前自動收集統計信息的執行時間
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';
下面對上圖的參數講解
FREQ關鍵字用來指定間隔的時間周期,可選參數有:YEARLY(年), MONTHLY(月), WEEKLY(周), DAILY(日), HOURLY(時), MINUTELY(分), SECONDLY(秒)等單位。 INTERVAL關鍵字用來指定間隔的頻繁,可指定的值的范圍從1-999。 BYHOUR指定一天中的小時??芍付ǖ闹档姆秶鷱?-24。16,17,18就表示每天下午的4、5、6點。 BYDAY關鍵字用來指定每周的哪天運行。 BYMONTHDAY關鍵字用來指定每月中的哪一天。-1表示每月最后一天。 BYMONTH關鍵字用來指定每年的月份。 BYDATE指定日期。0310就表示3月10日。 https://blog.csdn.net/zq9017197/article/details/6985109 --WINDOW_NAME:任務名 --REPEAT_INTERVAL:任務重復間隔時間 --DURATION:持續時間 --enabled為true表明當前的這些作業處于激活狀態 |
SELECT * FROM dba_autotask_client_history
WHERE client_name LIKE '%stats%';
-維護窗口組 select * from dba_scheduler_window_groups; --維護窗口組對應窗口 select * from dba_scheduler_wingroup_members --維護窗口歷史信息 select* from dba_scheduler_windows --查詢自動收集任務正在執行的job select * from DBA_AUTOTASK_CLIENT_JOB; --查詢自動收集任務歷史執行狀態 select * from DBA_AUTOTASK_JOB_HISTORY; select * from DBA_AUTOTASK_CLIENT_HISTORY; |
修改統計信息執行的時間
1.關閉單個調度時間窗口,這里我們關閉MONDAY_WINDOW BEGIN DBMS_AUTO_TASK_ADMIN.disable ( client_name => 'auto optimizer stats collection', operation => NULL, window_name => 'MONDAY_WINDOW'); END; / --驗證關閉情況,如下,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;
2.開啟單個調度時間窗口及所有時間調度窗口,只需要使用enable過程 --注:單個應指定窗口名字,如window_name => 'MONDAY_WINDOW' BEGIN DBMS_AUTO_TASK_ADMIN.enable ( client_name => 'auto optimizer stats collection', operation => NULL, window_name => 'MONDAY_WINDOW'); END; / --1.停止任務 BEGIN DBMS_SCHEDULER.DISABLE( name=>'"SYS"."MONDAY_WINDOW"', force=>TRUE); END; / 使用如下腳本驗證是否停止 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.修改任務的持續時間,單位是分鐘 BEGIN DBMS_SCHEDULER.SET_ATTRIBUTE( name=>'"SYS"."FRIDAY_WINDOW"', attribute=>'DURATION', value=>numtodsinterval(180, 'minute')); END; /
--3.開始執行時間,BYHOUR=2,表示2點開始執行 BEGIN DBMS_SCHEDULER.SET_ATTRIBUTE( name=>'"SYS"."FRIDAY_WINDOW"', attribute=>'REPEAT_INTERVAL', value=>'FREQ=WEEKLY;BYDAY=MON;BYHOUR=2;BYMINUTE=0;BYSECOND=0'); END; /
--4.開啟任務 BEGIN DBMS_SCHEDULER.ENABLE( name=>'"SYS"."MONDAY_WINDOW"'); END; / |
修改時間窗口到特定的時間
修改時間窗口到特定的時間 --如下示例,將周五時間窗口時間到晚間23點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; --驗證修改 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、新增維護時間窗口 -- 假定我們要處理的是修改周一的時間窗口 -- 首先關閉周一的時間窗口 BEGIN DBMS_AUTO_TASK_ADMIN.disable ( client_name => 'auto optimizer stats collection', operation => NULL, window_name => 'MONDAY_WINDOW'); END; / --接下來創建一個窗口并設定時間調度間隔 --如下,每周一5點執行,持續時間為1小時 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 --接下來將窗口STATS_WINDOW添加到維護窗口組 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 --當前被disabled |
關閉自動統計信息命令,exec DBMS_SCHEDULER.DISABLE('GATHER_STATS_JOB');
啟用自動統計信息命令,exec DBMS_SCHEDULER.ENABLE('GATHER_STATS_JOB');
查看自動統計信息是否開啟,
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';
包含表行數,使用的塊數,空的塊數,塊的使用率,行遷移和鏈接的數量,pctfree,pctused的數據,行的平均大?。?/p>
select num_rows, blocks, empty_blocks, avg_space, chain_cnt, avg_row_len from user_tables; |
NUM_ROWS,--表中的記錄數 BLOCKS,--表中數據所占的數據塊數 EMPTY_BLOCKS,--表中的空塊數 AVG_SPACE,--數據塊中平均的使用空間 CHAIN_CNT,--表中行連接和行遷移的數量 AVG_ROW_LEN--每條記錄的平均長度 |
包含索引的深度(B-Tree的級別),索引葉級的塊數量,集群因子(clustering_factor), 唯一值的個數。
select blevel, leaf_blocks, distinct_keys, avg_leaf_blocks_per_key, avg_data_blocks_per_key, clustering_factor from user_indexes; |
BLEVEL, --索引的層數 LEAF_BLOCKS,--葉子結點的個數 DISTINCT_KEYS, --唯一值的個數 AVG_LEAF_BLOCKS_PER_KEY, --每個KEY的平均葉塊個數 AVG_DATA_BLOCKS_PER_KEY, --每個KEY的平均數據塊個數 CLUSTERING_FACTOR --群集因子 |
包含唯一的值個數,列最大小值,密度(選擇率),數據分布(直方圖信息),NUll值個數
select num_distinct,low_value, high_value, density, num_nulls, num_buckets, histogram from user_tab_columns; |
NUM_DISTINCT, --唯一值的個數 LOW_VALUE, --列上的最小值 HIGH_VALUE, --列上的最大值 DENSITY, --選擇率因子(密度) NUM_NULLS, --空值的個數 NUM_BUCKETS, --直方圖的BUCKET個數 HISTOGRAM--直方圖的類型 |
對于統計信息的搜集,談談個人的幾點理解:
1.統計信息默認是存放在數據字典表中的,也只有數據字典中的統計信息,才會影響到CBO。
2.DBMS_STATS 提供的CREATE_STAT_TABLE 過程,只是生成一個用戶自定義的特定格式的表,用來存放統計信息罷了,這個表中的統計信息是不會影響到統計信息的。
3.GATHER 系列過程中,如果指定stattab,statid,statown 參數(也可以不指定),則是搜集的統計信息除了更新到數據字典外,還在statown 用戶下的stattab 表中存放一份,標示為 statid;
4.EXPORT和IMPORT 系列的過程中,stattab,statid,statown 參數不能為空,分別表示把數據字典中的當前統計信息導出到用戶自定義的表中,以及把用戶表中的統計信息導入到數據字典中,很明顯可以看出,這里的導入操作和上面GATHER 操作會改變統計信息,可能會引起執行執行計劃的改變,因此要慎重操作。
5.每次統計信息搜集前,將舊的統計信息備份起來是很有必要的;特別是保留一份或多份系統在穩定時期的統計信息也是很有必要的。
6.多長時間搜集一次統計信息,對于統計信息如何備份和保留,搜集統計信息時如何選擇合適的采樣,并行,直方圖設置等都比較重要,需要設計一個較好的統計信息搜集策略。
統計信息收集如下數據:
(1)表自身的分析: 包括表中的行數,數據塊數,行長等信息。
(2)列的分析:包括列值的重復數,列上的空值,數據在列上的分布情況。
(3)索引的分析: 包括索引葉塊的數量,索引的深度,索引的聚合因子等。
這些統計信息存放在以下的數據字典里:
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 |
在OLTP系統中,一定要收集統計信息而且數據庫自帶的 JOB 一定要關閉并且要自己定制統計信息收集策略,這是因為OLTP系統中數據變化頻繁,業務非常復雜 我舉個例子:本來估算返回1W行 那么導致 CBO 估算返回1行
很多的 OLAP 系統都不收集,直接用HINT固定,因為OLAP系統I/O壓力大,表也非常大,收集統計信息很耗費資源并且OLAP系統表的數據隨時都在變化(因為實時在入庫),那么就需要經常收集統計信息,所以OLAP系統收集統計信息不現實。
在Oracle 10g以后,如果一個表沒有做分析,數據庫將自動對它做動態采樣分析,所以這里采用hint的方式將動態采樣的級別設置為0,即不使用動態采樣。
據不同的optimizer_dynamic_sampling級別而不同,他總共有10個級別,分別如下:
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 |
在一個系統中對臨時表收集統計信息使用動態采樣的方法
select /*+dynamic_sampling(t 0) */ * from t where object_id>30;
http://www.cnblogs.com/kerrycode/p/3854971.html
實驗
對于新創建的表,當訪問此表時,oracle會動態的收集這個表的相關信息,等到晚上10點,再將其收集到數據字典中。 [html] view plain copy
新建的表,查不到統計信息 [html] view plain copy
[html] view plain copy
- dynamic sampling used for this statement (level=2)表示動態采樣,但是不記錄數據字典,除非手動收集表的統計信息。 [html] view plain copy
|
分享題目:Oracle統計信息(1)
網頁網址:http://vcdvsql.cn/article42/iippec.html
成都網站建設公司_創新互聯,為您提供服務器托管、商城網站、網站設計公司、關鍵詞優化、搜索引擎優化、云服務器
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯