Я работаю над дизайном иерархической структуры базы данных, которая моделирует каталог, содержащий продукты (это похоже на this question). Платформа базы данных - это SQL Server 2005, а каталог довольно большой (750 000 продуктов, 8500 разделов каталога на 4 уровня), но относительно статично (перезагружается один раз в день), и поэтому нас беспокоит только производительность READ.Иерархическая структура структуры данных (вложенные наборы)
Общая структура иерархии каталога: -
- Уровень 1 Раздел
- Уровень 2 Раздел
- Уровень 3 Раздел
- Уровень 4 Раздел (продукты связанные с здесь)
- Уровень 3 Раздел
- Уровень 2 Раздел
Мы используем вложенные наборы шаблон для хранения уровней иерархии и хранения продуктов, которые существуют на этом уровне в отдельной связанной таблице. Таким образом, упрощенная структура базы данных будет
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 Гб оперативной памяти), но это просто не работает :)
Спасибо за любую помощь
Джеймс
Возможно, было бы полезно показать нам медленный SQL?Мы могли бы обнаружить что-то, что может стать узким местом. – Jonathan 2008-12-10 10:53:09