我使用嵌套集来表示我的应用程序中的层次结构,并且想知道放置索引(聚簇或其他)的最佳位置。我正在使用Microsoft SQL Server 2008。
操作:
我玩弄左右两个聚集索引(大多数时候,它会被val BETWEEN @left AND @right
查询。但是左右聚类是正确的方法吗?< / p>
非常感谢任何拥有SQL索引经验的人,而不是我!
架构
_id INT IDENTITY NOT NULL
_idParent INT IDENTITY NULL
_name NVARCHAR(64)
_left INT NOT NULL
_right INT NOT NULL
答案 0 :(得分:1)
最好的办法是测试各种索引配置,看看哪种方法效果最好。乍一看,聚集在lft和rgt上似乎是最好的。听起来桌子上没有太多的DML,因此它不应该经常重新排列数据,而lft和rgt上的聚簇索引应该将大多数查询转换为聚簇索引扫描/搜索。
我看到的唯一缺点是,如果你将层次结构放在根目录之下,那么它可能涉及移动许多其他层次结构。你会一直在添加到根的“右侧”吗?那只会涉及更新根行中的rgt列,这样会很好。如果添加到根的左侧中间,则必须将所有其他层次结构移位到新层次结构的右侧。还有,你的桌子有多大?这会对事情产生一些影响。如果它足够小,那么转移这些层次结构可能不是什么大问题。如果可以的话,你肯定想尝试插入根的右侧。
编辑:另一件事......您是否考虑过SQL Server内置的hierarchyid
数据类型?
答案 1 :(得分:0)
我对以这种方式使用聚簇索引感到紧张 - 查询速度非常快,但任何插入/更新/删除都需要在磁盘上重写数据;这可能会造成严重的性能问题(特别是对于大型表)。
我还建议在实践中,您不太可能注意到聚簇索引和非聚簇索引之间的区别 - 尤其是索引整数。如果您有巨大的表 - 数亿条记录 - 您可能能够衡量差异,但在现代硬件上,我认为它没有明显的区别。
所以,我同意Tom H. - 尝试一下,然后测量一下。确保您测量插入/更新/删除以及查询。除非你注意到真正重要的性能优势,否则我倾向于使用聚簇索引作为主键 - 因为根据定义,这是不可变的。