發(fā)布于:2021-02-21 00:00:51
0
784
0
在數(shù)據(jù)倉庫環(huán)境中,我們經(jīng)常遇到表被截斷,新數(shù)據(jù)(通常是數(shù)百萬行)被刪除的情況上膛了,但是當(dāng)報表運行在那些帶有新加載數(shù)據(jù)的表上時,除非我們?nèi)ナ占碌慕y(tǒng)計數(shù)據(jù),否則優(yōu)化器可能會選擇一個次優(yōu)的計劃。
因此,為了解決這個問題,Oracle Database 12c引入了在線統(tǒng)計數(shù)據(jù)收集,但這僅適用于那些通過CREATE TABLE AS SELECT語句以及使用APPEND提示的直接路徑插入加載數(shù)據(jù)的表。
Oracle Database 19c引入了實時統(tǒng)計,它將在線統(tǒng)計數(shù)據(jù)收集擴展到也包括常規(guī)的DML語句。
統(tǒng)計信息通常由在數(shù)據(jù)庫維護窗口中運行的自動統(tǒng)計信息收集作業(yè)收集,但這只是每天一次。
但是對于易失性表,在DBMS_STATS作業(yè)執(zhí)行之間,統(tǒng)計信息可能會過時,因此新的oracle19c實時統(tǒng)計信息功能可以幫助優(yōu)化器為此類易失性表生成更優(yōu)化的計劃。
大容量加載操作將收集所有必要的統(tǒng)計信息(在oracle19c之前的行為),但是實時統(tǒng)計信息將增強而不是取代傳統(tǒng)的統(tǒng)計信息。
我們有一個名為MYOBJECTS c的表,當(dāng)前有47974行。
SQL> select distinct object_type from myobjects_19c where owner='SYS';
OBJECT_TYPE
-----------------------
INDEX
CLUSTER
TABLE PARTITION
...
...
VIEW
JAVA RESOURCE
26 rows selected.
SQL> select * from table (dbms_xplan.display_cursor);
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL_ID 8rbtnvw2uw67f, child number 0
-------------------------------------
select distinct object_type from myobjects_19c where owner='SYS'
Plan hash value: 1625058500
------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 258 (100)| |
| 1 | HASH UNIQUE | | 26 | 364 | 258 (1)| 00:00:01 |
|* 2 | TABLE ACCESS FULL| MYOBJECTS_19C | 47974 | 655K| 257 (1)| 00:00:01 |
------------------------------------------------------------------------------------
我們現(xiàn)在在表中插入一些額外的行–基本上將表中的行數(shù)增加一倍。
在早期版本中,優(yōu)化器現(xiàn)在有可能選擇次優(yōu)計劃,因為它“不知道”表上發(fā)生了一些DML活動,現(xiàn)在表中的行數(shù)增加了兩倍。
但是現(xiàn)在在oracle19c中,我們可以看到,作為INSERT語句的一部分,優(yōu)化器的統(tǒng)計信息收集操作也被執(zhí)行了。
SQL> insert into myobjects_19c
select * from myobjects;
47974 rows created.
SQL> commit;
Commit complete.
SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(format=>'TYPICAL'));
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL_ID ahudb149n8f2f, child number 0
-------------------------------------
insert into myobjects_19c select * from myobjects
Plan hash value: 3078646338
--------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------------------------
| 0 | INSERT STATEMENT | | | | 273 (100)| |
| 1 | LOAD TABLE CONVENTIONAL | MYOBJECTS_19C | | | | |
| 2 | OPTIMIZER STATISTICS GATHERING | | 47974 | 11M| 273 (1)| 00:00:01 |
| 3 | TABLE ACCESS FULL | MYOBJECTS | 47974 | 11M| 273 (1)| 00:00:01 |
--------------------------------------------------------------------------------------------------
Note
-----
- dynamic statistics used: statistics for conventional DML
當(dāng)SQL語句發(fā)生硬解析時,我們可以看到優(yōu)化器檢測到表中添加了其他行。
這也在注釋部分指出:使用的動態(tài)統(tǒng)計信息:常規(guī)DML的統(tǒng)計信息。
SQL> EXEC DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO;
PL/SQL procedure successfully completed.
SQL> alter system flush shared_pool;
System altered.
SQL> select distinct object_type from myobjects_19c where owner='SYS';
OBJECT_TYPE
-----------------------
INDEX
CLUSTER
TABLE PARTITION
...
...
VIEW
JAVA RESOURCE
26 rows selected.
SQL> select * from table (dbms_xplan.display_cursor);
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL_ID 8rbtnvw2uw67f, child number 0
-------------------------------------
select distinct object_type from myobjects_19c where owner='SYS'
Plan hash value: 1625058500
------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 624 (100)| |
| 1 | HASH UNIQUE | | 26 | 2054 | 624 (1)| 00:00:01 |
|* 2 | TABLE ACCESS FULL| MYOBJECTS_19C | 95948 | 7402K| 621 (1)| 00:00:01 |
------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter("OWNER"='SYS')
Note
-----
- dynamic statistics used: statistics for conventional DML
實時統(tǒng)計信息以表示STATS_ON_CONVENTIONAL_DML在NOTES列中的* _TAB_STATISTICS和* _TAB_COL_STATISTICS意見。
SQL> SELECT NUM_ROWS, BLOCKS, NOTES FROM USER_TAB_STATISTICS WHERE TABLE_NAME = 'MYOBJECTS_19C' ; NUM_ROWS BLOCKS NOTES ---------- ---------- -------------------------------------------------- 47974 938 95948 2284 STATS_ON_CONVENTIONAL_DML