代码之家  ›  专栏  ›  技术社区  ›  Biswanath

引用列上的数据库聚集索引

  •  0
  • Biswanath  · 技术社区  · 16 年前

    我有两张这样的桌子。

    表A

    a_id(主键)
    A1
    A2

    表B

    B_id(主键)
    地下一层
    地下二层 a_id(外键,但数据库中没有强制执行,不是唯一的)

    尽管默认情况下,SQL Server在b_id上创建聚集索引,但我在b上有很多select查询,这取决于a_id。

    像这样的东西

    从b中选择*其中b.a_id='some id'

    我应该在表B的a_id上创建聚集索引吗?

    2 回复  |  直到 16 年前
        1
  •  3
  •   edosoft    16 年前

    常规的非聚集索引不应该做得很好。聚集索引在执行范围查询(介于两者之间)时特别方便,根据经验,我总是在外键约束中使用的列上创建非聚集索引。

        2
  •  3
  •   marc_s MisterSmith    16 年前

    不,只需创建一个普通的非聚集索引——您的结果基本相同,查询速度也会有相同的提高。

    表B上的a_id是否保证是唯一的?“B”中不能有多个条目引用同一个a_id??

    集群密钥的最佳实践是:

    • 尽可能小(窄)
    • 独特的
    • 稳定(或静态-不应改变)
    • 不断增加

    见Kim Tripp The Clustered Index Debate continues Ever-increasing clustering key - the Clustered Index Debate - agin! 更多信息。

    如果不能保证集群密钥是唯一的,那么SQL Server将向其添加一个4字节的uniquifier—您希望尽可能避免这样做(因为集群密钥将添加到表中每个非集群索引的每个条目中,如果太宽,会浪费空间)。

    马克