Хитрости: ускорение поиска аналогов

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Хитрости: ускорение поиска аналогов

Сообщение VVitafresh » 10.03.2006 (Пт) 23:54

Есть у меня такая задача: при перемещении по датагриду с наименованиями товаров необходимо, чтобы во втором гриде на этой же форме отображался перечень аналогов для данного товара. Аналогов обычно не более десятка (или вообще нет). База в mdb.

Как сейчас все организовано:
Есть таблица с наименованиями товаров ITEMS (~250 тыс. записей) такого вида:
Код: Выделить всё
Kod  | Name
AAA  | Name1
BBB  | Name2
CCC  | Name3
...  | ...

Вторая таблица - аналоги этих товаров ANALOGS (~130 тыс. записей). Для товара 'AAA' столько строк, сколько у него есть аналогов:
Код: Выделить всё
Kod  | Kod_analog
AAA  | AN1
AAA  | BBB
CCC  | AN3
...  | ...


Запрос поиска аналогов (для вывода во второй грид):
Код: Выделить всё
select * from ITEMS
WHERE Kod in
(SELECT Kod_analog FROM ANALOGS WHERE Kod='AAA')

И все устраивало бы, если б не скорость... Поиск аналогов длится ~1 сек. Т.е. "бегать" курсором по основной табличке (гриду) не получается (на следующую строчку не попасть, пока не найдутся аналоги для текущей).
А у аналогичной программы (писанной на Delphi), которую директор фирмы дал как образец, таких тормозов не наблюдается при точно такой же организации структуры таблиц и примерно том же объеме данных.

В общем какие методы, хитрости и прочее посоветуете, чтобы повысить скорость работы. Пока никаких идей в голову не приходит :roll:

P.S. А не может быть, что у Delphi компоненты доступа к данным реально быстрее, чем доступ в VB через ADO?
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 11.03.2006 (Сб) 5:16

Попробуй
Код: Выделить всё
SELECT i.kod, i.name
FROM ITEMS AS i
INNER JOIN ANALOGS AS a ON i.kod = a.kod
WHERE i.kod = 'AAA'


И индексы висят на обеих полях ANALOGS?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 11.03.2006 (Сб) 11:26

Можно попробовать вторую табличку загрузить целиком (в память) и при перемещении по гриду менять ей Filter.
Lasciate ogni speranza, voi ch'entrate.

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 11.03.2006 (Сб) 13:30

GSerg писал(а):Попробуй
Код: Выделить всё
SELECT i.kod, i.name
FROM ITEMS AS i
INNER JOIN ANALOGS AS a ON i.kod = a.kod
WHERE i.kod = 'AAA'

GSerg, ты гений! Решение простое и очевидное для всех, кроме меня :)

Alibek, тоже спасибо. Твой вариант мне со временем может пригодиться (в другой ситуации).
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

    TopList  
cron