Гость
Форумы / C++ [игнор отключен] [закрыт для гостей] / почему так долго работает??? / 5 сообщений из 5, страница 1 из 1
08.08.2002, 13:46
    #32041827
konst
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
почему так долго работает???
При помощи АДО делают запрос к аксесовской базе, точнее двум, но работает жуть как медленно. Есть две одинаковые базы, но содержимое таблиц немного различается, хочу получить эту самую разницу между двумя таблицами по ключу. Ключ - код продукта, остальные поля - прочая инфа про продукт. Вот хочу узнать, сколько кодов отличается при помощи вот какого запроса:
Код: plaintext
1.
SELECT COUNT(a. "COD" ) FROM  "c:\prj\20020201 .mdb". "export"  a WHERE a. "COD"  NOT IN (select b. "COD"  from  "c:\prj\20020101 .mdb". "export"  b WHERE a. "COD"  = b. "COD" )

а, в общем, работает такой код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
CREATEiNSTANCE(spCON,Connection);
spCON->ConnectionString = _bstr_t( "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=20020101 .mdb");
spCON->Open(  "", "  ", " ", - 1  );
CREATEiNSTANCE(spRS,Recordset)
spRS->PutRefActiveConnection( spCON );
unsigned ticks = GetTickCount();
spRS->Open(t, vtMissing, adOpenKeyset, adLockBatchOptimistic, - 1 ); // в t - тот самый запрос
ticks = GetTickCount() - ticks; // в тикс порядка  300   000 

в таблицах примерно по 8000 записей, запрос выполняется целых 5 минут, может всё дело в запросе или так и должно всё тормозить???
...
Рейтинг: 0 / 0
17.10.2002, 12:12
    #32059124
Kilroy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
почему так долго работает???
Дело в запросе.
Проще эту операцию разбить на 2 этапа
1 этап - подсчитать коды, которые присутствуют в обеих
таблицах
2 этап - вычесть из общего числа продуктов кол-во совпадающих,подсчитанное на этапе 1
...
Рейтинг: 0 / 0
17.10.2002, 13:30
    #32059168
Vlad_P
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
почему так долго работает???
Я не думаю, что так проще. Точнее уверен.
Лучше запрос написать так:

select count(a.cod) from Table1 a where not exists
(select 'X' from Table2 b where b.cod=a.cod);

или так

select count(a.cod) from Table1 a
where a.cod not in
(select b.cod from Table2 b);

Не знаю, что будет из них быстрее. Надо посмотреть.
...
Рейтинг: 0 / 0
18.10.2002, 20:21
    #32059919
The Lex
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
почему так долго работает???
NOT EXIST будет быстрее...

Сталкивался с подобной проблемой. Все дело в запросе - уж больно медленно работает 'someone IN (sometwo)'. В одном месте ушел на "ручное программное решение", в другом написал (хорошо, помогли мне написать) такой запрос:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
SELECT
 field
FROM table_1
WHERE NOT EXISTS
 (SELECT
   field
  FROM table_2
  WHERE table_2.field = table_1.field);
...
Рейтинг: 0 / 0
21.10.2002, 09:54
    #32060086
Vlad_P
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
почему так долго работает???
И все таки, это во многом зависит от используемой БД, количества записей в таблицах, наличия индексов в этих таблицах.
Так что результаты могут быть прямо противоположными.
Пример.
Таблица 2 содержит всего одну запись, и для таблицы 1, содержащей 10000 записей построен индекс.

Запрос с IN произведет только три быстрых операции
1. Выборка из Таблица 2 одного значения
2. Выборка из таблицы 1 по индексу. Например, Оракл умеет использовать индекс в запросах с IN.

Запрос с Exists же будет просматривать всю таблицу 1.

Так что ситуация не всегда однозначная и лучше проверить оба типа запроса.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / почему так долго работает??? / 5 сообщений из 5, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]