首页 > 解决方案 > 在外键列上创建对齐索引

问题描述

我有一个沿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-serverindexingsql-server-2017table-partitioning

解决方案


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

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

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

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

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


推荐阅读