План выполнения запроса в MS Access
Если база данных 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 в папке Мои документы, в котором будет содержаться план выполнения запросов.
Построение плана выполнения запросов происходит в момент компиляции последних. Существующие запросы уже, как правило, скомпилированные. Чтобы заставить 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 для включения и отключения вывода плана выполнения соответственно.

