Автор вопроса: Neco | Web-сайт:neco.pisem.net | ICQ: 247906854
Имеется база. В ней несколько таблиц, но сейчас разговор о трёх: фирмы, товары и прайс-листы. Прайс-листы содержат в себе две ссылки - на фирму и на товар (есть ещё ссылки на денежную единицу и единицу измерения, но их опущу пока). При выводе всего этого в количестве от ста элементов в единый список (ListView) всё происходит очень долго (причём тормозилово при 50% проца - явно внутри SQL). Начал вводить свой кэш - как-то всё мудрёно и нехорошо.
Как правильно организовать вывод? Основной тормоз на этапе связки прайс-листов с отварами и фирмой, но как этого избежать?
Между прочим (совсем забыл сказать), что пишу на VB2005.NET. А вопрос вставил в общий форум, т.к. непонятно в чём у меня проблема - то ли неправильно юзаю NET, то ли SQL.
А может стоит таблицы нормально проиндексировать?
А что это значит? Проставить key колонки?
и запрос хотелось бы увидеть
Запросы в основном
SELECT * FROM tab_name WHERE(id=?)
Причём сложности и медленности добавляет ещё то, что фирма в свою очередь тоже содержит в себе ссылки, к примеру, на структуру организации (ТОО, АО - они хранятся в таблице tab_Words, где находится также их полное название и категория слова), т.е. чтобы нормально вывести организацию в поле списка, мне надо первым запросом извлечь организацию и если ссылка word_id>0 то запросить ещё и слово. Т.е. в общем случае имею 3 обращения к таблице слов (структура фирмы, деньги, единица измерения) + запрос фирмы + запрос товара (кстати, запрос товара содержит в себе ещё кучу ссылок, которые придётся потом раскрывать, но я этого пока не делал, т.к. уже офигенно тормозит).
я загнал все данные в user type массив и уже выводил оттуда... выходит быстрее. (см. виртуальный листвью)
Ну это собственно так и собирался делать кэш. Но тут проблема с обновлением этого кэша, чтобы он всегда показывал корректную инфу.
Кстати говоря, вчера, когда задал вопрос, пришёл домой и понял, что я слишком часто обращаюсь к базе данных, т.к. я каждый раз при запросе использую Adapter. Начал делать кэширование через Таблицы DataSet - пока ещё не до конца сделал (только таблицу слов), но разница уже есть. До этого обновление 1000 товаров занимало 30 секунд, теперь 10. Надеюсь, что это путь в нужную сторону, только беспокоит тот момент, что вся база будет храниться в оперативке, а это значит, что и без того прожорливая прога, начнёт жрать ещё больше.
Neco, не сомневаюсь что ты понимаешь что делаешь, но так на всякий случай. Может стоит пересмотреть структуру базы (нормализовать её). У меня есть програ, работает с Access, в базе в одной из таблиц более 5000 записей и запрос типа SELECT * FROM tab_name WHERE(id=?) проходит без задержек, а ведь у меня mdb, который считается медленнее SQL.
Меня вот что насторожило
Причём сложности и медленности добавляет ещё то, что фирма в свою очередь тоже содержит в себе ссылки, к примеру, на структуру организации (ТОО, АО - они хранятся в таблице tab_Words, где находится также их полное название и категория слова), т.е. чтобы нормально вывести организацию в поле списка, мне надо первым запросом извлечь организацию и если ссылка word_id>0 то запросить ещё и слово.
т.е. если я правильно понял, у тебя в таблице tab_Words может быть много записей с названием одной и той же фирмы..., если так то нужно это изменить.
Надеюсь в тему ляпнул.
т.е. если я правильно понял, у тебя в таблице tab_Words может быть много записей с названием одной и той же фирмы..., если так то нужно это изменить.
Нет. Названия фирм у меня хранятся в таблице фирм, а в таблице слов (id,name,short,category). У меня хранятся структуры предприятий (к примеру: id=1;name="Акционерное общество";short="АО";category=5). И всё АО имеют ссылку word_ptr=1. Т.е. никаких повторений нет.
для каждой таблицы. Только сначала проверь, возножно уже есть PRIMARY KEY.
Primary у меня id у каждой таблицы.
--------------------------
Кстати говоря, у меня всё получилось! И память вроде как не очень расходуется - при тысяче товарах в DataTable расход памяти возрастает с 20 мегов до 22. Зато скорость жуткая - всю тысячу выводит в ListView (который сам по себе медленный) меньше чем за секунду.
Только вот появился другой вопрос: чем отличается mdb от SQL? Я думал, что mdb это просто формат базы данных, а sql это язык интерфейса и сравнивать эти два понятия нельзя.
А если я буду использовать ADO.NET у меня скорость ещё больше возрастёт?
Если строки будут удаляться не из конца таблицы, или добавляться не в конец таблицы, или если значение первичного ключа будет меняться, то таки да, кластерный будет себя плохо вести.