3

外键配置文件

FK      Distinct Values      %
----    ---------------  ------
Id1     1                 0.1%
,Id2    4                 0.3%
,Id3    5                 0.3%
,Id4    6                 0.4%
,Id5    6                 0.4%
,Id6    95                6.1%
,Id7    97                6.2%
,Id8    1423             90.7%

所有外键都已经组成了 clustered Primary Key。此事实表是包含 6 个维度的星型模式的一部分(Id 的 6,7 和 8 引用相同的日期维度)。

事实表目前大约有 1800 行(非常小),并且预计每个月都会增长这个数量。

每个外键是否应该有自己的非聚集非唯一单列索引来促进连接?如果是这样,为什么?

每个外键都将是其维度表中聚集索引(主键)的一部分。

如果应该在外键上放置索引,那么在列的低基数的情况下应该将填充因子和填充索引设置为什么?

4

2 回答 2

2

首先,我认为您不应该基于外键创建集群主键。聚集索引是组织磁盘上的数据,如果它是更好的

  • 狭窄的
  • 数字
  • 递增(严格单调)

所以我认为最好在外键上创建一个唯一约束以使行唯一。或者在这些列上创建一个非聚集主键,然后在例如日期外键 (YYYYMMDD) 上创建一个聚集索引(但不是主键)。

通常外键在 Fact 表上被索引(非聚集,非唯一)以进行更快的搜索。但是有些人根本没有在维度模型上强制基数(ETL 负责参照完整性),因为主键 - 外键约束使 ETL 加载缓慢。

来自文森特·雷纳尔迪

  1. 问题:如何索引事实表?并解释原因。{H}

答:索引所有暗键列,单独、非集群(SQL Server)或位图(Oracle)。暗键列用于连接到维度表,因此如果它们被索引,连接会更快。一个特殊的候选人会提出 3 个额外的建议:a) 单独索引事实键,b) 考虑在暗键组合上以正确的顺序创建覆盖索引,以及 c) 如果事实表被分区,则必须包含分区键在所有索引中。

于 2012-11-26T09:19:42.283 回答
2

您的个人资料与“%”列没有真正意义 - 为什么您要找到跨字段的不同值的“百分比”?您需要有关不同值分布的统计信息 - Id8 上 99% 的键是否相同?它们分布均匀吗?等等

请注意,我在这里所说的一切都适用于更大的表格。对于 1800 行/月,索引可能会浪费您担心的空间和时间。

@jrara 关于索引所有暗淡的“规则”是一个容易应用的规则,但如果你只这样做,你很容易犯错误。例如,我不想在我的 1 亿行客户维度上使用 Oracle 位图索引。

索引取决于查询对您的数据的样子。如果您正在对事实表进行全面扫描以对“摘要”报告执行聚合和分组,则索引将无济于事。当用户尝试过滤维度的属性时,它们会有所帮助,而该过滤器会导致您只需要从事实表中查找一小部分记录。你的桌子有一个主要的入口点吗?人们通常是否过滤“Id8”维度的属性,然后希望对其他维度的属性进行分组?

基本上,您的问题的答案是:

每个外键是否应该有自己的非聚集非唯一单列索引来促进连接?

一般情况下是可以的,只要维度表比较小,dim 键在事实表中分布比较均匀。通常使用索引访问来获取 99% 的事实表行会更糟糕。

考虑到列的低基数,填充因子和填充索引应该设置为多少?

将 FILLFACTOR 降低到 100% 以下导致索引读取速度变慢,因为索引中有更多(空)页面供数据库读取。由于数据仓库是为快速选择而设计的,所以我真的不建议您调低填充因子。

That being said, in a few cases adjusting your FILLFACTOR may make sense. If the the fact table is very large (hundreds of GB / TB), and index rebuilds take hours, and you might only rebuild indexes once a month or even less. In these cases you need to figure out how much data (as a percentage) that you'll be adding to the table each day, and set the fillfactor accordingly.

于 2012-11-26T14:09:18.660 回答