Goal
怎样提高总账性能
这篇文章会涉及如下内容:
A) 数据库 Init.ora 参数
B) 并发请求控制设置
C) 总账优化程序
D) 有用的提示
E) 基于数据库成本优化
F) 索引优化
G) 多表的日记账导入
Solution
A) 数据库 Init.ora参数
确认你是根据Oracle应用的推荐设置的init.ora参数。从Note 174605.1 bde_chk_cbo.sql- Reports Database Initialization
Parameters related to an Apps 12 or 11i instance下载最新的版本,运行bde_chk_cbo.sql来得到你目前init.ora参数的列表和推荐的设置。
更多数据库初始化参数设置信息请参考Note 396009.1: DatabaseInitialization Parameters for Oracle Applications Release 12, contains moreinformation on the database initialization parameter settings.
B) 并发请求控制设置
要提高日记账导入的性能,请检查下面的配置文件选项设置(这替代了以前版本中使用的并发请求控制设置表单),它会直接影响日记账导入的性能:
1. 设置配置文件选项GL:一次处理的记录数。能被内存控制的,日记账导入和成批分配/成批预算请求可以处理的日记账行数越多,他们就运行的越快。如果你不输入任何值,你的并发请求可以立即处理1000条日记账行。太大的数你可能会发现它对你的内存来说太大了,因此你需要从25000开始测试。
2.设置配置文件选项GL:存档日记账导入数据为‘否’。当值为‘是’时,在每一次日记账导入运行最后GL_INTERFACE的数据保存在GL_INTERFACE_HISTORY ,日记账导入运行会很慢。Oracle 应用系统不使用这个数据
C) 总账优化程序
这里有两个程序你需要去运行它来提高总账的性能。:
l维护汇总模板程序: 在当前账簿里更新汇总科目信息。
总账优化程序: 在你标记使用索引的科目表中为那些字段创建或删除索引。这个和日记账导入性能最相关
C.1) 为科目表段创建和删除索引:
1.冻结你的科目结构.
2.到提交请求的窗口.
3.选择优化程序.
4. 输入‘是’来维护索引
如果一个字段没有索引优化就会创建一个索引,如果你不再索引一个字段,优化就会删除这个索引。这在你定义一个新的你想要索引特定的字段的科目表或者你想在你的科目表中在已经存在的字段上增加删除索引时是非常有用的。
你可以在总账超级用户职责下标记这些段:
1. 导航到设置 > 财务 > 弹性域 > 键 > 段
2. 查询你所有的会计弹性域结构
3. 到每个段里选择或不选择索引.
C.2)要更新你的数据的统计信息:
1.到提交请求窗口.
2.选择优化程序.
3.为收集统计数据输入‘是’.
优化程序会收集并更新统计信息, 比如你的科目余额和组合表的大小,特定字段值的科目号码,每个会计期间的科目余额的数量。
这个信息提高了日记账过账和财务报告程序的性能。
要保持目前的统计数据,你至少应该一个期间运行一次优化程序或者每次增加一些段值,定义新的科目表或增加删除汇总模板的时候,运行。.
D)有用的提示
参考下面的建议来提高日记账导入的性能,还有总账的其他程序,比如过账,合并报表。
1. 运行的批越少越好.
在GL_INTERFACE表有几个栏位叫distinguishing attributes 他们决定着记录是怎么插入批,头层和行的。这个决定着有多少个批创建的属性有关键的LEDGER_ID, JE_SOURCE_NAME, JE_BATCH_NAME 和 PERIOD_NAME.
对于每次日记账导入批次的创建,他都会额外的通过GL_INTERFACE表,这样就会提高日记账导入处理的时间。我们建议您在运行时尽可能的处理少的批次。
运行一个批次包含很多日记账要比很多批次但是每个批次只有很少的行要好的多。
可是,当导入很长的批时,在行从接口表中删除的阶段时可能会有期望的延迟。如果在接口表中只要这一个批,这就可以避免---在这种情况下系统会做一个快速的‘截取‘。在当前分类账会计的模式下,不太可能有一些行被留在GL_INTERFACE 因为当有问题发生时,通常系统会回滚插入到SLA表中的行,清空接口表。这会有助于性能。
2.尽可能的关更多的期间。
考虑好在你所有的账簿中有多少个开着的或者未来输入的期间, 包含那些你不会通过日记账导入输入数据的账簿。
这会减少运行的时间。
3. 取消动态插入和定义你已经在feeder 系统中使用的但是还没有在总账中定义的科目。
当系统不需要动态的创建新的科目组合时,日记账导入会快的多。你可以考虑使用动态插入的日记账导入,通过导入零金额行来创建第一个新的组合(不会创建日记账但是丢失的组合会创建).
E)基于数据库成本优化(CBO)
Oracle 应用系统 R12使用基于成本的优化(CBO) 。它会去选择最有效的方式运行SQL。要有效的使用基于成本的优化,你必须保证当前你的数据库统计数据。Oracle应用系统提供了一系列的程序帮助你收集这些统计数据。更多的信息请参考:
- Note 744143.1: Tuningperformance on eBusiness suite.
F)索引优化
在操作下面的步骤之前你可能需要你们数据库或者系统管理员的帮助.
F.1) GL_CODE_COMBINATIONS的索引
要优化GL_CODE_COMBINATIONS 的性能,只在GL_CODE_COMBINATIONS表中增加一个非唯一的相关联的索引。根据开发部的信息,这是个必需的索引,不管性能问题发生在哪儿,它都会提高许多其他总账功能的性能。
如果已经存在一个这样的索引,请确保有着最大数字值的段仍然先出现,因为值的速度可能会变的超时。
在CREATE INDEX 命令中,栏位的顺序是决定性的---越敏感或者越有选择性的索引,性能就会越好。要实现这个目标,在表中出现越多的段就必须先被创建索引。
要找到存在哪些索引, 使用这个 sql:
Select aic.table_name,aic.index_name,
ai.uniqueness, aic.column_name, aic.column_position
From all_ind_columns aic,
all_indexes ai
where ai.index_name =aic.index_name
and ai.table_name ='GL_CODE_COMBINATIONS'
order by aic.index_name,aic.column_position;
要决定在关联索引中段的顺序,执行下面的select语句,它会计数在GL_CODE_COMBINATIONS 表中使用的每个段不同值的数量(因为索引是为所有的科目表我们不在COA之间进行区分):
set serveroutput on
DECLARE
v_SegNum VARCHAR2(9);
v_FreqCount NUMBER;
BEGIN
FOR i IN 1..30
LOOP
EXECUTE IMMEDIATE
'SELECT COUNT(DISTINCTSEGMENT'||TO_CHAR(i)||')
FROM gl_code_combinations'
INTO v_FreqCount ;
IF v_freqCount <> 0 THEN
DBMS_OUTPUT.PUT_LINE(
'SEGMENT'||TO_CHAR(i)||' Frequency= '||TO_CHAR(v_FreqCount));
END IF;
END LOOP;
END;
比如, 假设这个 select语句返回下面的值:
SEGMENT1 Frequency = 4
SEGMENT2 Frequency = 37
SEGMENT3 Frequency = 76
SEGMENT4 Frequency = 3221
SEGMENT5 Frequency = 21
SEGMENT6 Frequency = 22
只有很少不同值的个别段的索引应该在段定义表单中停用 (不选择索引列 – 请看上面C.1 段落).
通常最好的相关索引应该包括所有段,根据不同值的数量降序排列。根据上面的数据,最好的使数据最有选择性的索引顺序是:
1. SEGMENT4,
2. SEGMENT3,
3. SEGMENT2,
4. SEGMENT6,
5. SEGMENT5,
6. SEGMENT1
在这个例子中我们建议不选在SEGMENT1上的索引,因为通常为只有很少不同值的段索引是没有什么受益的。
不建议两个索引开始于同一栏位,你可能需要停用SEGMENT4上的索引标记因为它会被相关的索引取代。(segment4在相关联的索引中是第一个栏位).
以APPS登录 SQL*Plus 来手工创建新的相关联的索引GL_CODE_COMBINATIONS_CAT.在我们的例子中你应该执行下面的操作:
CREATE INDEXGL_CODE_COMBINATIONS_CAT ON gl_code_combinations
(segment4,
segment3,
segment2,
segment6,
segment5,
segment1)
PCTFREE 0
INITRANS 2
MAXTRANS 255
TABLESPACE user_index
STORAGE (INITIAL 1048576
NEXT 16384
PCTINCREASE 0
MINEXTENTS 1
MAXEXTENTS 20);
当这个索引创建的时候,你必须允许总账优化,维护索引选项设为是,来创建/删除段的必需的索引。
如果相关联的索引使用和标准段索引相同的名字,它会被总账优化取代或者删除。当这种情况发生时,一定要手工再创建相关联的索引。
F.2) GL_INTERFACE的索引
如果你在运行日记账导入时仍然有很差的性能问题,而且日志文件显示gllger 是最后输入的模块,那就在GL_INTERFACE 表里创建相似的索引
.
CREATE INDEX GL_INTERFACE_CAT ON GL_INTERFACE
(segment4,
segment3,
segment2,
segment6,
segment5,
segment1) ;
还有一个改进,是为GL_INTERFACE每个段增加非唯一索引,就像在 GL_CODE_COMBINATIONS里的索引一样。
因此, 在这个例子里为段3,2,5创建索引。
在GL_INTERFACE 表里有4 个标准索引 (GL_INTERFACE_N1 到 _N4).
如果日记账导入很慢,或者显示挂在模块 gllcje 或者 gllidx, 那么问题可能和索引GL_INTERFACE_N2相关。它定义在栏位 (REQUEST_ID, JE_HEADER_ID, STATUS, CODE_COMBINATION_ID) ,并且它可以通过包含栏位JE_LINE_NUM来重新定义使其更有选择性。
以APPS登录 SQL*Plus 然后执行下面的命令:
DROP INDEX GL_INTERFACE_N2;
CREATE INDEX gl_interface_n2 ONgl_interface
(request_id,
je_header_id,
status,
code_combination_id,
je_line_num)
PCTFREE 0
INITRANS 2
MAXTRANS 255
TABLESPACE user_index
STORAGE (INITIAL 1048576
NEXT 16384
PCTINCREASE 0
MINEXTENTS 1
MAXEXTENTS 20);
注意:
表空间和内存可能和你的安装不同;
这不是标准的索引因此Oracle技术支持可能会要求你在未来的任何时候恢复标准索引定义
G)多表的日记账导入
多表的日记账导入是从老版本11i.GL.D开始的功能.
日记账导入除了根据GL_INTERFACE 之外,还可以其他表来运行, 只要他们和GL_INTERFACE 一样包含相同的栏位。你可以继续不需任何更改的客式化程序来使用 GL_INTERFACE表,它会插入GL_INTERFACE表或者提交日记账导入程序。
运行多表,日记中导入会触发一个并发请求,涉及到每个参与的接口表。使用备用表可以帮助你提高性能因为日记中导入会更高效的处理来自多表的大量数据, 而不是单单从GL_INTERFACE表中来的数据