Если база данных MS Access начинает «тормозить», медленно открываются формы, отчеты, виной тому чаще всего являются тяжелые запросы. Первым делом необходимо определить над каким именно запросом задумывается Access, а затем приступить к его оптимизации. Во «взрослых» базах данных, таких как Oracle, MS SQL Server, PostgreSQL, MySql есть документированные средства, позволяющие взглянуть на выполнение запроса глазами SQL-сервера. Я говорю о плане выполнения запроса.

А как же в Access? Неужели разработчики не предусмотрели возможность просмотра плана выполнения запроса?

Оказалось такая возможность есть, просто она недокументированная. Если в разделе реестра
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Debug] создать строковый параметр JETSHOWPLAN и присвоить ему значение ON, то это заставит Access (после перезапуска) создавать текстовый файл showplan.out в папке Мои документы, в котором будет содержаться план выполнения запросов.

Пример создание JETSHOWPLAN

Построение плана выполнения запросов происходит в момент компиляции последних. Существующие запросы уже, как правило, скомпилированные. Чтобы заставить Access перекомпилировать запрос, нужно его изменить (как вариант открыть запрос, перейти в режим SQL и добавить пробел в конце), сохранить и выполнить.

Пример плана выполнения запроса Sales by Category из базы данных Northwind:

--- Sales by Category ---

- Inputs to Query -
Table 'Categories'
    Using index 'PrimaryKey'
    Having Indexes:
    PrimaryKey 8 entries, 1 page, 8 values
      which has 1 column, fixed, unique, clustered and/or counter, primary-key, no-nulls
    CategoryName 8 entries, 1 page, 8 values
      which has 1 column, fixed, unique
Table 'Products'
    Using index 'PrimaryKey'
    Having Indexes:
    PrimaryKey 77 entries, 1 page, 77 values
      which has 1 column, fixed, unique, clustered and/or counter, primary-key, no-nulls
    CategoryID 77 entries, 1 page, 8 values
      which has 1 column, fixed
    CategoriesProducts 77 entries, 1 page, 8 values
      which has 1 column, fixed
Table 'Orders'
Table 'Order Details'
    Using index 'OrdersOrder Details'
    Having Indexes:
    OrdersOrder Details 2155 entries, 5 pages, 830 values
      which has 1 column, fixed
    OrderID 2155 entries, 5 pages, 830 values
      which has 1 column, fixed
Table 'Products'
    Using index 'PrimaryKey'
    Having Indexes:
    PrimaryKey 77 entries, 1 page, 77 values
      which has 1 column, fixed, unique, clustered and/or counter, primary-key, no-nulls
    CategoryID 77 entries, 1 page, 8 values
      which has 1 column, fixed
    CategoriesProducts 77 entries, 1 page, 8 values
      which has 1 column, fixed
- End inputs to Query -

01) Restrict rows of table Orders
      using rushmore
      for expression "Orders.OrderDate Between #1/1/1995# And #12/31/1995#"
02) Inner Join result of '01)' to table 'Order Details'
      using index 'Order Details!OrdersOrder Details'
      join expression "Orders.OrderID=[Order Details Extended].OrderID"
03) Inner Join result of '02)' to table 'Products'
      using index 'Products!PrimaryKey'
      join expression "[Order Details Extended].ProductID=Products.ProductID"
04) Inner Join result of '03)' to table 'Categories'
      using index 'Categories!PrimaryKey'
      join expression "Products.CategoryID=Categories.CategoryID"
05) Inner Join result of '04)' to table 'Products'
      using index 'Products!PrimaryKey'
      join expression "[Order Details].ProductID=Products.ProductID"
06) Group result of '05)'

Следует отметить, что включение возможности вывода плана выполнения запроса оправдано лишь во время разработки/отладки приложения, поскольку может приводить к некоторому замедлению работы Access. Для отключения вывода плана выполнения запроса достаточно изменить значение параметра реестра JETSHOWPLAN с ON на OFF.

Для того, чтобы каждый раз не копаться в реестре я создал два файла: jetshowplan-on.reg и jetshowplan-off.reg для включения и отключения вывода плана выполнения соответственно.