Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Нужен оригинальный выход Добавлено: 23.03.06 06:20  

Автор вопроса:  Neco | Web-сайт: neco.pisem.net | ICQ: 247906854 
Имеется база. В ней несколько таблиц, но сейчас разговор о трёх: фирмы, товары и прайс-листы. Прайс-листы содержат в себе две ссылки - на фирму и на товар (есть ещё ссылки на денежную единицу и единицу измерения, но их опущу пока). При выводе всего этого в количестве от ста элементов в единый список (ListView) всё происходит очень долго (причём тормозилово при 50% проца - явно внутри SQL). Начал вводить свой кэш - как-то всё мудрёно и нехорошо.
Как правильно организовать вывод? Основной тормоз на этапе связки прайс-листов с отварами и фирмой, но как этого избежать?

Ответить

  Ответы Всего ответов: 12  

Номер ответа: 1
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #1
Добавлено: 23.03.06 10:48
я загнал все данные в user type массив и уже выводил оттуда... выходит быстрее. (см. виртуальный листвью)

Ответить

Номер ответа: 2
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #2 Добавлено: 23.03.06 11:11
А может стоит таблицы нормально проиндексировать?

Ответить

Номер ответа: 3
Автор ответа:
 ViktorZ



ICQ: 271202919 

Вопросов: 56
Ответов: 837
 Профиль | | #3 Добавлено: 23.03.06 15:17
А может стоит таблицы нормально проиндексировать?

Вот это реально должно помочь. А таблицы по скоко записеЙ? и запрос хотелось бы увидеть?

Ответить

Номер ответа: 4
Автор ответа:
 mc-black



ICQ: 308-534-060 

Вопросов: 20
Ответов: 1860
 Web-сайт: mc-black.narod.ru/dzp.htm
 Профиль | | #4
Добавлено: 23.03.06 16:34
на этапе связки прайс-листов с отварами и фирмой

Без зелий и отваров никуда! :)

Такой запрос что-ли?
SELECT TOP 100 price.tovar, price.firma, price.cena FROM price

Ответить

Номер ответа: 5
Автор ответа:
 Neco



ICQ: 247906854 

Вопросов: 133
Ответов: 882
 Web-сайт: neco.pisem.net
 Профиль | | #5
Добавлено: 24.03.06 05:31
Между прочим (совсем забыл сказать), что пишу на VB2005.NET. А вопрос вставил в общий форум, т.к. непонятно в чём у меня проблема - то ли неправильно юзаю NET, то ли SQL.

А может стоит таблицы нормально проиндексировать?

А что это значит? Проставить key колонки?

и запрос хотелось бы увидеть

Запросы в основном
SELECT * FROM tab_name WHERE(id=?)

Причём сложности и медленности добавляет ещё то, что фирма в свою очередь тоже содержит в себе ссылки, к примеру, на структуру организации (ТОО, АО - они хранятся в таблице tab_Words, где находится также их полное название и категория слова), т.е. чтобы нормально вывести организацию в поле списка, мне надо первым запросом извлечь организацию и если ссылка word_id>0 то запросить ещё и слово. Т.е. в общем случае имею 3 обращения к таблице слов (структура фирмы, деньги, единица измерения) + запрос фирмы + запрос товара (кстати, запрос товара содержит в себе ещё кучу ссылок, которые придётся потом раскрывать, но я этого пока не делал, т.к. уже офигенно тормозит).

я загнал все данные в user type массив и уже выводил оттуда... выходит быстрее. (см. виртуальный листвью)

Ну это собственно так и собирался делать кэш. Но тут проблема с обновлением этого кэша, чтобы он всегда показывал корректную инфу.

Кстати говоря, вчера, когда задал вопрос, пришёл домой и понял, что я слишком часто обращаюсь к базе данных, т.к. я каждый раз при запросе использую Adapter. Начал делать кэширование через Таблицы DataSet - пока ещё не до конца сделал (только таблицу слов), но разница уже есть. До этого обновление 1000 товаров занимало 30 секунд, теперь 10. Надеюсь, что это путь в нужную сторону, только беспокоит тот момент, что вся база будет храниться в оперативке, а это значит, что и без того прожорливая прога, начнёт жрать ещё больше.

Ответить

Номер ответа: 6
Автор ответа:
 Mihalыch



ICQ: 373-509-101 

Вопросов: 56
Ответов: 330
 Профиль | | #6 Добавлено: 24.03.06 07:07
Neco, не сомневаюсь что ты понимаешь что делаешь, но так на всякий случай. Может стоит пересмотреть структуру базы (нормализовать её). У меня есть програ, работает с Access, в базе в одной из таблиц более 5000 записей и запрос типа SELECT * FROM tab_name WHERE(id=?) проходит без задержек, а ведь у меня mdb, который считается медленнее SQL.

Меня вот что насторожило
Причём сложности и медленности добавляет ещё то, что фирма в свою очередь тоже содержит в себе ссылки, к примеру, на структуру организации (ТОО, АО - они хранятся в таблице tab_Words, где находится также их полное название и категория слова), т.е. чтобы нормально вывести организацию в поле списка, мне надо первым запросом извлечь организацию и если ссылка word_id>0 то запросить ещё и слово.

т.е. если я правильно понял, у тебя в таблице tab_Words может быть много записей с названием одной и той же фирмы..., если так то нужно это изменить.
Надеюсь в тему ляпнул.

Ответить

Номер ответа: 7
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #7 Добавлено: 24.03.06 11:20
Попробуй, к примеру

CREATE CLUSTERED INDEX MyTableIndex
   ON MyTable (FieldsOne, FieldTwo)

для каждой таблицы. Только сначала проверь, возножно уже есть PRIMARY KEY.

Ответить

Номер ответа: 8
Автор ответа:
 Neco



ICQ: 247906854 

Вопросов: 133
Ответов: 882
 Web-сайт: neco.pisem.net
 Профиль | | #8
Добавлено: 25.03.06 05:27
т.е. если я правильно понял, у тебя в таблице 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 у меня скорость ещё больше возрастёт?

Ответить

Номер ответа: 9
Автор ответа:
 AndreyMp



ICQ: 237822510 

Вопросов: 28
Ответов: 1182
 Профиль | | #9 Добавлено: 25.03.06 05:36
чем отличается mdb от SQL
Как бы это сказать. Это разные форматы баз данных ( Access и SQL Server), а SQL это правда язык интерфейса.
А если я буду использовать ADO.NET у меня скорость ещё больше возрастёт?
Вот это вряд ли. Бывает что с определенной базой DAO показывает наилучшие результаты в скорости.

Ответить

Номер ответа: 10
Автор ответа:
 Павел



Администратор

ICQ: 326066673 

Вопросов: 368
Ответов: 5968
 Web-сайт: www.vbnet.ru
 Профиль | | #10
Добавлено: 26.03.06 15:33
Зачем выбирать сначала запись, потом "еще слово", если все это можно
сделать единым запросом, объединив таблицы ключевым словом INNER JOIN?

Насчет Clustered Index... Насколько я знаю, он плохо себя будет вести,
если данные в таблице будут часто изменяться. Или я не прав?

Ответить

Номер ответа: 11
Автор ответа:
 GSerg



Вопросов: 0
Ответов: 1876


 Профиль | | #11 Добавлено: 26.03.06 18:03
Если строки будут удаляться не из конца таблицы, или добавляться не в конец таблицы, или если значение первичного ключа будет меняться, то таки да, кластерный будет себя плохо вести.

Ответить

Номер ответа: 12
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #12 Добавлено: 28.03.06 10:43
Ну, как бы это сказать, про изменение таблиц ничего не оговорено...
А так конечно, вариантов много, для разных случаев...

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам