Performance Best Practices
Overview
- Turn on the Configuration Cache before go-live.
- Remove Print Statement before go-live.
- Minimize the number of loops, including nested and parallel loops.
- Don't use default functions at the line attribute level.
- Eradicate the use of Python.
- Don't use JavaScript.
Administration
Increasing Performance on a Site with Large Quotes
-
Use
dict("String")
instead ofdict("string[]")
.The speed for processing and storing
dict("string")
is faster thandict("string[]")
. In general, a simple structure is faster. -
Eliminate Revert to Default on line item attributes if you have any for those actions.
They run X times, and they invoke the line item advanced default script every time they run.
-
Eliminate line item summation attributes.
They also run X times every update.
-
If you need to loop through line items, store them into temporary variables such as a string or a float dictionary.
After you store them, use the temporary variables instead of looping through line item documents collection.
- If you have Advanced Modify on those actions, optimize the code:
- Eliminate nested For... loops
- Eliminate parallel For... loops
- Eliminate table calls done in For... loops
When building the result string, use a temporary result string in loops in order to minimize the number of large string concatenations.
- Eliminate calls to Global Functions.
- Eliminate or optimize Quote level summation attributes.
- Eliminate or optimize HTML/Read-Only attributes.
- Eliminate Revert to Default for quote level attributes on those actions.
- Delete any unused attributes.
-
Ensure that the first main doc always has
document number=1
instead ofres=res+_quote_doc_number+"~varname~"+value+"|";
Use
res=res+"|1~varname~"+value;
instead. -
Use the Run Once For All Line Items option on advanced line item default if you have any loops.
Confirm the final results are correct. If you do not select run once, the advanced default will run for each line item added. If you have many recommended items you are adding at once, this can cause a significant performance penalty.
Known Bug: "Run Once For All Line Items" is not respected when copying line items. If you make multiple copies of a configuration, the line item default will run for all copies being made. -
Rather than calling the same Data Table multiple times with slightly different queries, get table data once, put it into an array, and process the data as you loop through the array.
The size of the Data Table and the number of queries will influence the impact of this change.
- If calling large tables, reduce the number of records by redesigning tables.
-
Minimize the number of RTE fields on line item attributes.
There should be no more than 5, as a general rule.
- Minimize the number of line item attributes and the number of attributes displayed in the line item grid.
- Do not put model/configurator-specific pricing in the pricing script. Instead, use the relevant configurator to calculate these.
-
Do not put large text area attributes on the page.
These will be submitted back to the server when an action is performed on the page, even if the action has "leave value unchanged" for the attribute.
-
Regarding access rules, do not loop over line items to determine hiding behavior.
Concurrent Commerce Rule Processing
Oracle CPQ 21C enables the internal parallel processing of Commerce rules to improve end user response time. Concurrent rule processing improves performance in Commerce transactions for end users.
Configuration Performance Best Practices
-
Minimize number of attributes per flow.
It will be faster to use multiple flows than one flow with many tabs.
-
Minimize array sets.
JavaScript and other factors can slow down configuration for arrays, especially in Internet Explorer.
-
Do not use image menus; these need to be loaded on the page.
The larger the images, and the greater the number of images, the more performance will suffer.
Having a list of items that repeats a word(s) in all the names is inefficient. Take advantage of labeling your groups more appropriately to avoid redundant content that distracts from the true distinct differences of the items.
-
Identify words that are used in every line of a group of labels. Many groups of labels have one word that appears in all of them; it draws the eye away from what makes each line unique, and it creates clutter. Remove this word and incorporate it into the group header.
Using the word "Total" on every line of the following list is unnecessary because they're all totals. Instead use a useful group label.
Good List Bad List TOTALS
- Retail Price
- Total Savings
- New Price
- Taxes
- Net Price
- Total Retail Price
- Total Savings
- Total New Price
- Total Taxes
- Total Net Price
-
Eliminate redundant attribute choices. It is common to have repeated words in the options listed for an attribute. Pinpoint the word being used in all of them and make each one look more unique.
Redundant List MEMORY
- 2GB DDR SDRAM
- 4GB DDR SDRAM
- 6GB DDR SDRAM
- 8GB DDR SDRAM
The longer, redundant aspects of the names do not need to be repeated. All of the items in this list are memory of type "DDR SDRAM". We could label this Attribute as "MEMORY (in GB of DDR SDRAM)" or something similar and our list could simply be numbers.
Hiding irrelevant content for different user types
- Determine Hiding and Constraint Rules. Avoid dumping all site features onto the screen by using Hiding and Constraint rules. This allows you to only show applicable information to the specific user. Ask yourself the following:
- How many different end user types will there be?
- Example: My Tool Company consists of dealers and inside sales. There are three unique inside sales groups, each selling a different line of tools.
- How much information does each user type need to see?
- Example: The dealers of My Tool Company require all of the fields that we have included for Commerce, but the inside sales users only really need to collect about 40% of that information.
- Example: The Config section has three tabs, one for each of the three lines of tools offered by My Tool Company. As mentioned before, there are three inside sales groups, and each group only sells from one line of tools.
- How many different end user types will there be?
- Hide or Constrain Irrelevant Content. Make the experience better for all of your different types of users by hiding or constraining the irrelevant content.
- Example: An inside sales rep logs into Oracle CPQ and only sees the Config options for the tools that she sells. When she enters Commerce, she has 60% less information to populate. At no point does this feel daunting or overwhelming because all the information presented is relevant to her specific role.
Boolean attributes are designed to handle true/false and yes/no choices. It is recommended that you use a Boolean attribute instead of a two-option single select menu. It is considered best practice to be mindful of what you are asking the user:
-
Example: If you are asking the user if they are a student...
DO DON'T Make a Boolean attribute that asks "Currently a Student"?
The user will know to select the box next to it.Make a Text Attribute with a drop-down or radio button list with the choices "Yes" and "No".
- Example: You are making a Boolean attribute to replace a text attribute you have called "Purchase History" with the following choices: "I have purchased items in the past" and "I am a new customer."
- Change the label from "Purchase History" to "Have you purchased items from here before?" or "I have purchased items in the past" so that the user clearly knows what they are choosing to be True.
If the label is carefully reworded to avoid ambiguity, many two-option attributes can be turned into Booleans. The user should be able to understand the option that they are selecting.
It is recommended to set the default to "False".
Prevent Posting of Read-Only Fields
An internal property gives Oracle CPQ customers the option to prevent Commerce read-only fields from being posted back to the server after a Commerce action is invoked.
While enabling this property will have nominal impact on performance, it is recommended not to post information back to the server when the data will not have changed since it was last posted.
To enable this property, open a ticket on My Oracle Support.
When a desktop user opens a Transaction, its data will now be cached to reduce the need to access the database. As the user views and edits the Transaction, the data is accessed from the cache, not the database. When the Transaction is saved, the changes are written to the database and are then accessible to other users.
Desktop Transaction caching also allows faster processing of Ajax calls. Ajax is used throughout the Commerce module, such as in AJAX Hiding / Constraint Rules, Auto Update Advanced Modification, and AJAX Formulas. Therefore, faster processing can have a broad impact.
By default, desktop Transaction caching is enabled for both new and existing customers. Work with your Oracle CPQ application sales representative to discuss how this feature can be most effectively used for your specific implementation.
If Commerce attributes are not on the layout being viewed, or are hidden by a Participant Profile, they will be removed from the generated HTML sent to the browser. This reduces the amount of content that has to be delivered from the server.
If you need access to attributes not on the layout, see the section Reading Commerce Attributes not on the Layout in the topic Commerce Document Attributes for more information.
By default, this feature is enabled for both new and existing customers. Although we highly recommend using the optimized data request size feature, it can be disabled by opening a ticket on My Oracle Support. Note that since this degrades performance, the request will need to be approved.
Line Item Grid (LIG) Pagination Modes
Several Line Item Grid (LIG) pagination modes exist in the Commerce desktop layout, giving you more control over when data is sent to the browser and displayed to the user.
By enabling Grid Paging, the Line Item Grid will display the line items on a page by page basis when a Transaction is opened. The user can then page through the Line Item Grid to display the next page of line items.
In previous versions of CPQ, you could choose whether or not to enable pagination for a Line Item Grid. Now, you can also choose the way pages are retrieved.
To enable or modify pagination for a Line Item Grid:
- Click Admin to go to the Admin Home Page.
-
Click Process Definition under the Commerce and Documents section.
The Processes page opens.
- Confirm that it says Documents in the Navigation column for the process you want to modify, and click List.
- Select Desktop Layout in the Navigation column for the main Document and click List.
The Layout Editor appears.
- Click the cog icon in the Line Item Grid.
The Line Item Grid dialog box opens.
- Change the setting for Enable Grid Paging and click Ok.
You can choose from the following options:
-
Disabled (no checkmark next to Enable Grid Paging )
The Line Item Grid displays all of the line items upon opening the Transaction. This is the default pagination mode for new Line Item Grids.
- Enabled (checkmark next to Enable Grid Paging )
Preloaded pages
All of the pages of line items are retrieved from the server when the Transaction is opened. This could mean a longer loading time initially, when opening the Transaction, but allows for faster display when paging through the line items.
This setting is recommended if the load time is acceptable for Transactions with a typical number of line items. This is usually when a typical Transaction has fewer than 200 line items, but because the number of line items columns vary between implementations, your site may have different results.
- On demand loading of pages
Only the first page of line items is retrieved from the server when the Transaction is opened. This allows for a shorter loading time initially, when opening the Transaction, but could mean a short delay when paging through the line items.
This setting is recommended for sites with more than 200 line items in a typical Transaction. However, because line items columns vary in size, depending on things like the number of Sub-Document attributes, your site may have different results.
This setting can also be useful for sites where typical Transactions have fewer than 200 line items, if users would like a faster load time when a Transaction is opened or an action is completed.
The appearance of the Line Item Grid will be the same for both Preloaded pages or On demand loading of pages pagination modes. The only difference is invisible to the user: how and when line item information is retrieved from the server.
To enable pagination for a Line Item Grid, navigate to the Commerce desktop Layout Editor, and click the cog icon in the Line Item Grid. A Line Item Grid dialog box opens. Change the setting for Enable Grid Paging and click Ok.
As in previous releases, regardless of which pagination option you choose:
- No functionality (action, auto update, or rules) is impacted.
- The Total column shows the total sum across all line items.
- The maximum number of line items that will appear on a Mobile Commerce page is 20.
For all pagination modes, the Page Navigation buttons have changed. The increase / decrease page size ([+-]) links, shown below, (previously visible for the Preloaded pagination mode) are no longer available.
The following screen shot shows the new page navigation functionality. The look and feel of the new pagination functionality is similar to existing mobile functionality. Use the Go to drop-down to navigate directly to any page of line items.
The duration of each step during a SAML SSO from an external application (such as Oracle Sales) into Oracle CPQ is now measured. This information can help troubleshoot the source of any delays.
If this is enabled, you can see this information in your log files.
For more information, or to enable this feature, open a ticket on My Oracle Support.
When printing a large Transaction, the Print XML is only generated once and updated as needed.
In previous versions, the Print XML was regenerated during printing when data was requested, even though that data already existed in the Print XML. For example, when another page was printed after the first page, the information that appeared on every page was requested again and the Print XML was regenerated.
Now, the XML recognizes that the data already exists and does not request it again.