【问题标题】:Create aligned index on a foreign key column在外键列上创建对齐索引
【发布时间】:2020-05-04 12:20:46
【问题描述】:

我有一个沿PeriodDate 列分区的事实表。

CREATE TABLE MyFactTable
(
    PeriodDate DATE,
    OrderID INT 
         CONSTRAINT MyFk FOREIGN KEY (OrderID) REFERENCES DimOrder(ID)
)

我想在 OrderID 列上创建一个分区对齐索引,据我从 BOL 了解,我需要包含分区键 (PeriodDate) 才能拥有索引对齐。

像这样:

CREATE NONCLUSTERED INDEX MyAlignedOrderIdIndex 
ON MyFactTable (OrderID, PeriodDate);

我的问题是:我应该以什么顺序将两列放在上面的索引中?

  1. ON MyFactTable (OrderID, PeriodDate);

  1. ON MyFactTable (PeriodDate, OrderID);

正如我在 BOL 中所读到的,复合索引中的顺序也很重要,我的查询通常会使用 OrderID 来查找 Dim 表数据。

第一个OrderID, PeriodDate 顺序似乎是合乎逻辑的选择,但由于我不熟悉分区,我不知道当表有数百万行时它会如何“喜欢它”。

最佳实践在这里规定了什么?

【问题讨论】:

    标签: sql-server indexing sql-server-2017 table-partitioning


    【解决方案1】:

    我的问题是:我应该以什么顺序将两列放在上面的索引中?:

    (OrderID,PeriodDate) 该索引用于检索给定一组 OrderID 的所有事实,如果您的分区中有多个 PeriodDate,则首先使用带有 PeriodDate 的索引将没有帮助。

    这里的一般经验法则是不要按前导列进行分区。这样,您就可以将分区消除和索引顺序作为完全独立的访问路径。

    我的维度将有十几行或最多一百行。事实表将有数百万行。是否值得创建这个索引?

    您必须进行测试。这真的取决于查询。但是,如果您的事实表是聚集的columnstore(通常应该是具有数百万行的事实表),您可能会发现索引在查询工作负载中的使用并不多。即它可以用于单个产品的查询,但不能用于按非关键产品属性过滤的查询。

    【讨论】:

    • 谢谢。是的,我的事实表确实是一个聚集列存储索引。因此,如果我理解正确,这个“外键索引”最佳实践并不真正适用于 CCSI 表。对,我想我需要测试一下。
    • 是的。 “外键索引”最佳实践实际上仅适用于 OLTP 系统,严格来说,仅适用于 PK 表上存在删除或键更新的情况。否则,它只是一个可选索引,仅在提高性能时才有用。碰巧 OLTP 系统也有高频率的单值查找,并且非常重视避免扫描。
    • 谢谢,有道理。不幸的是,由于合并,我的事实表会定期删除/更新(我知道 CSI 不太喜欢),但这是我的现实。所以我会看看这个索引是否被触及,如果是,它会给我的插入带来多少负担。
    猜你喜欢
    • 1970-01-01
    • 2016-01-15
    • 2012-06-01
    • 1970-01-01
    • 2011-01-31
    • 2012-05-30
    • 2013-11-19
    • 2011-05-06
    • 2017-04-27
    相关资源
    最近更新 更多