Access. Программирование на VBA

Оценка типа результирующего набора для достижения оптимальной производительности


Jet, кроме того, рассматривает запрашиваемый результирующий набор. Например, для представления динамического множества может быть выполнен план, который эффективно представляет первую стра­ницу данных, даже если отображение оставшихся записей происходит медленнее. Для образования дина­мического множества Jet создает набор уникальных ключевых значений, которые указывают на строки соответствующей базовой таблицы. Таким образом, для Jet достаточно получить только ключевые значе­ния, а оставшиеся записи будут отображены тогда, когда они понадобятся пользователю. Однако в снимках Jet перед представлением результата собирает все записи и столбцы для результирующего набора. Если весь снимок не помещается в памяти, его часть переходит в файл подкачки, что отрицательно сказывается на производительности. Гораздо большую производительность можно получить при использовании большого динамического множества.

Во-первых, Jet оценивает имеющиеся опции доступа к базовым таблицам. Каждый план доступа к базовой таблице получает соответствующую оценку. Затем Jet оценивает имеющиеся опции объединения. Механизм Jet рассматривает только объединение результата отношения с базовой таблицей, а не объе­динение результатов одной связи с результатами другой. Это помогает ограничить количество времени, которое уходит на оптимизацию запросов. После анализа каждой доступной стратегии объединения с каждой стратегией доступа к базовым таблицам и рассмотрения типа результирующего набора записей Jet выбирает план.

Для выполнения запроса к таблицам, не являющимся таблицами ODBC, Jet очищает план, уменьшает его размер и передает на выполнение.

Компиляция и оптимизация происходят в первый раз при создании или редактировании запроса и выполнении. Запрос может остаться нескомпилированным. Если модифицировать запрос и сохранить его, но не выполнять, запрос остается нескомпилированным. Кроме того, если модифицировать индексы таблиц чли схему данных, оптимизация запросов может нарушиться. Рекомендуется всегда открывать запросы в режиме конструктора, сохранять их и затем выполнять до распространения приложения. Такой подход обеспечивает компиляцию запросов.




Для оптимизации запросов Jet производит сложную оценку стоимости. В число этих сложных оценок входит просмотр статистики базы данных. На основе статистических данных Jet сообщается о количестве страниц данных, страниц индекса, строк в таблицах и т.д. При нестандартном завершении работы базы данных статистика может быть искажена, транзакции отменены либо базе данных может понадобиться сжатие. При оптимизации всегда вначале следует сжимать базу данных.

Как известно. Jet создает план выполнения для каждого запроса. Создав в системном реестре запись

\HKEY_LOCALMACHINS\SOFTWARE\MICROSOFT\JET\4 . 0\ENGINES\DEBUG

и установив значение строки в ON, Jet создает или добавляет текстовый файл в текущей папке плана выполнения запроса. В этот план входит многое из того, что было описано выше. План изменить невоз­можно, если не изменять схему данных, структуру запроса или ограничения запроса. Чем подробнее план, тем лучше. В листинге 3 приведен план выполнения для запроса Quarterly Orders для фирмы Northwind.

Листинг 3. План выполнения с использованием преимуществ срочной оптимизации.

--- Quarterly Orders ---

-          Inputs to Query –



-          Table 'Customers'

Using index 'PrimaryKey'

Having Indexes:

PrimaryKey 91 entries, I page, 91 values

which has 1 column, fixed, unique, primary-key, no-null

PostalCode 91 entries, 1 page, 87 values

which has 1 column, fixed

CompanyName 91 entries, 3 pages, 91 values

which has 1 column, fixed

City 91 entries, 1 page, 69 values

which has 1 column, fixed

Table 'Orders'

- End inputs to Query -

 

01) Restrict rows of table Orders

using rushmore

for expression "Orders.OrderDate Between #1/1/98# And #12/31/98#"

02) Outer Join result of '01)'  to table 'Customers'

using index 'Customers!PrimaryKey'

join expression "Orders.CustomerID=Customers.CustomerID"

03)  Sort Distinct result of '02)'

Можно увидеть раздел базовой таблицы с анализом индексов и количеством записей, баз данных, страниц индекса и оцениваемых значений. Обратите внимание, что данный запрос может быть обрабо­тан методом срочной оптимизации, поскольку существует индекс для поля Order Date таблицы Orders. План определяет связь между таблицей Orders и таблицами Customers как внешнюю связь. Индексы и срочная оптимизация прекрасно оптимизируют данный запрос. Если разработчик не уверен в том, насколь­ко хорошо был оптимизирован запрос, можно проверить план выполнения. SHOWPLAN не документи­рован и не поддерживается. Некоторые запросы не создают планов, и некоторые планы неверны, но с долей осторожности все же можно пользоваться JetShowPlan.



В листинге 4 приводится пример плохо оптимизированного запроса.

Листинг 4. Недостаточно хорошо оптимизированный план выполнения запроса без использования преимуществ оптимизации Jet.

SELECT Customers.CustomerID, Customers.CompanyName

FROM Customers INNER JOIN Orders ON

Customers.CustomerID = Orders.CustomerID

WHERE ((Not (Orders.ShipCountry)="USA")) ;

-— Customers with Shipping Address Outside USA ---

- Inputs to Query –

Table 'Orders'

Table 'Customers'

Using index 'PriearyKey'

Having Indexes:

PrimaryKey 91 entries, 1 page, 91 values

which has 1 column, fixed, unique, primary-key, no-nulls

PostalCode 91 entries, 1 page, 87 values

which has 1 column, fixed

CompanyName 91 entries, 3 pages, 91 values

which has 1 column, fixed

City 91 entries, 1 page, 69 values

which has 1 column, fixed

- End inputs to Query -

01) Restrict rows of table Orders

by scanning

testing expression "Not Orders.ShipCountry="USA""

02) Inner Join result of '01)' to table 'Customers'

using index 'Customers!PrimaryKey'

join expression "Orders.CustomerID=Customers.CustomerID"

Недостаток данного запроса заключается в способе задания критерия отбора. Поскольку ограничения не используют индекс, запрос вынужден сканировать таблицу и проверять каждую запись на удовлетво­рение условию. Сканирование таблицы — слишком дорогостоящий процесс. Использование индексов сделало бы данный запрос намного более эффективным.


Содержание раздела