我正在进行分层数据库结构的设计,该分层数据库结构对包含产品的目录建模(这与this question类似)。数据库平台是SQL Server 2005,目录非常大(750,000个产品,超过4个级别的8,500个目录部分),但相对静态(每天重新加载一次),所以我们只关注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.8GHZ Xeon处理器,4GB内存),但它只是不工作:)
感谢所有帮助
詹姆斯
也许这会有助于向我们展示缓慢的SQL?我们可能会发现一些会造成瓶颈的东西。 – Jonathan 2008-12-10 10:53:09