我有一个事实表,它沿着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);
我的问题是:我应该按什么顺序将两列放在上面的索引中?
ON MyFactTable (OrderID, PeriodDate);
或
ON MyFactTable (PeriodDate, OrderID);
当我阅读 BOL 时,顺序在复合索引中也很重要,我的查询通常会使用OrderID
来查找 Dim 表数据。
第一个OrderID, PeriodDate
顺序似乎是合乎逻辑的选择,但由于我不熟悉分区,我不知道当表有数百万行时它会如何"喜欢它"。
这里的最佳实践决定了什么?
我的问题是:我应该按照什么顺序将这两列放在上面的索引中?
(OrderID,PeriodDate(索引用于检索一组给定订单ID的所有事实,如果您的分区中有多个PeriodDate,那么将索引与PeriodDate放在第一位,将没有那么大帮助。
这里的一般经验法则是不要按前导列进行分区。 这样,您就可以获得分区消除和索引顺序作为完全独立的访问路径。
我的维度将有十几行或最多一百行。事实数据表将有数百万行。 是否值得创建此索引?
你必须测试。 这实际上取决于查询。 但是,如果事实数据表是聚集列存储(具有数百万行的事实数据表通常应该是聚集列存储(,则可能会发现索引不常用于查询工作负荷。即,它可以用于单个产品的查询,但不能用于按非关键产品属性筛选的查询。