索引和嵌套集

时间:2011-07-05 14:09:11

标签: sql sql-server indexing nested-sets

我使用嵌套集来表示我的应用程序中的层次结构,并且想知道放置索引(聚簇或其他)的最佳位置。我正在使用Microsoft SQL Server 2008。

操作:

  1. 每天大约40次,将在根目录下添加新的层次结构。
  2. 可能永远不会删除层次结构。
  3. 白天,parentId经常访问层次结构以逐步填充组合框。
  4. 很少移动层次结构。也许甚至不是一个月一次。
  5. 与其他表格链接时,左右最大访问权限。到目前为止,这是对层次结构的最常见访问。
  6. 我玩弄左右两个聚集索引(大多数时候,它会被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
    

2 个答案:

答案 0 :(得分:1)

最好的办法是测试各种索引配置,看看哪种方法效果最好。乍一看,聚集在lft和rgt上似乎是最好的。听起来桌子上没有太多的DML,因此它不应该经常重新排列数据,而lft和rgt上的聚簇索引应该将大多数查询转换为聚簇索引扫描/搜索。

我看到的唯一缺点是,如果你将层次结构放在根目录之下,那么它可能涉及移动许多其他层次结构。你会一直在添加到根的“右侧”吗?那只会涉及更新根行中的rgt列,这样会很好。如果添加到根的左侧中间,则必须将所有其他层次结构移位到新层次结构的右侧。还有,你的桌子有多大?这会对事情产生一些影响。如果它足够小,那么转移这些层次结构可能不是什么大问题。如果可以的话,你肯定想尝试插入根的右侧。

编辑:另一件事......您是否考虑过SQL Server内置的hierarchyid数据类型?

答案 1 :(得分:0)

我对以这种方式使用聚簇索引感到紧张 - 查询速度非常快,但任何插入/更新/删除都需要在磁盘上重写数据;这可能会造成严重的性能问题(特别是对于大型表)。

我还建议在实践中,您不太可能注意到聚簇索引和非聚簇索引之间的区别 - 尤其是索引整数。如果您有巨大的表 - 数亿条记录 - 您可能能够衡量差异,但在现代硬件上,我认为它没有明显的区别。

所以,我同意Tom H. - 尝试一下,然后测量一下。确保您测量插入/更新/删除以及查询。除非你注意到真正重要的性能优势,否则我倾向于使用聚簇索引作为主键 - 因为根据定义,这是不可变的。