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. 輸入‘是’來維護索引
如果一個欄位沒有索引最佳化就會建立一個索引,如果你不再索引一個欄位,最佳化就會刪除這個索引。這在你定義一個新的你想要索引特定的欄位的科目表或者你想在你的科目表中在已經存在的欄位上增加刪除索引時是非常有用的。
總賬最佳化程式為你在段定義表單中標記為索引的科目表的段建立索引。這表明你是否希望在GL_COMBINATIONS 表中的資料庫列用來儲存主要的段,這樣那些段就有一列索引。這應該是有很多不同值的段的情況。
總賬最佳化程式為那些在段定義表單中未標記為索引的科目表的段刪除索引。這表明在GL_COMBINATIONS 表中你是否不想有資料庫列,那些段都有一列索引。這應該是段只有幾個不同值的情況。
你可以在總賬超級使用者職責下標記這些段:
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表中來的資料