MS Access performance expert · fix slow Access database · query optimization · indexing · USA, UK, Canada

Hire an MS Access Performance Expert to Fix a Slow Database — Without Data Loss, Without Migration

If your Access database was fast two years ago and isn't now, something specific changed — data volume crossed a threshold, a join is producing more rows than it should, a form is executing a DLookup call once per row instead of once per load, or the network path got worse. These are diagnosable, fixable problems. I find the specific object that's slow, measure it, fix it, and measure again so you can see what actually changed.

I don't recommend SQL Server migration as the default answer to performance problems. In most cases, the Access database just needs an index on the right column, a join rewritten correctly, or a form record source scoped to the rows the user actually needs. I'll tell you honestly which category you're in.

  • A form that opens in 2 seconds on a developer's machine takes 45 seconds for remote users — because bound fields are generating network round trips nobody measured.
  • A month-end report that used to run in 30 seconds now takes 12 minutes — data volume crossed the threshold where the missing index became visible.
  • Queries with 5 levels of nesting that Access materializes into temp tables at each level — the kind of structure that SQL Server handles with CTEs but Jet executes differently.
  • DLookup calls in the Form_Current event executing once per record as the user scrolls — 500 records means 500 database calls before the form feels responsive.
  • A database file approaching 2GB where Compact and Repair is becoming a weekly anxiety instead of a monthly routine.

Most Access performance problems have a name: a specific query, a specific form, a specific report that takes minutes when it should take seconds. If nobody can name the slow object, the first job is profiling — not guessing with indexes.

  • Senior MS Access performance specialist
  • USA · UK · Canada — remote
  • Measured before/after, always

Same-business-day triage when you send your Access and Office version, bitness, and the name of the slow object.

All scoped work runs on copies first — no profiling on live production data.

Name the slow object

Tell me which form, query, or report is slow and by how much. Include your Access and Office version, bitness (32 or 64-bit), and whether you can share a copy. Rough row counts in the main tables help.

Max 15MB. Access, PDF, Excel, ZIP, or images—if it helps explain the issue.

Why Microsoft Access Databases Get Slow — and What Actually Fixes Each Cause

Access performance problems have specific causes. "The database is slow" is not a diagnosis — it's a symptom. The fixes are completely different depending on which of these is actually happening:

Missing indexes on filter and join columns

The most common cause of Access queries that were fast at low data volume and slow now. When a query filters by CustomerID or InvoiceDate and those columns have no index, Jet/ACE scans the entire table every time. Adding the right index can take a query from 45 seconds to under 1 second. The key word is 'right' — indexes on the wrong columns don't help and add write overhead.

Fix: Add indexes on the specific columns used in WHERE clauses and JOIN conditions in the slow queries. Measure before and after.

Non-sargable filter criteria

Access can only use an index if the filter is written in a way the query optimizer can match to it. Wrapping an indexed field in a function — like Format([InvoiceDate], 'yyyy-mm') — prevents index use even if the index exists. LIKE '%text%' (leading wildcard) is another common case. These look like normal queries but perform like table scans.

Fix: Rewrite the filter criteria to be sargable — date range comparisons instead of formatted expressions, trailing-wildcard LIKE patterns instead of leading wildcards.

Cartesian join products from missing join conditions

A query that joins two tables without a proper join condition produces a row for every combination of records in both tables — 1,000 rows × 1,000 rows = 1,000,000 output rows before any filtering. This is usually accidental, but it's not always obvious in a query with multiple tables.

Fix: Add the missing join conditions. Row count drops from millions to thousands. Query runtime drops proportionally.

DLookup calls in form events executing per row

A Form_Current event that calls DLookup three times executes three separate database queries every time the user moves to a new record. On a form showing 500 records, that's 1,500 queries to populate three fields. The form feels stuck on navigation because it is — it's running a query cycle on every keystroke.

Fix: Replace per-row DLookup calls with calculated fields in the form's record source query, or cache the lookup values in a local collection populated once on form open.

Bound forms with full-table record sources

A form bound to SELECT * FROM Orders — no WHERE clause, no row limit — loads every order record across the network connection before displaying anything. If the Orders table has 200,000 rows, Access is pulling all 200,000 across the network before the user sees the first record.

Fix: Implement a search-first pattern: the form opens unbound or with a parameterized WHERE clause that limits to the specific records the user needs. 200,000 rows becomes 20.

Network latency amplified by bound field architecture

Access bound forms generate separate network round trips for each field navigation action. On a LAN, this is imperceptible. Over a VPN or WAN connection with 40ms+ latency, a form with 15 fields can generate 30–60ms of latency overhead per interaction. This looks like 'Access is slow' but it's actually 'the network architecture is wrong for Access.'

Fix: Cache data locally, implement a terminal server or RemoteApp deployment so Access runs where the data lives, or scope form record sources dramatically to reduce the number of records loaded.

MS Access Performance Symptoms That Are Engineering Problems — Not Hardware Problems

  • Report preview blocks the UI for 5+ minutes — users think Access crashed. Usually a query pulling unbounded history with no date filter and no index on the date column.
  • Combo boxes that take 3 seconds to open — because the row source is SELECT * FROM LargeTable with no WHERE clause and no index on the display column.
  • Form navigation that stutters on every record — DLookup or domain aggregate calls in Form_Current firing once per row instead of once per form load.
  • A 'simple' query that runs fine in isolation but takes minutes inside a larger query — because Access materializes the inner query into a temp table on every outer row.
  • Temp query and scratch table accumulation — Jet doesn't always clean up intermediate results, and bloated databases compound every other performance problem.
  • Pass-through queries used wrong or not at all — Jet doing aggregation work that SQL Server would handle in milliseconds if the query were written as a pass-through.

What an MS Access Performance Expert Actually Does

  • Baseline measurement first: timer the specific slow forms, queries, and reports with actual row counts before touching anything. No guessing, no 'it feels slow.'
  • Query plan analysis: trace how Jet/ACE is executing each slow query — which tables it's scanning, whether indexes are being used, what the intermediate row counts are at each join.
  • Join and criteria fixes: rewrite non-sargable filters, add missing join conditions, restructure nested queries that Jet materializes unnecessarily.
  • Index strategy: add indexes on the actual filter and join columns the slow queries use. Not every column — the right columns, weighted by query frequency and selectivity.
  • Form event review: identify DLookup and domain aggregate calls in Current, Load, and timer events that execute per-row instead of per-form-open, and restructure them.
  • Record source scoping: rewrite form and report record sources to return only the rows the user needs, not the full table.
  • FE/BE architecture review: assess whether the performance problem is query-related or network-related, and recommend the right fix for each.
  • Before/after documentation: written timing comparison on the same hardware and data volume, so you can verify the fix and show it to your team.

Can You Optimize a Slow Access Database Without Migrating to SQL Server?

In most cases, yes. The databases I'm brought in to profile are usually slow because of query design and index problems, not because Access is genuinely at its limits. A query that's slow because it's missing an index on CustomerID is not evidence that Access needs to be replaced — it's evidence that nobody added the index. A form that's slow because it loads 200,000 records is not an Access capacity problem — it's a record source scoping problem. These are fixable in Access without touching the data, without migration, and without downtime.

The cases where SQL Server migration is genuinely the right answer are narrow: more than 15–20 simultaneous writers hitting the same tables with real write contention, data volume that has grown past what Jet/ACE handles efficiently for your specific query patterns, or enterprise security requirements that Access can't enforce at the engine level. I'll tell you honestly which category you're in after profiling the actual slow paths. If the problem is fixable in Access, I fix it in Access. I don't recommend migrations to generate a larger scope.

What I will tell you directly: if the performance problem is network latency — Access running across a VPN or slow WAN connection with bound forms generating multiple round trips per interaction — the fix is architecture, not more indexes. Either the database needs to run locally where the data lives (terminal server, RemoteApp), or the forms need to be redesigned for offline-first use with synced data. More VBA won't fix physics. I'll say that clearly rather than selling you months of optimization work that won't move the needle.

Who Hires an MS Access Performance Expert

Operations managers with a database that stopped being usable

A database that ran fine for three years is now so slow that users are complaining daily. Nobody on staff knows why it changed or how to fix it. They need someone who will profile the actual slow paths and fix the right thing — not guess with indexes.

IT directors evaluating SQL Server migration

Considering migrating an Access database to SQL Server because it's slow. They need an honest assessment of whether migration will actually solve the performance problem — or whether the problem is in the query design and will migrate with the data.

Finance teams whose month-end reports take hours

Running an AR aging, a revenue summary, or a GL reconciliation report that used to finish in under a minute and now takes most of the morning. They need the query fixed so month-end close doesn't require starting reports the night before.

Developers who optimized what they know and hit a wall

Added indexes, rewrote obvious queries, and still can't get the performance they need. They need Access-specific expertise — Jet engine behavior, pass-through query design, form architecture — that goes beyond general database optimization knowledge.

Businesses with remote users on slow connections

Running Access across a VPN or WAN connection where performance degraded significantly compared to local use. They need an honest assessment of whether the problem is solvable with query optimization or requires architecture changes.

Companies whose Access database is approaching 2GB

Watching the database file size grow toward the Jet limit with monthly compact anxiety. They need a performance expert who understands what's driving the growth and what can be done — archiving, splitting, or migrating specific tables — before the file hits the limit.

What a Fixed Access Database Performance Problem Looks Like

  • The slow report that used to take 12 minutes runs in under 90 seconds — with documented before/after timing on the same hardware and data volume.
  • Form navigation that was stuttering on every record is responsive again — because the DLookup calls that were executing per row now execute once on form load.
  • The month-end close doesn't require starting reports the night before — because the query is parameterized to the current period and indexed on the date column it filters on.
  • The database file size is stable — because bloat sources are identified, archived, or moved, not just compacted away temporarily.
  • A written list of what was slow, what was changed, and how to verify the improvement — so your team can maintain it and your IT can explain it to the next person.

How an MS Access Performance Engagement Works

  • You name the slow object: which form, query, or report is slow and by approximately how much. 'Everything is slow' is a starting point — 'the Monthly Revenue Summary report takes 14 minutes to preview' is a diagnosis starting point.
  • I baseline on a copy with realistic data volume: measure the slow object timing, trace the query execution, identify which join or index is causing the bottleneck.
  • Targeted fix: change the smallest thing that produces the largest improvement. Index the right column. Rewrite the specific join. Scope the form record source. Measure again.
  • If the fix is architectural — network latency, file size limits, concurrent write volume — I tell you that directly with a recommendation for what the correct fix is, even if it's outside my scope.
  • Written before/after: timing on the same hardware, same data volume, before and after the change. You can verify it and share it with your team.

Case Study (Short)

The situation

A US distribution company running daily order processing in Access. The main order entry form had been getting progressively slower over 18 months — from about 3 seconds to open to over 40 seconds. A previous attempt to fix it added several indexes that didn't help. IT was scoping a SQL Server migration on the assumption that Access had "hit its limits." The database had approximately 380,000 order records and 2.1 million order line records.

What actually happened

The form's record source was SELECT * FROM Orders with no WHERE clause — all 380,000 records loaded across the network on every open. The previous indexes were added to columns that weren't in any WHERE clause or JOIN condition, so they didn't help. The fix: rewritten record source with a date-range WHERE clause defaulting to the current month, index added on the OrderDate column. Form open time: 2.8 seconds. SQL Server migration cancelled. The fix took four hours on a copy of the database.

Honest Limits: When Access Performance Problems Can't Be Fixed in Access

Performance problemFixable in Access?Correct fix
Missing index on filter columnYesAdd the index — takes minutes, often solves the problem entirely
Non-sargable WHERE clause preventing index useYesRewrite the filter expression to be sargable
Cartesian join from missing join conditionYesAdd the join condition — row count and runtime drop proportionally
DLookup calls in Form_Current per rowYesMove to calculated field in record source or cached collection
Bound form loading full table record sourceYesAdd WHERE clause to scope the record source to needed rows
Slow query nested 5 levels deepUsuallyRestructure with staging queries or pass-through where appropriate
WAN/VPN latency with bound form architecturePartiallyTerminal server, RemoteApp, or form redesign for offline-first use
15+ simultaneous writers with page-lock contentionNoSQL Server backend with Access front end
Data volume past Jet/ACE efficiency limitsNoSQL Server migration for the affected tables

Hire an MS Access Performance Expert — USA, UK & Canada

Remote Access database performance optimization delivered across three countries.

When you hire an MS Access performance expert for the USA, UK, or Canada, you get senior-led work: measured baselines before any change, targeted fixes on the actual slow paths, and plain before/after timing notes you can share with your team. I work with operations managers, IT directors, and finance teams in the cities below — and beyond this list when time zones and secure file transfer align.

USA

New YorkLos AngelesChicagoHoustonPhoenixPhiladelphiaSan AntonioSan Diego

UK

LondonManchesterBirminghamLeedsGlasgowLiverpoolNewcastleSheffieldBristolEdinburghCardiffBelfastNottinghamSouthamptonBrighton

Canada

TorontoMontrealVancouverCalgaryEdmontonOttawaWinnipegQuebec CityHamiltonHalifaxVictoriaSaskatoonReginaKitchenerMississauga

United States, United Kingdom, and Canada—cities and regions above are examples of where clients hire me; remote delivery works the same elsewhere when hours overlap.

Don't see your city listed?

I work remotely across the USA, UK, and Canada. When you hire an MS Access performance expert through this site, you get me on the thread — not a relay desk.

Related: MS Access performance optimization and hire MS Access developer for broader builds.

Remote Performance Work Coverage

Remote delivery across the USA, UK, Canada, and globally where secure file transfer and time zones align. Performance work requires a copy of the database with realistic data volume — sanitized or anonymized records are fine. I don't need live production access for profiling and optimization.

Related pages

What clients say

Operations and finance leads—real engagements, not placeholder quotes.

Olivia R.

Operations Manager, Logistics Firm (USA)

Five stars—our MS Access database developer rebuilt reporting so leadership trusts the numbers. Weekly reporting dropped by more than half with zero manual merges.

Callum P.

Director, Manufacturing SME (UK)

Outstanding Access database services: they repaired corruption, fixed slow queries, and documented everything. Our team finally has a stable system we can grow with.

Amelia D.

Finance Lead, Distribution Company (Canada)

Professional, fast, and clear. As an MS Access consultant they nailed scope, hit milestones, and cut finance support tickets dramatically—highly recommend.

Frequently asked questions

Straight answers about fixing slow Microsoft Access databases — what causes the problem, what fixes it, and what to send to get started.

How do I fix a slow Microsoft Access database without losing data?
The correct approach is to profile first, change second. You identify which specific form, query, or report is slow and by how much — with actual timer measurements, not impressions. Then you make targeted changes: add indexes on the join and filter columns that query uses, fix the join shape if it's creating row multiplication, reduce the record source on bound forms to the rows the user actually needs. None of these changes touch data — they change query structure, index definitions, and form record source scoping. Data loss is a risk of compacting incorrectly or making structural changes without a backup, which is why I work on copies and document every change before it goes to production.
Why is my Microsoft Access database suddenly slow after years of working fine?
Three common causes. First, data volume crossed a threshold where a query that previously returned results fast now has to scan enough rows that the missing index becomes visible — what was a 0.3 second query at 10,000 rows becomes a 45 second query at 500,000 rows. Second, an Office update changed something in the Jet/ACE engine's behavior or query planner. Third, the network or file share path changed — Access is unusually sensitive to latency because bound forms generate multiple network round trips per field per record. The diagnostic tells you which of the three it is, because the fix is completely different for each.
Can you optimize an Access database without migrating to SQL Server?
In most cases, yes — and I'll tell you honestly which category you're in after profiling the actual slow paths. The majority of Access performance problems I fix are fixable without migration: join shapes producing more rows than needed, missing indexes on filter and join columns, DLookup calls in form Current events executing once per row instead of once per form load, nested subqueries that Jet materializes into temp tables unnecessarily, and forms bound to full table record sources when they only display 20 rows at a time. SQL Server migration solves specific problems — concurrent write volume, data size, and row-level security. It doesn't solve bad query design, and those problems migrate with the data.
What causes slow Access database queries and how do you fix them?
The most common causes in order of frequency: missing indexes on the columns used in WHERE clauses and JOIN conditions (the Jet optimizer can't use an index it doesn't have), non-sargable filter criteria that prevent index use even when the index exists (functions wrapped around indexed fields, LIKE '%text%' patterns), Cartesian join products from missing join conditions that multiply rows before filtering, five-level nested subquery chains that Access materializes into temp tables at each level, and unbound queries in form record sources that pull the entire table across the network before filtering client-side. Each of these has a specific fix — and measuring before and after tells you whether the fix actually worked.
How do you speed up a slow Access report without changing the data?
Start by identifying whether the report is slow because of the query behind it or the rendering. A report that takes 3 minutes to preview is almost always slow because of the underlying query — the rendering of Access reports is fast once the recordset is populated. Fix the query: add indexes on the date, customer, or status columns being filtered, rewrite aggregations that are running against full history when they should be parameterized to a date range, eliminate nested subqueries that run once per group instead of once per report. In some cases, a staging table approach — pre-aggregating the result into a temp table before the report runs — is the right answer. I measure before and after so you can see exactly what the fix produced.
My Access database is slow on the network but fast locally. How do you fix that?
This is an architecture problem, not a query problem — and the fix depends on whether the bottleneck is on the read side or the write side. For read-heavy workloads where users open forms that pull large record sets across the network, the fix is scoping the form record source to return fewer rows (adding a WHERE clause, implementing a search-first pattern, using a combo box to select a record before the form opens). For write-heavy workloads where multiple users are hammering the same tables over a slow connection, the right answer is usually a proper split FE/BE architecture with the backend file on a fast local file server — not across a WAN or VPN. If the backend is already split and the connection is genuinely slow, I'll tell you that directly and explain what migration to SQL Server would actually solve.
Can you fix Access performance without taking the database offline?
Adding indexes can usually be done during off-peak hours with minimal disruption — the indexing operation locks the table briefly but doesn't require the database to be offline. Query rewrites and form changes require deploying an updated front-end file, which is a non-destructive operation if the database is properly split (front end and back end in separate files). If the database is not split — one monolithic file that everyone opens simultaneously — I'll recommend splitting it as part of the performance work, because a split architecture is both a prerequisite for proper multi-user deployment and a significant performance improvement in itself.
How long does it take to fix Access database performance problems?
For targeted fixes — indexing the right columns, rewriting one slow query, fixing the record source on a slow form — typically a day to three days of focused work, depending on how many objects are involved and how complex the query structure is. The diagnostic pass to identify which objects are actually slow and why takes a few hours on a copy of the database. I baseline the timing before any change and measure after, so you have a concrete before/after comparison rather than an impression that 'it seems faster.'
Do you need access to my live production database to fix performance?
No — and I prefer not to work on live production databases for performance tuning. I need a copy (sanitized if needed) to reproduce the performance problem under similar data volume conditions, a description of which objects are slow and by how much, and your Access and Office version plus bitness. If the performance problem only reproduces with a specific data volume or data distribution, a copy with realistic data volume (anonymized records are fine) is more useful than a sample with 100 rows.
What should I send to get a performance diagnosis?
Three things: the name of the slow form, query, or report (be specific — 'everything is slow' is a starting point, but 'the Monthly AR Aging report takes 12 minutes to preview' is a diagnosis starting point), a rough sense of the data volume (how many rows in the main tables involved), and a copy of the database or at minimum the schema. Your Access and Office version and bitness (32 or 64-bit) also matter — query plan behavior differs between builds. If you have timing measurements already, include them. If not, I'll establish baselines as the first step.

Hire an MS Access Performance Expert When Slow Has a Name and a Number

Send the slow object name, rough row counts, and your Access version. Limited weekly capacity — performance work stays measured and senior-led.

No relay chain. You hire an MS Access performance expert and get the person who profiles the actual slow path, makes the targeted fix, and shows you the before/after timing — same thread, start to finish.

Hire Now