我正在研究分层数据库结构的设计,该结构对包含产品的目录进行建模(这类似于这个问题 https://stackoverflow.com/questions/112866/database-schema-for-a-hierarchial-groups)。数据库平台是 SQL Server 2005,目录相当大(750,000 个产品,4 个级别的 8,500 个目录部分),但相对静态(每天重新加载一次),因此我们只关心 READ 性能。
目录层次结构的一般结构是:-
我们使用嵌套集模式来存储层次结构级别并将该级别存在的产品存储在单独的链接表中。所以简化的数据库结构是
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.8GHZ Xeon,4GB RAM),但它无法正常工作:)
谢谢你的帮助
James