Re[2]: Проектирование суммирущих таблиц, оптимизация
От: Аноним  
Дата: 27.05.09 07:52
Оценка:
Здравствуйте, KRA, Вы писали:

KRA>Здравствуйте, Аноним, Вы писали:


А>>Есть задача реализовать удобный поиск в системе. Нашел очень удачное решение на сайте mobile.de:


А>>нажмите кнопку "показать" и см. закладку слева "Ограничить поиск"


KRA>Почему-то не работает ссылка, поэтому не совсем понятно.


А>>Суть примерно такова, что есть 1 млн записей в базе данных, быстрый поиск по данным записям возможен по примерно 15 категориям. В некоторых категориях может быть до 100 и более значений.

А>>Каждое значение категории имеет подсказку количества значений если будет выбрана данная категория.

KRA>Правильно ли я понимаю, что нужно по сути для 15 категорий находить количество товаров? Если так, то лучше их считать тригером при добавлении товара в категорию.


А>>Делать насчет по общей таблицы записей не представляется возможным во вразумительное время.


А>>Для разбора данной ситуации предлагаю упрощенный вариант с четырьмя измерениями (Бренд, Категория, Модель, Продавец), для решения данной задачи предлагается создать суммирующую таблицу, в которую будут помещаться конечные "предрассчитаные" значения поиска.



А>>
А>>-- creating table
А>>CREATE TABLE PRT_SEARCH_HELPER (
А>>    COUNT_       INTEGER,
А>>    BRAND_ID     NUMERIC(18,0),
А>>    CATEGORY_ID  NUMERIC(18,0),
А>>    MODEL_ID     NUMERIC(18,0),
А>>    SELLER_ID    NUMERIC(18,0)
А>>);

А>>


KRA>Правильно ли я понимаю, что по модели тоже нужен поиск аля "сколько штук такой-то модели у такого то продавца"?

KRA>Если нет, зачем тут поле MODEL_ID?

А>>
А>>select h.category_id, sum(h.count_) from prt_search_helper h where
А>>h.brand_id=ххх
А>>and h.seller_id=ххх
А>>group by
А>>h.category_id
А>>


А>>для того, чтобы запрос работал быстро необходимо сдлеать составной индекс по brand_id и seller_id.

KRA>и category_id

А>>Чтобы грубо оценить объем данных в этой таблице необходимо перемножить количества возможных значения измерений, это покроет все комбинации данных значений допустим

А>>брендов у нас 100
А>>моделей 1000
А>>продавцов 100
А>>категорий 100
А>>получается, около 1 млрд записей, допустим я сделал избыточной данную информацию и часть записей будет с нулевым количеством записей, их можно выкинуть, пусть останется 5-10 млн записей, но это все равно многовато. При 5 млн записей приведный выше запрос отрабатывает за 300мс на машине класса Core 2 Duo 2.5 Ггц, а таких запросов надо делать столько сколько категорий. В итоге получается все равно медленно, ообенно на нагруженной системе.

KRA>Не ясно почему нужно будет делать по запросу на категорию. Запрос же сразу считает количество для всех категорий.


KRA>Не уверен, что правильно интерпретирую сущности,

KRA>1. разве может одна модель относяться больше чем к 2-3 категориям?
KRA>2. может одна модель соответсвовать аж 100 разных брендов?

KRA>Это я к тому, что, возможно, оценка в 1 млрд сильно завышена.


А>>Уважамые коллеги, конибудь решал подобного рода задачи, если решали то в каком направлении дальше можно оптимизировать данную стуктуру поисковой таблицыее наполнения, построения запросов?

KRA>Я решал подобную задачу путём денормализации данных. Грубо говоря, заранее готовил данные в удобном для запросов виде (так чтоб при запросе использовалась только фильтрация и не использовались групировки). Давненько это было, но по памяти на рабочей системе данных было миллионов 10. На подобного класса машине запросы работалы довольно шустро, порядка 0.1 сек вместе с рендерингом веб страницы.


Я не совсем четко описал всю проблему, поэтому постараюсь подробнее описать:
Поиск заключается в более хитром механизме и многоступенчатом изменении значений для одного и того же параметра при различных условиях поиска.
Конкретно про приведенный сайт, если не ограничивать поиск то он выдаст примерно такие реузльтаты

Марка
* VW (187951)
* Mercedes-Benz (122658)
* BMW (105710)
* Opel (98532)
* Audi (97912)
* Расширить выборку
Тип топлива
* Бензиновый (613303)
* Дизельный (482332)
* Сжиженный нефтяной газ (9039)
* Расширить выборку
Категория
* Лимузин (417215)
* Универсал (250705)
* Минивэн/микроавтобус (120663)
* Расширить выборку
Подкатегория
* Демонстрационное транспортное средство (53773)
* Служебный автомобиль (36418)
* Предварительная регистрация (8268)
* Расширить выборку
Мощность
* 74 кВт — 86 кВт (166183)
* 85 кВт — 97 кВт (95409)
* 96 кВт — 111 кВт (186828)
* 110 кВт — 148 кВт (164748)
* 147 кВт — 185 кВт (77247)
* Расширить выборку

....
это первый шаг. Вот если выбрать хоть что то из этого, то все остальные пересчитаются с учетом этого!
то есть если выбрать лимузин, то значение остальных будут совсем другими.


понаблюдать все это можно на сайте www.mobile.de если попробовать поискать автомобиль.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.