sql-server - 在外键列上创建对齐索引
问题描述
我有一个沿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) 索引用于检索给定一组 OrderID 的所有事实,如果您的分区中有多个 PeriodDate,那么首先使用带有 PeriodDate 的索引将没有帮助。
这里的一般经验法则是不要按前导列进行分区。这样,您就可以将分区消除和索引顺序作为完全独立的访问路径。
我的维度将有十几行或最多一百行。事实表将有数百万行。是否值得创建此索引?
你必须进行测试。这实际上取决于查询。但是,如果您的事实表是一个聚集列存储(通常应该是具有数百万行的事实表),您可能会发现索引在查询工作负载中的使用并不多。即它可以用于单个产品的查询,但不能用于按非关键产品属性过滤的查询。
推荐阅读
- python - 计算 numpy 二维数组中出现的次数
- mysql - 警告:#1292 截断不正确的 DOUBLE 值:“摩托车”
- git - 由于本地对象 git-lfs 丢失或损坏,git push 被拒绝
- spring-boot - 缺少必需的加密配置属性:jasypt.encryptor.password
- javascript - 反向数组不使用反向
- javascript - How to include new google material design icon inside node modules?
- android - Android kotlin将列表行分配给变量错误
- sql-server - SQL Function to Increment 6 character ISO date field with format 'YYYYWW'
- javascript - How to preserve dot using split and negative lookahead
- gatling - Gatling overrides `Cookie` header with the `Set-Cookie` header of previous response