- essbaseessbase.ru/uploads/aso/optimizing aso.pdfthe following is intended to outline our general...
TRANSCRIPT
<Insert Picture Here>
Optimizing ASO
Steve LiebermenschConsulting Technical Director
The following is intended to outline our general product direction. It is intended for information purposes only, and may not be incorporated into any contract. It is not a commitment to deliver any material, code, or functionality, and should not be relied upon in making purchasing decisions.The development, release, and timing of any features or functionality described for Oracle’s products remains at the sole discretion of Oracle.
Agenda
• Dimension settings and usage– Compression– Accounts– Time
• MDX optimization• Materialization• Data load
Dimension Settings and UsageCompression
• Compression dimension is not mandatory, but helps performance
• The compression dimension is a dynamic dimension• Should be the column headers in a data load file• Ideal compression is achieved if the leaf level
member count is evenly divisible by 16
Dimension Settings and UsageAccounts
• Dynamic dimension• Allows for non additive unary operators• Required for time balance functionality• Expense flags are accomplished through UDAs and
member formulae• In the case of large GL type accounts dimensions
should consider storing the dimension
Dimension Settings and UsageAccounts
Must be a dynamic dimension due to “-”unary operator
Dimension Settings and UsageAccounts
Simplest hierarchy and allows for maximum stored aggregates. Leverages load rule setting
of sign flip on UDA. Requires the user to accept different signage of values.
Dimension Settings and UsageAccounts
Preserves original signage and allows for some aggregates to be stored
Dimension Settings and UsageTime
• Can make a good candidate for compression dimension
• Should be stored• Use multi-hierarchy dimension if formulae are
necessary• To-date formulae
– Prior to 9.3.1 best if performed in Time dimension– 9.3.1 and forward, best to use analytic dimension
Dimension Settings and UsageTime
• Use analytic dimension if you need perform time calculations like period to date sums, period over period comparisons
• Use AGGREGATE function if your period to date calculations need to take Time Balance tags into account
ORACLE CONFIDENTIAL
Agenda
• Dimension settings and usage• MDX optimization
– Data vs. meta data– Eliminate unnecessary functions– Simplify syntax– NonEmpty directive
• Materialization• Data load
MDX OptimizationMeta-data vs data
Performance difference between the following statements:
IIf(Scenario.CurrentMember = Actual,….)
Or
IIf(Is(Scenario.CurrentMember,Actual),….)
MDX Optimization
Goal is to calculate a products 3 month average Transactions contribution % to total 3 month average Transactions:
MDX Optimization
Round( ( ( ([Time].CurrentMember,[Products].CurrentMember,[Transactions]) +
([Time].CurrentMember.Lag(1),[Products].CurrentMember,[Transactions]) +
([Time].CurrentMember.Lag(2),[Products].CurrentMember,[Transactions]) ) /
(([Time].CurrentMember,Ancestor (Products.CurrentMember, Products.Generations(2)),[Transactions]) +
([Time].CurrentMember.Lag(1),Ancestor (Products.CurrentMember, Products.Generations(2)),[Transactions]) +
([Time].CurrentMember.Lag(2),Ancestor (Products.CurrentMember, Products.Generations(2)),[Transactions]) ) )
,4)
MDX Optimization
Round( ( ( ([Time].CurrentMember,[Products].CurrentMember,[Transactions]) +
([Time].CurrentMember.Lag(1),[Products].CurrentMember,[Transactions]) +
([Time].CurrentMember.Lag(2),[Products].CurrentMember,[Transactions]) ) /
(([Time].CurrentMember,Ancestor (Products.CurrentMember, Products.Generations(2)),[Transactions]) +
([Time].CurrentMember.Lag(1),Ancestor (Products.CurrentMember, Products.Generations(2)),[Transactions]) +
([Time].CurrentMember.Lag(2),Ancestor (Products.CurrentMember, Products.Generations(2)),[Transactions]) ) )
,4)
Remove unnecessary functions. Formatting should be left to the
reporting tool.
MDX Optimization
( ( ([Time].CurrentMember,[Products].CurrentMember,[Transactions]) + ([Time].CurrentMember.Lag(1),[Products].CurrentMember,[Transactions])
+ ([Time].CurrentMember.Lag(2),[Products].CurrentMember,[Transactions])
) / (([Time].CurrentMember,Ancestor (Products.CurrentMember,
Products.Generations(2)),[Transactions]) + ([Time].CurrentMember.Lag(1),Ancestor (Products.CurrentMember,
Products.Generations(2)),[Transactions]) + ([Time].CurrentMember.Lag(2),Ancestor (Products.CurrentMember,
Products.Generations(2)),[Transactions]) ) )
Avoid unnecessary references to CurrentMember. It is
assumed without explicitly using a function
MDX Optimization
( ( ([Time].CurrentMember,[Transactions]) + ([Time].CurrentMember.Lag(1),[Transactions]) + ([Time].CurrentMember.Lag(2), [Transactions]) ) / (([Time].CurrentMember,Ancestor (Products.CurrentMember,
Products.Generations(2)),[Transactions]) + ([Time].CurrentMember.Lag(1),Ancestor
(Products.CurrentMember, Products.Generations(2)),[Transactions]) +
([Time].CurrentMember.Lag(2),Ancestor (Products.CurrentMember, Products.Generations(2)),[Transactions]) ) )
Simplify formulae, no need to use 5 functions where 1 will
do. 3 CurrentMemberfunctions and 2 Lag
functions
MDX Optimization
Sum(LastPeriods(3),Transactions)/ Sum(LastPeriods(3),(Ancestor (Products.CurrentMember,
Products.Generations(2)),Transactions))
Don’t use a function where direct referencing can be
performed. In this model Gen 2 of the Products dimension
will always be the same member
MDX Optimization
Sum(LastPeriods(3),Transactions)/ Sum(LastPeriods(3),([All Merchandise],Transactions))
MDX Optimization
Case When NotIsEmpty(Sum(LastPeriods(3),Transactions)) Then
Sum(LastPeriods(3),Transactions)/ Sum(LastPeriods(3),
([All Merchandise],Transactions))End
Only perform calculation when data to support the math exists
MDX Optimization
Additionally you should break up the complex formula using an additional member:
Create a new member [Last 3 Month Transactions]Assign the formula:
Sum(LastPeriods(3),Transactions)
Then the new % Contribution formula becomes:NonEmptyMember [Last 3 Month Transactions]
Sum(LastPeriods(3),Transactions)/ Sum(LastPeriods(3),([All Merchandise],Transactions))
NonEmpty directive, coming in 11.1.1
Agenda
• Dimension settings and usage• MDX optimization• Materialization
– Query Hints– Default– Query Tracking– Size – Choose your own adventure/have it your way materialization
• Data load
Materiaization
• Query Hints• Default• Query Tracking• Size • Choose your own adventure/have it your way
materialization
MaterializationQuery hints
• On Dimension/Hierarchy
MaterializationQuery hints
• Dimensional intersections
MaterializationDefault
• In Analytic Administration Services
• Through Maxl– execute aggregate process on database “database name” ;
MaterializationQuery tracking based
• In Analytic Administration Services
• Through Maxlalter database “database name” enable query_tracking; MDX report definition;execute aggregate process on database “database name”
based on query_data;alter database “database name” disable query_tracking;
Materialization
• Results of aggregate selection– Default selection
• 26 views– Hierarchy option
• 24 views– Dimensional Intersection
• 24 views– Query Tracking
• 2 view– No views were shared amongst all 4 aggregate selection
processes– Only 2 views were shared between more than 2 selection
processes– 7 views were shared in total
MaterializationDatabase size
• In Analytic Administration Services
• Through Maxl– execute aggregate process on database “database name”
stopping when total_size exceeds “size factor”;
MaterializationNumber of views
• In Analytic Administration Services
• Through Maxl– execute aggregate selection on database “database name”
selecting “number of views” views;
Materialization
• By default Aggregate Storage Option is parallel threaded with two threads, can use up to 8
• When loading incremental data, aggregate views are also updated
• Materialization scripts can be saved and reused to eliminate regeneration of query tracked results
• The database can be available during materialization without data consistency issues
Agenda
• Dimension settings and usage• MDX optimization• Materialization• Data load
– Behavior– Slice loading– Optimization
Data LoadBehavior
• Within a buffer duplicate records are additive irrelevant of load rule settings
• When committing the buffer it adheres to data load rule setting related to overwrite, add to, or subtract from
• Single threaded, can use DLTHREADS cfg settings but thorough testing should be performed
• Materialized views are updated as part of the data load process during an incremental update
Data LoadSlice loading
• Is the primary feature enabling Excel based lock and send and trickle feeding functionality
• Creates “subcubes” alongside the primary slice of the database
• Dynamic aggregations are performed across the necessary slices to provide query results
• Different materialized views might exist within a slice as compared to the primary slice of the database
Data LoadOptimization
• Compression dimension should be across the load file• Consider removing aggregate views prior to an
incremental update of data• Data should be loaded as additive values• Multiple buffers can be used to parallel load the
database. Requires simultaneous Maxl processes to be executed
• Ignore Zeros and Missing values whenever possible, buffer setting
<Insert Picture Here>
Questions?????