為准確生成執行計划更新統計信息-analyze與dbms_stats


如果我們想讓CBO利用合理利用數據的統計信息,正確判斷執行任何SQL查詢時的最快途徑,需要及時的使用analyze命令或者dbms_stats重新統計數據的統計信息.

例如索引跳躍式掃描(INDEX SKIP SCAN)例子中,如果不對表EMPLOYEE 及索引收集一下統計信息,就不是INDEX SKIP SCAN策略了。

在oracle 8i以前,主要是用ANALYZE命令。在ORACLE 8I以后,又引入了DBMS_STATS存儲包來進行分析。幸運的是從ORACLE 10G以后,分析工作變成自動的了,這減輕的DBA的負擔

分析統計信息

analyze table 一般可以指定分析: 表,所有字段,所有索引字段,所有索引。 若不指定則全部都分析。

---table統計信息
analyze table EMP compute statistics for table;

---column統計信息
analyze table EMP compute statistics for all columns;

---索引統計信息
analyze table EMP compute statistics for all indexes;

---索引列統計信息
analyze table EMP compute statistics for all indexed columns; 

---效果等於 analyze table tablename compute statistics for table for all indexes for all columns
analyze table tablename compute statistics

查看統計信息

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

SCOTT@PDBORCL> analyze table EMP compute statistics for table;
表已分析。

SCOTT@PDBORCL> analyze table EMP compute statistics for  all columns;
表已分析。

SCOTT@PDBORCL> analyze table EMP compute statistics for  all indexes;
表已分析。

SCOTT@PDBORCL> select table_name,num_rows from user_tables where table_name = 'EMP';
TABLE_NAME    NUM_ROWS
----------- -----------
  EMP            14

SCOTT@PDBORCL> select index_name,uniqueness  from user_indexes where table_name = 'EMP';
INDEX_NAME   UNIQUENES
--------    ---------
PK_EMP       UNIQUE

SCOTT@PDBORCL> select column_name,data_type  from user_tab_columns where table_name = 'EMP' ;

COLUMN_NAME   DATA_TYPE 
-------------------------
EMPNO        NUMBER
ENAME        VARCHAR2
JOB          VARCHAR2
MGR          NUMBER
HIREDATE     DATE
SAL          NUMBER
COMM         NUMBER
DEPTNO       NUMBER


已選擇 8 行。

SCOTT@PDBORCL> ^A

刪除統計信息

會刪除emp所有的statistics。

analyze table emp delete statistics

刪除只是某些列變為空,如emp表的行數為空了

SCOTT@PDBORCL> analyze table emp compute statistics;

表已分析。

SCOTT@PDBORCL> select table_name,num_rows from user_tables where table_name = 'EMP';

TABLE_NAME    NUM_ROWS
--------    ----------
EMP         14

SCOTT@PDBORCL> analyze table emp delete statistics;

表已分析。

SCOTT@PDBORCL> select table_name,num_rows from user_tables where table_name = 'EMP';

TABLE_NAME   NUM_ROWS
-------- ----------
EMP

SCOTT@PDBORCL>

dbms_stats

dbms_stats能良好地估計統計數據(尤其是針對較大的分區表),並能獲得更好的統計結果,最終制定出速度更快的SQL執行計划。

語法:

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 );

dbms_stats.delete_table_stats 用於刪除統計信息。

例子:

------刪除統計信息SCOTT@PDBORCL> exec dbms_stats.delete_table_stats (ownname => 'scott',tabname => 'emp');

PL/SQL 過程已成功完成。
----查詢統計信息
SCOTT@PDBORCL> select table_name,num_rows from user_tables where table_name = 'EMP';

TABLE_NAME NUM_ROWS
-------- ----------
EMP

---獲取統計信息SCOTT@PDBORCL> exec dbms_stats.gather_table_stats (ownname => 'scott',tabname => 'emp');

PL/SQL 過程已成功完成。
---重新查新統計信息
SCOTT@PDBORCL> select table_name,num_rows from user_tables where table_name = 'EMP';

TABLE_NAME  NUM_ROWS
-------- ----------
EMP          14

SCOTT@PDBORCL>

參考:

為准確生成執行計划更新統計信息-analyze

http://docs.oracle.com/database/121/TGSQL/tgsql_stats.htm#TGSQL389


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM