Я работаю над дизайном иерархической структуры базы данных, которая моделирует каталог, содержащий товары (это похоже на этот вопрос ). Платформа базы данных - SQL Server 2005, и каталог довольно большой (750 000 продуктов, 8500 разделов каталога на 4 уровнях), но относительно статичен (перезагружается один раз в день), поэтому нас интересует только производительность READ.
Общая структура иерархии каталогов: -
- Уровень 1 Раздел
- Уровень 2 Раздел
- Раздел 3 уровня
- Раздел 4-го уровня (продукты связаны с здесь)
Мы используем шаблон «Вложенные наборы» для хранения уровней иерархии и хранения продуктов, которые существуют на этом уровне, в отдельной связанной таблице. Таким образом, упрощенная структура базы данных будет
CREATE TABLE CatalogueSection
(
SectionID INTEGER,
ParentID INTEGER,
LeftExtent INTEGER,
RightExtent INTEGER
)
CREATE TABLE CatalogueProduct
(
ProductID INTEGER,
SectionID INTEGER
)
У нас есть дополнительное осложнение в том, что у нас есть около 1000 отдельных групп клиентов, которые могут видеть или не видеть все продукты в каталоге. В связи с этим нам необходимо поддерживать отдельную «копию» иерархии каталогов для каждой группы клиентов, чтобы при просмотре каталога они видели только свои продукты и не видели пустых разделов.
Чтобы облегчить это, мы поддерживаем таблицу количества продуктов на каждом уровне иерархии, «свернутую» из раздела ниже. Таким образом, несмотря на то, что продукты напрямую связаны только с самым низким уровнем иерархии, они учитываются вплоть до самого дерева. Структура этой таблицы
CREATE TABLE CatalogueSectionCount
(
SectionID INTEGER,
CustomerGroupID INTEGER,
SubSectionCount INTEGER,
ProductCount INTEGER
)
Итак, на проблему
Производительность очень низкая на верхних уровнях иерархии. Общий запрос для отображения «10 лучших товаров» в выбранном разделе каталога (и во всех дочерних разделах) занимает где-то около 1 минуты. На более низких уровнях в иерархии это быстрее, но все еще недостаточно хорошо.
Я поместил индексы (включая охватывающие индексы, где это применимо) во все ключевые таблицы, запустил их через анализатор запросов, мастер настройки индексов и т. Д., Но все еще не могу заставить его работать достаточно быстро.
Мне интересно, является ли дизайн в корне ошибочным или это потому, что у нас такой большой набор данных? У нас есть разумный сервер разработки (3,8 ГГц Xeon, 4 ГБ ОЗУ), но он просто не работает:)
Спасибо за любую помощь
Джеймс