Oracle EBS 的Concurrent Request"Gather Schema Statistics"是一个和性能相关的Concurrent Program,它会对表,列和索引的做数据采样,并生成统计信息。基于成本的优化器(Cost-Based OptimizationCBO)会根据你的数据采样来评估执行计划,最终选取一个最高效的方式来执行SQL。
补充一点:数据采样十分类似于问卷调查,假如你的目标群体非常庞大,你就不可能对所有目标客户逐一进行调研,正确有效地做法是在目标人群中挑选一定百分比的人进行调查,最终根据这部分被调查的人来推导出目标人群的情况。
什么样的情况下运行“Gather Schema Statistics”
当数据库发生较大变化的时候,比如新增了很多数据或者很多数据被删除,都应该运行一下这个program。需要注意的是,这个Request比较耗时,并且非常消耗数据库资源,所以最好把运行这个program的时间安排到周末或者晚上。
如何运行“Gather Schema Statistics”
1. Responsibility = System Administrator
2. Concurrent > Requests
3. 查询“Gather Schema Statistics”
4. 输入参数
Parameter
需要特别提到的是:
Schema Name:指的是你要对那个Schema下的对象进行统计,如果要对所有数据库对象进行统计,这里可以选择ALL。
Estimate Percent(评估比):是指对数据库对象的采样比例,默认为10%,这个值不要设置的太高,否则反会影响性能。(refer:OTN的一帖子),也有一些性能问题,适当提高评估比后,可以显著提升性能。
其他Parameter可以参见UserGuide。
如何判断数据库对象上一次运行统计的时间和统计比
- 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可以查看制定表中列的统计情况
- SELECT last_analyzed,sample_size
- FROM dba_tab_columns
- 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.
- EXEC FND_STATS.GATHER_TABLE_STATS(OWNNAME => 'INV',TABNAME => 'MTL_SYSTEM_ITEMS_B',PERCENT => 20);
DBMS_STATS.GATHER_TABLE_STATS
Sample:
- EXEC DBMS_STATS.GATHER_TABLE_STATS('APPS','MTL_MATERIAL_TRANSACTIONS', CASCADE=>TRUE );