
运维数据库时,可能会遇到以下两类问题:
问题一:
查询语句,谓词有单个列,优化器预估Cardinality基数相对准确,谓词有多个列时,优化器预估Cardinality基数不准确,从而导致无法生成最优的执行计划。
问题二:
谓词列引用了函数,导致优化器无法正确预估列真实使用情况,如果不创建函数索引,是否还有其他方法提高准确度?
以上两个问题,有时可以通过添加Extended Statistics扩展统计信息来解决。
Extended Statistics:
1.Column Group Statistics
当查询的WHERE子句指定单个表中的多个列(多个单列谓词)时,列之间的关系会强烈影响列组的组合选择性。
2.Expression Statistics
当一个函数应用于查询的WHERE子句中的列(function(col1)=constant)时,优化器无法知道该函数如何影响列的选择性。
通过收集表达式函数(col1)的expression statistics,优化器可以获得更准确的选择性值。

测试过程如下:
创建测试表calendar,包含四个列,分别为月、日、星期、星座。
create table calendar(month_name int,day_name int,week_name int,star_sign varchar(10));insert into calendar values(1,1,1,'摩羯座');insert into calendar values(1,2,2,'摩羯座');insert into calendar values(1,20,6,'摩羯座');insert into calendar values(2,22,4,'水瓶座');insert into calendar values(3,6,3,'双鱼座');insert into calendar values(4,9,2,'白羊座');insert into calendar values(5,12,7,'金牛座');insert into calendar values(6,3,1,'双子座');insert into calendar values(7,11,4,'巨蟹座');insert into calendar values(8,5,1,'狮子座');insert into calendar values(9,7,2,'处女座');insert into calendar values(10,8,3,'天秤座');insert into calendar values(11,15,5,'天蝎座');insert into calendar values(12,1,5,'射手座');insert into calendar values(12,5,4,'射手座');......COMMIT;
insert into calendar select * from calendar;//...commit;
表数据量
SQL> select count(*) from calendar;COUNT(*)----------368640
查看数据分布
set pagesize 100;select month_name,day_name,week_name,star_sign from calendar group by month_name,day_name,week_name,star_sign order by 1,2,3,4;MONTH_NAME DAY_NAME WEEK_NAME STAR_SIGN COUNT(*)---------- ---------- ---------- ---------- ----------1 1 1 摩羯座 81921 1 2 摩羯座 81921 2 2 摩羯座 81921 4 1 摩羯座 81921 9 2 摩羯座 81921 13 6 摩羯座 81921 16 6 摩羯座 81921 18 1 摩羯座 81921 20 6 摩羯座 81922 10 4 水瓶座 81922 20 4 水瓶座 81922 22 4 水瓶座 81923 3 3 双鱼座 81923 6 3 双鱼座 81923 7 3 双鱼座 81924 3 2 白羊座 81924 9 2 白羊座 81924 12 2 白羊座 81925 5 7 金牛座 81925 12 7 金牛座 81925 13 7 金牛座 81926 3 1 双子座 81926 5 1 双子座 81926 7 1 双子座 81927 7 4 巨蟹座 81927 11 4 巨蟹座 81927 16 4 巨蟹座 81928 5 1 狮子座 81928 6 1 狮子座 81928 8 1 狮子座 81929 7 2 处女座 81929 8 2 处女座 81929 9 2 处女座 819210 8 3 天秤座 819210 10 3 天秤座 819210 21 3 天秤座 819211 11 5 天蝎座 819211 15 5 天蝎座 819211 19 5 天蝎座 819212 1 5 射手座 819212 5 4 射手座 819212 5 5 射手座 819212 6 4 射手座 819212 10 4 射手座 819212 12 5 射手座 819245 rows selected.
收集表统计信息
---EXEC DBMS_STATS.GATHER_TABLE_STATS(ownname => 'cjc',tabname => 'calendar',estimate_percent=>100,CASCADE=> TRUE,no_invalidate=> FALSE);---EXEC DBMS_STATS.GATHER_TABLE_STATS(ownname => 'cjc',tabname => 'calendar',estimate_percent=>100,method_opt=> 'FOR ALL INDEXED COLUMNS',CASCADE=> TRUE,no_invalidate=> FALSE);---EXEC DBMS_STATS.GATHER_TABLE_STATS(ownname => 'cjc',tabname => 'calendar',estimate_percent=>100,method_opt=> 'FOR ALL COLUMNS',CASCADE=> TRUE,no_invalidate=> FALSE);EXEC DBMS_STATS.GATHER_TABLE_STATS(ownname => 'cjc',tabname => 'calendar',estimate_percent=>100,method_opt => 'for all columns size 1',CASCADE=> TRUE,no_invalidate=> FALSE);
参数说明:
1.收集cjc用户下calendar表统计信息2.estimate_percent收集数据百分比3.method_opt直方图4.CASCADE级联收集索引统计信息5.no_invalidate为false表示立即将在Shared Pool中有依赖关系的shared cursor失效
查看表统计信息
set line 300col OWNER for a15;col TABLE_NAME for a15;select OWNER,TABLE_NAME,NUM_ROWS,BLOCKS,TO_CHAR(LAST_ANALYZED,'YYYYMMDD HH24:MI:SS') LAST_ANALYZED from DBA_TABLES where table_name='CALENDAR';OWNERTABLE_NAME NUM_ROWS BLOCKS LAST_ANALYZED--------------- --------------- ---------- ---------- -----------------CJCCALENDAR 368640 1252 20240203 19:19:37
查看列统计信息
set line 300col OWNER for a15;col TABLE_NAME for a15col COLUMN_NAME for a15col LOW_VALUE for a10col HIGH_VALUE for a10select OWNER,TABLE_NAME,COLUMN_NAME,NUM_DISTINCT,NUM_NULLS,TO_CHAR(LAST_ANALYZED,'YYYYMMDD HH24:MI:SS') LAST_ANALYZED from DBA_TAB_COL_STATISTICS where table_name='CALENDAR';OWNERTABLE_NAMECOLUMN_NAMENUM_DISTINCT NUM_NULLS LAST_ANALYZED--------------- --------------- --------------- ------------ ---------- -----------------CJC CALENDARSTAR_SIGN 12 0 20240203 19:19:38CJC CALENDARWEEK_NAME 7 0 20240203 19:19:38CJC CALENDARDAY_NAME 20 0 20240203 19:19:38CJC CALENDARMONTH_NAME 12 0 20240203 19:19:38

场景一:
当查询的WHERE子句指定单个表中的多个列(多个单列谓词)时,列之间的关系会强烈影响列组的组合选择性。
查询
SELECT /*+gather_plan_statistics*/ COUNT(*) FROM CALENDAR WHERE MONTH_NAME=10 AND STAR_SIGN='天秤座';COUNT(*)----------24576
查看执行计划
select * from table(DBMS_XPLAN.DISPLAY_CURSOR(FORMAT=>'ALLSTATS LAST'));-----------------------------------------------------------------------------------------| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers |-----------------------------------------------------------------------------------------| 0 | SELECT STATEMENT | | 1 || 1 |00:00:00.01 | 1256 || 1 | SORT AGGREGATE | | 1 | 1 | 1 |00:00:00.01 | 1256 ||* 2 | TABLE ACCESS FULL| CALENDAR | 1 | 2560 | 24576 |00:00:00.01 | 1256 |-----------------------------------------------------------------------------------------Predicate Information (identified by operation id):---------------------------------------------------2 - filter(("MONTH_NAME"=10 AND "STAR_SIGN"='天秤座'))20 rows selected.
其中,预估 Cardinality 值 E-Rows =2560;
因为通过统计信息数据可以看到,表总行数NUM_ROWS=368640,MONTH_NAME 列 NUM_DISTINCT=12,STAR_SIGN列 NUM_DISTINCT=12。
所以预估查询语句返回行数=368640/12/12=2560
结合10053看一下:
分别执行10053
alter session set tracefile_identifier='AA10053';alter session set events '10053 trace name context forever ,level 1';SELECT COUNT(*) FROM CALENDAR WHERE MONTH_NAME=10 AND STAR_SIGN='天秤座';alter session set events '10053 trace name context off';
查看,10053 trc文件, Card: 2560.00
vi cjc_ora_21149_AA10053.trc......***************************************BASE STATISTICAL INFORMATION***********************Table Stats::Table: CALENDAR Alias: CALENDAR#Rows: 368640 #Blks: 1252 AvgRowLen: 19.00 ChainCnt: 0.00Access path analysis for CALENDAR***************************************SINGLE TABLE ACCESS PATHSingle Table Cardinality Estimation for CALENDAR[CALENDAR]Column (#1): MONTH_NAME(AvgLen: 3 NDV: 12 Nulls: 0 Density: 0.083333 Min: 1 Max: 12Column (#4): STAR_SIGN(AvgLen: 10 NDV: 12 Nulls: 0 Density: 0.083333Table: CALENDAR Alias: CALENDARCard: Original: 368640.000000 Rounded: 2560 Computed: 2560.00 Non Adjusted: 2560.00Access Path: TableScanCost: 343.88 Resp: 343.88 Degree: 0Cost_io: 341.00 Cost_cpu: 106298443Resp_io: 341.00 Resp_cpu: 106298443Best:: AccessPath: TableScanCost: 343.88 Degree: 1 Resp: 343.88 Card: 2560.00 Bytes: 0***************************************
但是由于谓词的两个列MONTH_NAME=10 AND STAR_SIGN='天秤座'是有关联的,我们知道,天秤座主要集中在10月份(9月24日~10月23日),MONTH_NAME=10筛选出来的数据有很大一部分符合 STAR_SIGN='天秤座',所以按照ROW_NUM/NDV1/NDV2得出评估值2560远小于实际 Cardinality 值 A-Rows=24576;
如何提高预估Cardinality准确度?
添加Column Group Statistics:
DECLAREcg_name VARCHAR2(30);BEGINcg_name := DBMS_STATS.CREATE_EXTENDED_STATS(null,'CALENDAR','(MONTH_NAME,STAR_SIGN)');END;/
收集表统计信息
EXEC DBMS_STATS.GATHER_TABLE_STATS(ownname => 'cjc',tabname => 'calendar',estimate_percent=>100,method_opt => 'for all columns size 1',CASCADE=> TRUE,no_invalidate=> FALSE);
查看增强统计信息
SELECT EXTENSION_NAME, EXTENSION FROM USER_STAT_EXTENSIONS WHERE TABLE_NAME='CALENDAR';EXTENSION_NAME EXTENSION------------------------------ --------------------------------------------------------------------------------SYS_STUJAZ#M82V9AIVJF$ZMSI#RN$ ("MONTH_NAME","STAR_SIGN")
自动将"MONTH_NAME","STAR_SIGN"组合合并成一个虚拟列
col COL_GROUP for a30;SELECT e.EXTENSION col_group, t.NUM_DISTINCT, t.HISTOGRAMFROM USER_STAT_EXTENSIONS e, USER_TAB_COL_STATISTICS tWHERE e.EXTENSION_NAME=t.COLUMN_NAMEAND e.TABLE_NAME=t.TABLE_NAMEAND t.TABLE_NAME='CALENDAR';COL_GROUP NUM_DISTINCT HISTOGRAM------------------------------ ------------ ---------------("MONTH_NAME","STAR_SIGN") 12 NONE
col COLUMN_NAME for a30;SELECT TABLE_NAME,COLUMN_NAME,NUM_DISTINCT as NDV FROM USER_TAB_COL_STATISTICS ORDER BY 1,2;TABLE_NAMECOLUMN_NAME NDV--------------- ------------------------------ ----------CALENDARDAY_NAME 20CALENDARMONTH_NAME 12CALENDARSTAR_SIGN 12CALENDARSYS_STUJAZ#M82V9AIVJF$ZMSI#RN$ 12CALENDARWEEK_NAME7
再次查看执行计划
SELECT /*+gather_plan_statistics*/ COUNT(*) FROM CALENDAR WHERE MONTH_NAME=10 AND STAR_SIGN='天秤座';COUNT(*)----------24576
查看执行计划
select * from table(DBMS_XPLAN.DISPLAY_CURSOR(FORMAT=>'ALLSTATS LAST'));-----------------------------------------------------------------------------------------| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers |-----------------------------------------------------------------------------------------| 0 | SELECT STATEMENT | | 1 || 1 |00:00:00.02 | 1256 || 1 | SORT AGGREGATE | | 1 | 1 | 1 |00:00:00.02 | 1256 ||* 2 | TABLE ACCESS FULL| CALENDAR | 1 | 30720 | 24576 |00:00:00.07 | 1256 |-----------------------------------------------------------------------------------------Predicate Information (identified by operation id):---------------------------------------------------2 - filter(("MONTH_NAME"=10 AND "STAR_SIGN"='天秤座'))20 rows selected.
预估 Cardinality 值 E-Rows =30720;
通过统计信息数据可以看到,表总行数NUM_ROWS=368640,SYS_STUJAZ#M82V9AIVJF$ZMSI#RN$虚拟列 NUM_DISTINCT=12。
所以预估查询语句返回行数=368640/12=30720
查看数据分布
SQL> SELECT MONTH_NAME,STAR_SIGN,COUNT(*) FROM CALENDAR GROUP BY MONTH_NAME,STAR_SIGN ORDER BY 1,2;MONTH_NAME STAR_SIGNCOUNT(*)---------- ---------- ----------1 摩羯座 737282 水瓶座 245763 双鱼座 245764 白羊座 245765 金牛座 245766 双子座 245767 巨蟹座 245768 狮子座 245769 处女座 2457610 天秤座 2457611 天蝎座 2457612 射手座 4915212 rows selected.
由于数据分布不均,导致E-Rows不等于A-Rows,但和没使用增强统计信息相比,数据更准确了,再看下10053。
执行10053
alter session set tracefile_identifier='BB10053';alter session set events '10053 trace name context forever ,level 1';SELECT COUNT(*) FROM CALENDAR WHERE MONTH_NAME=10 AND STAR_SIGN='天秤座';alter session set events '10053 trace name context off';
查看,10053 trc文件, Card: 30720
vi cjc_ora_21149_BB10053.trc***************************************BASE STATISTICAL INFORMATION***********************Table Stats::Table: CALENDAR Alias: CALENDAR#Rows: 368640 #Blks: 1252 AvgRowLen: 31.00 ChainCnt: 0.00Access path analysis for CALENDAR***************************************SINGLE TABLE ACCESS PATHSingle Table Cardinality Estimation for CALENDAR[CALENDAR]Column (#1): MONTH_NAME(AvgLen: 3 NDV: 12 Nulls: 0 Density: 0.083333 Min: 1 Max: 12Column (#4): STAR_SIGN(AvgLen: 10 NDV: 12 Nulls: 0 Density: 0.083333Column (#5): SYS_STUJAZ#M82V9AIVJF$ZMSI#RN$(AvgLen: 12 NDV: 12 Nulls: 0 Density: 0.083333ColGroup (#1, VC) SYS_STUJAZ#M82V9AIVJF$ZMSI#RN$Col#: 1 4 CorStregth: 12.00ColGroup Usage:: PredCnt: 2 Matches Full: #1 Partial: Sel: 0.0833Table: CALENDAR Alias: CALENDARCard: Original: 368640.000000 Rounded: 30720 Computed: 30720.00 Non Adjusted: 30720.00Access Path: TableScanCost: 343.88 Resp: 343.88 Degree: 0Cost_io: 341.00 Cost_cpu: 106298443Resp_io: 341.00 Resp_cpu: 106298443Best:: AccessPath: TableScanCost: 343.88 Degree: 1 Resp: 343.88 Card: 30720.00 Bytes: 0***************************************

场景二:
谓词列引用了函数,导致优化器无法正确预估列真实使用情况,如果不创建函数索引,是否还有其他方法提高准确度?
先看没有使用函数的查询语句执行计划
SELECT /*+gather_plan_statistics*/ COUNT(*) FROM CALENDAR WHERE STAR_SIGN='天秤座';COUNT(*)----------24576
查看执行计划
select * from table(DBMS_XPLAN.DISPLAY_CURSOR(FORMAT=>'ALLSTATS LAST'));-----------------------------------------------------------------------------------------| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers |-----------------------------------------------------------------------------------------| 0 | SELECT STATEMENT | | 1 || 1 |00:00:00.02 | 1256 || 1 | SORT AGGREGATE | | 1 | 1 | 1 |00:00:00.02 | 1256 ||* 2 | TABLE ACCESS FULL| CALENDAR | 1 | 30720 | 24576 |00:00:00.01 | 1256 |-----------------------------------------------------------------------------------------Predicate Information (identified by operation id):---------------------------------------------------2 - filter("STAR_SIGN"='天秤座'
可以看到E-Rows和A-Rows相差不大,其中E-Rows 是通过表总行数NUM_ROWS=368640 除以 STAR_SIGN NDV=12得到的;
E-Rows:368640/12=30720
使用函数
SELECT /*+gather_plan_statistics*/ COUNT(*) FROM CALENDAR WHERE UPPER(STAR_SIGN)='天秤座';COUNT(*)----------24576
查看执行计划
select * from table(DBMS_XPLAN.DISPLAY_CURSOR(FORMAT=>'ALLSTATS LAST'));-----------------------------------------------------------------------------------------| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers |-----------------------------------------------------------------------------------------| 0 | SELECT STATEMENT | | 1 || 1 |00:00:00.07 | 1256 || 1 | SORT AGGREGATE | | 1 | 1 | 1 |00:00:00.07 | 1256 ||* 2 | TABLE ACCESS FULL| CALENDAR | 1 | 3686 | 24576 |00:00:00.05 | 1256 |-----------------------------------------------------------------------------------------Predicate Information (identified by operation id):---------------------------------------------------2 - filter(UPPER("STAR_SIGN")='天秤座')
当列上有函数时,优化器默认无法知道函数对列的影响,统一认为返回1%的数据,所以预估基数为3686,和真实数据相差较大。
E-Rows:368640*0.01=3686
通过10053看下执行计划
alter session set tracefile_identifier='CC10053';alter session set events '10053 trace name context forever ,level 1';SELECT COUNT(*) FROM CALENDAR WHERE UPPER(STAR_SIGN)='天秤座';alter session set events '10053 trace name context off';
查看:
vi cjc_ora_21149_CC10053.trc***************************************BASE STATISTICAL INFORMATION***********************Table Stats::Table: CALENDAR Alias: CALENDAR#Rows: 368640 #Blks: 1252 AvgRowLen: 31.00 ChainCnt: 0.00Access path analysis for CALENDAR***************************************SINGLE TABLE ACCESS PATHSingle Table Cardinality Estimation for CALENDAR[CALENDAR]Table: CALENDAR Alias: CALENDARCard: Original: 368640.000000 Rounded: 3686 Computed: 3686.40 Non Adjusted: 3686.40Access Path: TableScanCost: 344.84 Resp: 344.84 Degree: 0Cost_io: 341.00 Cost_cpu: 141626443Resp_io: 341.00 Resp_cpu: 141626443Best:: AccessPath: TableScanCost: 344.84 Degree: 1 Resp: 344.84 Card: 3686.40 Bytes: 0***************************************
如果不创建函数索引,是否还有其他方法提高准确度?
添加增强统计信息,Expression Statistics
EXEC DBMS_STATS.GATHER_TABLE_STATS(null,'CALENDAR', method_opt =>'FOR ALL COLUMNS SIZE SKEWONLY FOR COLUMNS (UPPER(STAR_SIGN))');
收集表统计信息
EXEC DBMS_STATS.GATHER_TABLE_STATS(ownname => 'cjc',tabname => 'calendar',estimate_percent=>100,method_opt => 'for all columns size 1',CASCADE=> TRUE,no_invalidate=> FALSE);
查看增强统计信息
SELECT EXTENSION_NAME, EXTENSION FROM USER_STAT_EXTENSIONS WHERE TABLE_NAME='CALENDAR';EXTENSION_NAME EXTENSION------------------------------ ---------------------------------------------------SYS_STUJAZ#M82V9AIVJF$ZMSI#RN$ ("MONTH_NAME","STAR_SIGN")SYS_STU3YNUSG336CSVO605Z94BBZS (UPPER("STAR_SIGN")
自动为UPPER("STAR_SIGN")创建了一个虚拟列
col COL_GROUP for a30;SELECT e.EXTENSION col_group, t.NUM_DISTINCT, t.HISTOGRAMFROM USER_STAT_EXTENSIONS e, USER_TAB_COL_STATISTICS tWHERE e.EXTENSION_NAME=t.COLUMN_NAMEAND e.TABLE_NAME=t.TABLE_NAMEAND t.TABLE_NAME='CALENDAR';COL_GROUP NUM_DISTINCT HISTOGRAM------------------------------ ------------ ---------------("MONTH_NAME","STAR_SIGN") 12 NONE(UPPER("STAR_SIGN")) 12 NONE
查看NDV
col COLUMN_NAME for a30;SELECT TABLE_NAME,COLUMN_NAME,NUM_DISTINCT as NDV FROM USER_TAB_COL_STATISTICS ORDER BY 1,2;TABLE_NAMECOLUMN_NAME NDV--------------- ------------------------------ ----------CALENDARDAY_NAME 20CALENDARMONTH_NAME 12CALENDARSTAR_SIGN 12CALENDARSYS_STU3YNUSG336CSVO605Z94BBZS 12CALENDARSYS_STUJAZ#M82V9AIVJF$ZMSI#RN$ 12CALENDARWEEK_NAME7
使用函数
SELECT /*+gather_plan_statistics*/ COUNT(*) FROM CALENDAR WHERE UPPER(STAR_SIGN)='天秤座';COUNT(*)----------24576
查看执行计划
select * from table(DBMS_XPLAN.DISPLAY_CURSOR(FORMAT=>'ALLSTATS LAST'));-----------------------------------------------------------------------------------------| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers |-----------------------------------------------------------------------------------------| 0 | SELECT STATEMENT | | 1 || 1 |00:00:00.09 | 1256 || 1 | SORT AGGREGATE | | 1 | 1 | 1 |00:00:00.09 | 1256 ||* 2 | TABLE ACCESS FULL| CALENDAR | 1 | 30720 | 24576 |00:00:00.12 | 1256 |-----------------------------------------------------------------------------------------Predicate Information (identified by operation id):---------------------------------------------------2 - filter(UPPER("STAR_SIGN")='天秤座')
可以看到E-Rows和A-Rows已经相差不大了,
之前 E-Rows =3686,A-Rows=24576
现在 E-Rows =30720,A-Rows=24576
其中E-Rows 是通过表总行数NUM_ROWS=368640 除以 STAR_SIGN NDV=12得到的;
E-Rows:368640/12=30720
通过10053看下执行计划
alter session set tracefile_identifier='EE10053';alter session set events '10053 trace name context forever ,level 1';SELECT COUNT(*) FROM CALENDAR WHERE UPPER(STAR_SIGN)='天秤座';alter session set events '10053 trace name context off';
vi cjc_ora_21149_EE10053.trc***************************************BASE STATISTICAL INFORMATION***********************Table Stats::Table: CALENDAR Alias: CALENDAR#Rows: 368640 #Blks: 1252 AvgRowLen: 41.00 ChainCnt: 0.00Access path analysis for CALENDAR***************************************SINGLE TABLE ACCESS PATHSingle Table Cardinality Estimation for CALENDAR[CALENDAR]***** Virtual column Adjustment ******Column name SYS_STU3YNUSG336CSVO605Z94BBZScost_cpu 150.00cost_io 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.00***** End virtual column Adjustment ******Column (#6): SYS_STU3YNUSG336CSVO605Z94BBZS(AvgLen: 10 NDV: 12 Nulls: 0 Density: 0.083333Table: CALENDAR Alias: CALENDARCard: Original: 368640.000000 Rounded: 30720 Computed: 30720.00 Non Adjusted: 30720.00Access Path: TableScanCost: 344.84 Resp: 344.84 Degree: 0Cost_io: 341.00 Cost_cpu: 141626443Resp_io: 341.00 Resp_cpu: 141626443Best:: AccessPath: TableScanCost: 344.84 Degree: 1 Resp: 344.84 Card: 30720.00 Bytes: 0***************************************
#也可以删除增强统计信息
#EXEC DBMS_STATS.DROP_EXTENDED_STATS(null,'calendar','(MONTH_NAME,STAR_SIGN)');
###chenjuchao 20240203###
参考链接:
【 Oracle 公益课堂 】Oracle 统计信息管理Home / Database / Oracle Database Online Documentation 11g, Release 2 (11.2) / Database Administration/Database Performance Tuning Guide/13 Managing Optimizer Statisticshttps://docs.oracle.com/cd/E11882_01/server.112/e41573/stats.htm#i41810





