Для этого запроса ядро базы данных Access должно извлечь все 190K строк из обеих таблиц.Не удивительно, что он медленный, и медлительность усугубляется, когда движок БД должен получить 2 * 190 тыс. Строк по сети.
Если TextBox1.Text содержит «foo», это оператор, который вы спрашиваетеобработчик базы данных:
Select Data, NomNr, Preke, Matas, Kaina, Tiek
from VazPirkPrekes
Where
VazPirkPrekes.PirkVazID IN (
SELECT VazPirkimo.PirkVazID
FROM VazPirkimo
Where VazPirkimo.Sandelys like '%ALIAVOS')
and Year(VazPirkPrekes.Data)>=2011
and Preke Like '%foo%'
and Kaina > 0
Order by Preke, Data Desc
Механизм должен извлечь все строки 190 КБ из таблицы VazPirkimo, прежде чем он сможет определить, какие из них включают значения Sandelys, заканчивающиеся на «ALIAVOS».Если ваш критерий выбора был для значений, которые начинаются с"ALIAVOS", механизм может использовать индекс Sandelys, чтобы ограничить число строк, которые он должен извлечь из VazPirkimo.Однако, поскольку такой подход, вероятно, вам не подходит, рассмотрите возможность добавления числового поля Sandelys_group в VazPirkimo и создания индекса для Sandelys_group.Дайте всем строкам, где Sandelys заканчивается "ALIAVOS", одно и то же число Sandelys_group (1).Тогда ваше условие «IN ()» может быть таким:
SELECT VazPirkimo.PirkVazID
FROM VazPirkimo
Where VazPirkimo.Sandelys_group = 1
Индекс Sandelys_group позволит механизму БД получать только совпадающие строки, которые, будем надеяться, будут небольшим подмножеством строк 190K вТаблица.
Существуют и другие изменения, которые вы можете сделать, чтобы ускорить ваш запрос.Посмотрите на этот критерий в предложении WHERE:
Year(VazPirkPrekes.Data)>=2011
Это заставляет механизм БД извлекать все 190К строк из VazPirkPrekes, прежде чем он сможет определить, какие из них относятся к 2011 году. С индексом данных это должно бытьнамного быстрее:
VazPirkPrekes.Data >= #2011-01-01# AND VazPirkPrekes.Data < #2012-01-01#
Этот критерий WHERE будет быстрее с индексом на Kaina:
Kaina > 0
Ваш ORDER BY просит индексы на Preke и Data.
Order by Preke, Data Desc
Любые или все эти изменения могут помочь ускорить запрос, хотя я не знаю, насколько.Убийца - вот критерий, ГДЕ:
Preke Like '%foo%'
Проблема здесь аналогична проблеме со сравнением «как Санделис».Так как здесь запрашиваются строки, в которых Preke содержит «foo», а не начинается с «foo», механизм db не может использовать индекс Preke для получения только соответствующих строк.Он должен извлечь все 190K строк VazPirkPrekes, чтобы выяснить, какое совпадение.Если вы не можете использовать другой критерий для этого, вы будете ограничены в том, насколько вы можете ускорить запрос.