我应该在事实表中的这些外键上放置非聚集索引

时间:2012-11-22 00:25:22

标签: sql-server-2008 indexing foreign-keys data-warehouse star-schema

外键的配置文件

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%

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

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

每个外键是否都有自己的非群集非唯一单列索引以方便连接?如果是,为什么?

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

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

2 个答案:

答案 0 :(得分:2)

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

则更好
  • 狭窄
  • 数字
  • 增加(严格单调)

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

通常,在Fact表上对外键进行索引(非群集,非唯一)以加快搜​​索速度。但有些人在维度模型上根本没有强制基数(ETL负责引用完整性),因为主键 - 外键约束使得ETL加载速度变慢。

来自Vincent Rainardi

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

    答案:索引所有暗淡的键列,单独,非群集     (SQL Server)或位图(Oracle)。昏暗的键列用于连接     到维度表,所以如果它们被索引,则连接将是     快点。一个特殊的候选人将建议另外三件事:a)     分别索引事实密钥,b)考虑创建覆盖索引     在暗淡键组合的正确顺序,和c)如果事实     table是分区的,分区键必须全部包含在内     索引。

      

答案 1 :(得分:2)

您的个人资料对于“%”列没有任何意义 - 为什么您在字段中找到不同值的“百分比”?你需要关于不同值分布的统计数据 - 在Id8上99%的密钥是相同的吗?它们是均匀分布的吗?等

请注意,我在这里说的所有内容都适用于较大的表格。每月1800行,索引可能是浪费空间和时间让您担心。

@jrara关于索引所有dims的“规则”是一个很容易应用的规则,但是如果你做的就是你很容易犯错误。例如,我不想在我的100mil行客户维度上使用oracle位图索引。

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

基本上你的问题的答案是:

每个外键是否都有自己的非群集非唯一单列索引以方便连接?

通常,是的,只要维度表很小并且暗淡的键在事实表中相对均匀地分布。通常情况下,使用索引访问来获取99%的事实表行会更糟糕。

在给定列的低基数的情况下,应该将填充因子和填充索引设置为什么?

将FILLFACTOR降低到100%导致索引读取速度变慢,因为索引中有更多(空)页面要读取数据库。由于数据仓库是为快速选择而设计的,我实际上并不建议您调整fillfactor。

话虽如此,在少数情况下调整您的FILLFACTOR可能有意义。如果事实表非常大(数百GB / TB),并且索引重建需要数小时,并且您可能只会每月重建一次索引甚至更少。在这些情况下,您需要确定每天要向表中添加多少数据(以百分比表示),并相应地设置fillfactor。