У меня проблема с относительно простым запросом, и план выполнения Access выбирает его.
Запрос имеет такую форму
SELECT somethings
FROM A INNER JOIN (B INNER JOIN (C INNER JOIN D ON ...) ON ...) ON ...
WHERE A.primaryKey= 1 AND D.d = 2;
C и D имеют относительно небольшое количество строк.A и B имеют несколько тысяч строк.
Запрос, который возвращает 2 строки (не уверен, что это уместно), действительно медленный.Работает за 17 секунд.Если я удаляю часть AND D.d = 2
предложения where, запрос теперь возвращает 4 строки и выполняется мгновенно.
Итак, насколько я понимаю, механизм JET может выполнить запрос без фильтра для Dd мгновенно, а затем выполнитьуказанный фильтр мгновенно (только 4 строки для фильтрации).Поэтому выполнение запроса с фильтром D.d = 2
не должно быть слишком долгим.
Я попытался создать подзапрос без фильтра и включить его в другой запрос, который просто отфильтровывает результат, но этовсе еще медленноЯ предполагаю, что движок JET достаточно умен, чтобы «сгладить» подзапросы, чтобы результат был таким же.
Поскольку я не смог выполнить запрос так, как мне хотелось, я использовал JETSHOWPLAN так,Доступ выведет его план выполнения.Вот что я нашел:
Для быстрого запроса (без D.d = 2
) первым шагом плана запроса является применение фильтра A.primaryKey = 1
к таблице A.В результате получается набор данных из 1 строки из более чем 30000. Затем, кажется, что объединения выполняются из A в D с использованием индекса с набором данных, который никогда не превышает 4 строки.
Медленный запросисполняться в порядке реверса.Сначала соединяются D и C, затем проверяется D.d = 2
.После этого соединения от C до A выполняются.Делая это таким образом, данные, которые необходимо объединить из D в C, из C в B и из B в A, намного больше.Когда все JOIN будут выполнены и перед выполнением A.primaryKey=1
в наборе данных будет 120K строк.
Можно ли как-то принудительно настроить правильный план запроса в Access?
Я надеюсь, что ябыло ясно.Дайте мне знать, если я должен опубликовать планы запросов.Я не сделал, потому что они довольно большие.
Заранее спасибо,
mp