How Cross Joins Are Killing Your Dashboard Performance
insightsoftware is the most comprehensive provider of solutions for the Office of the CFO. We turn information into insights, empowering business leaders to strategically drive their organization.

Your analytics team built a report. It worked fine in development, but when it went into production, users began to complain about loading time. Your team has checked the database and looked at the dashboard configuration, but nobody can find the problem.
There's a good chance the cause is a cross join, and there's an even better chance it's executing in the wrong place.
What a Cross Join Is and Why It Matters
SQL joins are how databases combine data from multiple tables. Most joins are intentional and bounded. An inner join returns only rows where a matching condition exists between two tables. A left join returns everything from one table and matches it against another where possible. Both produce manageable, predictable result sets.
A cross join is different. Rather than matching rows based on a condition, it combines every row from one table with every row from another. Two tables with 1,000 rows each produce 1,000,000 intermediate rows before any filtering happens. Two tables with 100,000 rows each produce 10 billion. The database must work through all of that before it can return a result.
Cross joins have legitimate uses, especially for certain types of calculations and data modeling tasks. The problem is when they appear accidentally, which happens more often than teams realize. A misconfigured relationship in a semantic layer, a custom SQL query with a missing join condition, or a modeling mistake in a data tool like dbt can all produce an unintended cross join without anyone writing one explicitly. While the query looks normal, the behavior doesn't.
The Part Most Teams Miss
When a cross join causes a performance problem, the natural instinct is to look at the database or the BI tool. Both are usually fine. The variable that actually determines how bad the problem gets is where the join executes.
Queries in a BI environment don't travel directly from the tool to the database. They pass through a connectivity layer, a driver, that handles communication between the two. That driver determines how much of the query logic gets sent to the database for execution and how much gets handled locally after data is retrieved.
When a driver pushes join logic down to the database, the database engine handles it. It uses its query planner, indexes, and optimization capabilities to execute the join as efficiently as possible. A filtered, aggregated result set comes back to the BI tooland the dashboard loads quickly.
When a driver can't fully push down join logic, it retrieves larger datasets from the database and processes them locally. For a cross join, that means generating the full cartesian product outside the database without any of the database's optimization capabilities. This causes problems such as:
Memory spikes
Processing time multiplies
The dashboard that worked fine in development becomes unresponsive in production
The SQL your team wrote may be fine. The driver may be the variable that's turning a manageable operation into a performance crisis.
What This Looks Like in Practice
The symptom your team sees is a dashboard that loads slowly or times out under normal use. Concurrent users make it significantly worse. When multiple people trigger the same query simultaneously and each one generates a client-side cartesian product, the memory and processing overhead compounds quickly.
That pattern works in development, but breaks in production. When it gets worse with more users, it’s a reliable indicator that join execution location is worth investigating. The query that an analyst tested against the database directly was running with full database optimization. The same query through the BI tool was running through a driver that couldn't push the operation down, and the difference only became visible under real load.
The Driver Is the Fix
Addressing this doesn't require rewriting SQL or replacing BI tools. It requires a driver that handles pushdown correctly.
Simba from insightsoftware is trusted by the world's leading data platforms, including Google, Microsoft, and Databricks, to power their own data access products. That same standards-based connectivity is available to enterprise teams through Simba's ODBC and JDBC drivers. Supported join conditions, filters, and aggregations are pushed to the source database for execution. What returns to the BI tool is a result set, not raw data waiting to be processed in memory.
The result is dashboard performance that holds up under real workloads across Tableau, Power BI, Logi Symphony, and other major BI platforms, because the heavy work is happening where it's designed to happen, right at the database.
If your team has been chasing a performance problem that nobody can locate, the driver layer is worth a closer look.
Ready to learn more? Read our white paper on how to accelerate adoption of your BI analytics or data preparation platform.