This article is part of the blog article series, Oracle Analytics Best Practices.
When users complain that “Oracle Analytics is slow”, one the root causes could be report design rather than the hardware, database, or RPD.
This article walks through simple, UI‑only techniques you can use to avoid common report design flaws and performance issues (applicable for tuning Classic BI and Data Visualization reports).
It’s also intended for technical developers who don’t have access to the RPD or database, when Oracle Analytics is embedded as part of Oracle’s SaaS (software-as-a-service) offerings.
1. Rightsize the analysis: Optimize data volume for a faster UI response
In Oracle Analytics, performance is often a direct reflection of data volume. A primary design flaw is forcing the engine to fetch and render extraneous data. Every non-essential byte added to a report increases database overhead, network latency, and browser rendering time.
1.1) Streamline report columns for efficient data retrieval
- Evaluate column necessity: Remove redundant columns that do not support the core analytical objective. Extraneous columns inflate the “fetch size,” compelling the Oracle BI Server to work harder and the browser to struggle with rendering overhead.
- Follow “core versus detail” architecture: Retain only primary measures and critical dimensions on the main canvas. Offload secondary data to granular detail reports accessible using Action Links or targeted drill-downs.
1.2) Optimize analysis views (eliminate hidden overhead)
- Purge obsolete views: Even if a view (such as a hidden pivot table) isn’t visible on the dashboard, the Oracle BI Server may still allocate resources to parse and optimize its underlying query. Delete low-utility or unused views rather than simply hiding them.
- Implement conditional execution: Instead of one high-complexity analysis with multiple views, divide them into focused, individual reports. Use dashboard sections with guided navigation to ensure that only the user-selected report runs, preventing unnecessary background processing.

1.3) Eliminate “Excluded” columns
Suppress background aggregates: Columns in the “Excluded” section of the Criteria tab can still trigger superfluous background aggregations. If an attribute does not contribute to the final visualization, remove it from the analysis to streamline the execution path. For more details, see the blog article, Performance Tuning with Excluded Column.
1.4) Exercise “Union Discipline”
- Evaluate computational cost: Executing a
UNIONon wide datasets is resource-intensive; it increases CPU and memory consumption and often restricts the database optimizer’s ability to find the most efficient execution path. - Use the filter-first alternative: Whenever feasible, replace
UNIONlogic with a single criteria set that uses complex filter expressions. - Summarize union sets: If a
UNIONis a business requirement, restrict it to a minimal set of summary columns and navigate to a linked report for full-detail rows.
2.Optimize predicate logic: Strategic filtering for index utilization
Filters are the most powerful UI levers available for performance tuning. However, inefficiently constructed filter expressions—often called “non-sargable” predicates—force the database into full table scans, bypassing the very indexes designed to accelerate data retrieval.
2.1 Prioritize exact matches over pattern matching
- Eliminate
LIKEon low-cardinality attributes: UsingLIKE '%value%'is computationally expensive as it often requires a full scan of the column. Whenever possible, utilize exact matches (=) or theINoperator. - Leverage list prompts: For multi-value selections, replace pattern matching with list-based prompts. This ensures the Oracle BI Server generates an
INclause, which is significantly more likely to utilize database indexes. - Harness presentation variables: Instead of passing raw strings into a
LIKEfilter, capture user input in a presentation variable and apply it to anINfilter. This improves selectivity and execution predictability.
For example:
| filter( “SalesFacts”.”Dollars” using “Customers”.”Customer” in (@{pv_Customer}[‘@’]{‘Alley Dog’})) |
2.2 Avoid column-side expressions (function-wrapped filters)
Wrapping a physical column in a function (such as CAST, TRIM, or TO_DATE) within a filter condition typically prevents the database from using indexes on that column.
Problem scenario:
| cast(to_datetime(TRIM(cast(“Sample Revenue Fact”.”Close Date WID” as character(10))), ‘yyyymmdd’) as date) >= date ‘2024-12-24’ |
- Convert the input, not the column: If you’re comparing a Date-ID (Integer) to a Date, don’t
CASTthe ID to a Date. Instead, convert the user’s input into the corresponding Integer format. - Use integer-to-date logic: Use a mathematical approach to convert current dates into the key format to keep the column “clean” for index usage.
Optimized Predicate:"Close Date WID" >= (YEAR(CURRENT_DATE)*10000) + (MONTH(CURRENT_DATE)*100) + DAYOFMONTH(CURRENT_DATE) - Utilize the Date dimension: Whenever feasible, filter directly on the Date Dimension attribute. This allows the optimizer to join to the dimension and use its native date-type index. For example,
“Close Date”.”Date” >= current_date
2.3 Minimize wildcard complexity
Problem scenario: Wildcard usage

- Numeric and date constraints: Using wildcards (
%) on numeric or date-time fields is a high-cost operation that prevents index seeking.
- Range-based filtering: Replace wildcards with precise range filters (
>=and<=). This allows the database to perform a “range scan,” which is significantly faster than a wildcard pattern search.
2.4 Simplify case logic and leverage INDEXCOL
- Strive for execution plan consistency: Utilizing
CASElogic within a filter condition often leads to unpredictable execution plans and high CPU overhead. This results in volatile report runtimes that vary from one execution to the next. - Follow strategic indexing: For complex conditional filtering, utilize the
INDEXCOLfunction. This allows the Oracle BI Server to dynamically choose the most efficient, indexed column based on the user’s prompt selection, ensuring a stable and optimized execution path.
For best practices for using CASE statements and INDEXCOL functions, see the blog article, Best Practices for Indexcol.
Key takeaway: Always keep the column on the left side of your filter unmodified. If you wrap a column in a function, you’re effectively masking it from the database optimizer and bypassing its indexes.
3. Follow computational efficiency: Streamline expressions and aggregations in the SELECT clause
While filters control what data is fetched, the logic in your SELECT clause dictates how that data is processed. Inefficiently structured calculations and ambiguous aggregation rules can lead to expensive CPU cycles and inefficient SQL execution plans.
3.1 Optimize null-handling with native functions
In the SELECT clause, the way you handle null values can significantly impact parsing and execution. Replacing complex conditional logic with native null-handling functions results in cleaner, more performant SQL.
- Avoid elaborate
CASEstatements: Instead of usingCASE WHEN measure IS NULL THEN 0 ELSE measure END, utilize the more efficientIFNULLorNVLfunctions. - Use the “IFNULL” advantage: In Oracle Analytics, using
IFNULL(measure, 0)is the professional standard. It’s more readable and translated by the Oracle BI Server to the native database equivalent (likeNVL), which the database optimizer can process faster.
3.2 Define explicit aggregation rules for fact measures
Ambiguous or “default” aggregation rules can lead to unpredictable results and sub-optimal SQL generation. When the Oracle BI Server has to “guess” the intended grain, it may generate unnecessary sub-queries or complex joins.
- Eliminate ambiguity: Assign an explicit aggregation rule (for example,
Sum,Average,Count) to every fact measure within your analysis. - Drive query efficiency: Providing a explicit aggregation rule for each fact measure allows the Oracle BI Server to generate highly targeted, optimized SQL. This ensures that the database performs the heavy lifting at the correct grain, delivering a faster and more stable response to the UI. For examples, see the blog article, Best Practices for Report Totals in Oracle Analytics.
Key takeaway: Native operators compared to generic CASE expressions provide a direct execution path for the database optimizer and significantly lower the computational overhead of every retrieved row.
Call to action
Follow the guidelines described in this article to improve the performance of Oracle Analytics reports. For more detailed information, consult these resources:
