Your performance issue requires a comprehensive optimization strategy addressing all three critical areas:
Data Pagination:
Implement server-side pagination with Crystal Reports 2022’s built-in paging capabilities. Modify your dashboard to use paginated data sources:
-- Initial summary view (fast)
SELECT region_name, product_category,
SUM(sales_amount) as total_sales,
COUNT(*) as transaction_count
FROM sales_summary_daily
WHERE date >= '2024-01-01'
GROUP BY region_name, product_category
ORDER BY total_sales DESC
LIMIT 100
Configure the dashboard data source with fetchSize="100" and enablePagination="true". This loads only the first 100 rows initially, fetching additional pages as users scroll. For Crystal Reports 2022, set this in the data source connection properties.
Drill-Down Widget Optimization:
Convert your drill-down widgets to use on-demand queries. Instead of loading all detail data upfront, configure drill-down to execute parameterized queries:
-- Drill-down detail query (executes only when user clicks)
SELECT date, product_name, quantity, sales_amount
FROM sales_fact sf
JOIN product_dim pd ON sf.product_id = pd.id
WHERE region_id = @selected_region
AND product_category = @selected_category
AND date >= @date_start
LIMIT 1000
In the dashboard widget configuration, set drillDownMode="onDemand" and maxDrillDownRows="1000". This ensures drill-down data is fetched only when needed and limited to reasonable result sets.
Backend Data Aggregation:
This is the most impactful optimization. Create a multi-level aggregation strategy:
- Daily summary table (updated nightly via ETL):
CREATE TABLE sales_summary_daily AS
SELECT date, region_id, product_category,
SUM(sales_amount) as daily_sales,
COUNT(*) as transaction_count
FROM sales_fact
GROUP BY date, region_id, product_category
-
Configure your dashboard to query summaries for the main view and fact tables only for drill-down details
-
Implement incremental refresh: Only re-aggregate data for the current day, keeping historical aggregations static
-
Add appropriate indexes on the summary table: `CREATE INDEX idx_summary ON sales_summary_daily(date, region_id, product_category)
Additional Performance Tuning:
- Enable query result caching in CMC (Dashboard Service > Cache Settings) with 10-minute TTL for frequently accessed dashboards
- Use dashboard-level filters to reduce initial data scope (default to last 30 days instead of YTD)
- Implement progressive loading: Show key metrics immediately, load detailed charts asynchronously
- Monitor query execution plans and ensure your database statistics are up to date
With these optimizations, your dashboard load time should drop from 30+ seconds to under 5 seconds for the initial view, with drill-down operations completing in 2-3 seconds. The key is shifting from “load everything” to “load summaries, drill to details” architecture.