Хотел на страницах этого форума поставить такой вопрос: как у Access обстоят дела со скоростью выполнения тех или иных запросов?
Я столкнулся с проблемой, когда самый что ни есть элементарный запрос ввергал мой компьютер в хаос каких-то вычислений на столь длительное время, что я сперва считал это ошибкой в работе программы и безрезультатно искал ее на протяжении довольно длительного времени. Оказалось, что это все ж таки Access не в состоянии справиться с таким, например, запросом, когда надо выбрать все записи одной таблицы, которых нет в другой. (Прошу только не считать меня полным идиотом: все было сведено к связям по целым индексированным столбцам !!!)
Так вот, когда в таблицах этих записей не слишком много (штук по 100), то все идет как надо и, в общем, довольно красиво. Но вот когда там записей тысяч по десять... (В каждой таблице)
Вот я и хочу попросить совета: можно ли как-то разрешить эту проблему в самом Access? ("вручную" я делаю ту же операцию на пару-другую порядков быстрее)
Marat 23.08.2001
Запросы генерируемые построителем Аксессом автоматически далеко не всегда рациональны. Если писать их вручную, то они будут работать побыстрее. Хотя такой уж аграмадной разницы я не замечал.
Мне все ж таки кажется, что проблема у тебя не из-за Аксесса, а из- за чего еще.
Народ пользует Аксесс уже больше 10 лет. На такую "мелочь" как ужаснейшее торможение при обработке запроса по 2 таблицам с запясями в количестве больше 100 обратил бы внимание давно.
Я сам обрабатывал таблицы .dbf подключенные к Аксессу, что еще больше должно тормозить систему из-за дополнительных интерпретаций, таблицы были до 40 000 записей. Скорость была вполне приемлема. Другие таблицы тоже дебеэфки были подключены к формам кучей подформ, содержали по 5 тысяч. Все отображалось почти мновенно. Причем по сети (с маленьким трафиком) и на пентюхах 133 и 200.
В общем не наезжай на нашу единственную лубов.
Ольга 24.08.2001
Access в состоянии справиться с таким запросом Судя по описанию запрос должен быть такой.
SELECT * FROM T1 WHERE NOT EXISTS( SELECT * FROM T2 WHERE T1.num=T2.num);
Если столбцы num проиндексированы, то работает такой запрос практически безо всякой задержки.
В тестовом примере: в таблицах Т1 и Т2 по 10 тыс.записей, значения в столбце num уникально. (Если значения в столбце T2.num дублируются, то скорость еще быстрее)
Можно посмотреть на запрос, который выполняется с задержкой?
Alex Fogol 27.08.2001
Запрос примерно такой:
SELECT nNum FROM FTable WHERE nNum NOT IN (SELECT nNum FROM STable);
(имена и даты изменены, дабы не было возможности провести какие-либо аналогии с реальными фактами... :)
Alex Fogol 31.08.2001
Хм... Судя по всему, что-то из этого может получиться... Хотя, честно говоря, я пока не пойму, как именно предложенный Вами вариант запроса работает... :)
Ольга 12.09.2001
Дело не в производительности всеми любимого Access`a Извиняюсь за несвоевременный ответ, только что обнаружила этот вопрос.
Повторю здесь оба запроса, для удобства их рассмотрения:
Выполняется с задержкой:
SELECT nNum FROM T1 WHERE nNum NOT IN (SELECT nNum FROM T2);
Без задержки:
SELECT nNum FROM T1 WHERE NOT EXISTS( SELECT * FROM T2 WHERE T1.nNum=T2.nNum);
Последний запрос работает следующим образом. Условие с использованием NOT EXISTS(подзапрос) возвращает TRUE, если нет ни одной записи, возвращаемой подзапросом, и возвращает FALSE, если есть записи. Если в подзапросе проиндексировано поле, по которому построено условие этого подзапроса, то результат происходит практически мгновенно – нет такого значения поля в индексе, т.е. NOT EXISTS, след. условие главного запроса =TRUE. Если в подзапросе НЕпроиндексировано поле, по которому построено условие этого подзапроса, то подзапрос будет работать зачительно долше, т.е. чтобы определить, что по данному условию нет записей, надо их все просмотреть :)
Теперь о различиии в использовании WHERE NOT EXISTS(подзапрос) И WHERE nNum NOT IN (подзапрос).
NOT IN – это проверка среди списка значений. Поэтому после выполнения подзапроса должно произойти сравнение указанного в главном запросе поля с этим полученным списком. Причем, раз стоит условие NOT IN, значит, проверить на несовпадение надо ВСЕ значения из списка.
NOT EXISTS проверяет только наличие записей в подзапросе. ЕСТЬ или НЕТ.
Т.е. операция NOT IN работает значительно дольше.
Любимый всеми Access оказался не виноват :) И наездов ;) "на нашу единственную лубов"[цитата из Марата] мы не допустим ;)