Sql server 在外键列上创建对齐索引

Sql server 在外键列上创建对齐索引,sql-server,indexing,sql-server-2017,table-partitioning,Sql Server,Indexing,Sql Server 2017,Table Partitioning,我有一个事实表,它沿着PeriodDate列进行分区 CREATE TABLE MyFactTable ( PeriodDate DATE, OrderID INT CONSTRAINT MyFk FOREIGN KEY (OrderID) REFERENCES DimOrder(ID) ) 我想在OrderID列上创建一个分区对齐索引,正如我从BOL中了解到的,我需要包括分区键(PeriodDate),以便对齐索引 像这样: CREATE NONCLUST

我有一个事实表,它沿着
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);
我的问题是:我应该按什么顺序将这两列放在上面的索引中

  • MyFactTable上的
    (OrderID、PeriodDate)
  • MyFactTable上的
    (PeriodDate,OrderID)
  • 正如我读到的BOL以及复合索引中的顺序问题一样,我的查询通常使用
    OrderID
    来查找Dim表数据

    首先,OrderID、PeriodDate和order似乎是合乎逻辑的选择,但由于我不熟悉分区,我不知道当表有数百万行时它会如何“喜欢”

    这里的最佳实践说明了什么

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

    (OrderID,PeriodDate)索引用于检索给定OrderID集的所有事实,如果分区中有多个PeriodDate,则先使用PeriodDate索引将不会有太大帮助

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

    我的维度将有12行或最多100行。事实表将有数百万行。创建这个索引值得吗


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

    谢谢。是的,我的事实表确实是一个聚集的列存储索引。所以,如果我理解正确的话,这个“外键索引”的最佳实践并不能真正站在CCSI表上。好的,我想我需要测试一下。“外键索引”最佳实践实际上仅适用于OLTP系统,严格来说,仅适用于PK表上存在删除或键更新的情况。否则,它只是一个可选索引,只有在提高性能时才有用。碰巧OLTP系统也有高频率的单值查找,并且非常重视避免扫描。谢谢,有意义。不幸的是,由于合并,我的事实表将定期进行删除/更新(我知道CSI不太喜欢),但这是我的现实。因此,我将看看该索引是否曾经被触及,如果是的话,它会给我的插入带来多大的负担。