Oracle EBS Concurrent Request:Gather Schema Statistics[Z]

时间:2021-05-17 14:38:04

Oracle EBS 的Concurrent Request"Gather Schema Statistics"是一个和性能相关的Concurrent Program,它会对表,列和索引的做数据采样,并生成统计信息。基于成本的优化器(Cost-Based OptimizationCBO)会根据你的数据采样来评估执行计划,最终选取一个最高效的方式来执行SQL。

补充一点:数据采样十分类似于问卷调查,假如你的目标群体非常庞大,你就不可能对所有目标客户逐一进行调研,正确有效地做法是在目标人群中挑选一定百分比的人进行调查,最终根据这部分被调查的人来推导出目标人群的情况。

Oracle EBS Concurrent Request:Gather Schema Statistics[Z]

什么样的情况下运行“Gather Schema Statistics”

当数据库发生较大变化的时候,比如新增了很多数据或者很多数据被删除,都应该运行一下这个program。需要注意的是,这个Request比较耗时,并且非常消耗数据库资源,所以最好把运行这个program的时间安排到周末或者晚上。

如何运行“Gather Schema Statistics

1. Responsibility = System Administrator
2. Concurrent > Requests
3. 查询“Gather Schema Statistics”
4. 输入参数Oracle EBS Concurrent Request:Gather Schema Statistics[Z]

Parameter

需要特别提到的是:

Schema Name:指的是你要对那个Schema下的对象进行统计,如果要对所有数据库对象进行统计,这里可以选择ALL。

Estimate Percent(评估比):是指对数据库对象的采样比例,默认为10%,这个值不要设置的太高,否则反会影响性能。(refer:OTN的一帖子),也有一些性能问题,适当提高评估比后,可以显著提升性能。

其他Parameter可以参见UserGuide。

如何判断数据库对象上一次运行统计的时间和统计比

  1. SELECT num_rows,sample_size,last_analyzed from dba_tables WHERE table_name = 'MTL_SYSTEM_ITEMS_B';

output:
NUM_ROWS:151210

SAMPLE_SIZE:15121

LAST_ANALYZED:2011-11-10

Last_Analyzed的时间就是上次运行统计收集的时间。

Sample_Size是采样的行数,Num_Rows是真实数据库表中的行数。Same_Size/Num_Rows = 15121/151210 = 10%,这个10%实际上就是Estimate Percent。

另外下边的SQL可以查看制定表中列的统计情况

  1. SELECT last_analyzed,sample_size
  2. FROM  dba_tab_columns
  3. WHERE table_name = 'MTL_SYSTEM_ITEMS_B';

FND_STATS.GATHER_TABLE_STATS

另外除了使用Gather Schema Statistics,也可以直接调用FND_STATS.GATHER_TABLE_STATS来重做统计.

可以refer:http://docs.oracle.com/cd/E18727_01/doc.121/e12893/T174296T174306.htm

也可以调用这个Package来只做某个特定表的统计,eg.

  1. EXEC FND_STATS.GATHER_TABLE_STATS(OWNNAME => 'INV',TABNAME => 'MTL_SYSTEM_ITEMS_B',PERCENT => 20);

DBMS_STATS.GATHER_TABLE_STATS

Sample:

    1. EXEC DBMS_STATS.GATHER_TABLE_STATS('APPS','MTL_MATERIAL_TRANSACTIONS', CASCADE=>TRUE );