Sql server 2008 我应该在事实表中的这些外键上放置一个非聚集索引吗 外键的配置文件

Sql server 2008 我应该在事实表中的这些外键上放置一个非聚集索引吗 外键的配置文件,sql-server-2008,indexing,foreign-keys,data-warehouse,star-schema,Sql Server 2008,Indexing,Foreign Keys,Data Warehouse,Star Schema,所有外键都已构成群集的主键。此事实表是包含6个维度(Id的6、7和8引用相同的日期维度)的星型架构的一部分 事实表目前大约有1800行(非常小),预计每个月都会以这个数量增长 每个外键是否应该有自己的非聚集非唯一单列索引以便于联接?如果是,为什么 每个外键都是其维度表中聚集索引(主键)的一部分 如果索引应该放在外键上,那么如果列的基数较低,填充因子和填充索引应该设置为什么?首先,我认为不应该基于外键创建集群主键。聚集索引用于组织磁盘上的数据,最好是 狭窄的 数字的 递增(严格单调) 因此,我

所有外键都已构成群集的
主键
。此事实表是包含6个维度(Id的6、7和8引用相同的日期维度)的星型架构的一部分

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

每个外键是否应该有自己的非聚集非唯一单列索引以便于联接?如果是,为什么

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


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

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

  • 狭窄的
  • 数字的
  • 递增(严格单调)
因此,我认为最好在外键上创建一个唯一约束,使行唯一。或者在这些列上创建非聚集主键,然后在日期外键(YYYYMMDD)上创建聚集索引(但不是主键)

通常情况下,外键在事实表上被编入索引(非聚集、非唯一),以进行更快的搜索。但有些人根本并没有在维度模型上强制执行基数(ETL负责引用完整性),因为主键-外键约束使ETL的加载速度变慢

  • 问题:如何为事实表编制索引?并解释原因。{H}
  • 回答:索引所有dim键列,单独索引,非聚集索引 (SQL Server)或位图(Oracle)。dim键列用于连接 连接到维度表,因此如果它们被索引,则连接将被删除 更快。一位优秀的候选人会提出3个额外的建议:a) 索引事实键,B)考虑创建覆盖索引 按正确的顺序组合dim键,c)如果 表已分区。分区键必须包含在所有 索引


    您的配置文件在“%”列中没有实际意义-为什么要在字段中查找不同值的“百分比”?您需要关于不同值分布的统计信息-Id8上99%的键是否相同?它们分布均匀吗?等等

    请注意,我在这里所说的一切都适用于较大的表。每月有1800行,索引可能会浪费您的空间和时间。

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

    索引取决于针对数据的查询的外观。如果要对事实表进行完整扫描以对“摘要”报告执行聚合和分组,则索引将没有帮助。当用户试图筛选维度的属性时,它们会有所帮助,而该筛选只会导致您从事实表中查找一小部分记录。您的表格有一个主要入口点吗?人们通常会根据“Id8”维度的属性进行筛选,然后根据其他维度的属性进行分组吗

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

    每个外键是否应该有自己的非聚集非唯一单列索引以便于联接

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

    如果列的基数较低,填充因子和填充索引应该设置为什么

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


    也就是说,在某些情况下,调整填充因子可能是有意义的。如果事实数据表非常大(数百GB/TB),并且重建索引需要数小时,您可能每月只重建一次索引,甚至更少。在这些情况下,您需要计算出每天要添加到表中的数据量(以百分比表示),并相应地设置填充因子。

    此外-IOT(具有聚集索引的表)对于事实表来说没有多大意义。我可以看到,在一些情况下,如果您将代理键放在事实上(或者如果您“更新”事实,则保留业务键),查询将根据维度属性执行过滤,因此这表明在这种情况下,外键上的索引可能是一个好主意。Id8是日期列,Id7是合同号(对于帐户维度),Id6与合同号相关,所有其他ID都是业务密钥。所有或没有ID可用于查询。鉴于我建议使用复合的
    主键
    ,难道不需要填充因子来防止键的碎片化吗,因为键字段本质上不会是递增的(很像单列日期键)?啊,我不清楚你的问题是关于聚集键上的填充因子,我以为是关于你的非聚集索引。这就是为什么我不建议在事实表上使用聚集索引。如果它位于所有键上,则需要一个相当低的填充因子,因为任何键都可以在树中的任何位置。将一组键放入聚集索引中确实不是一个好主意……您所说的“ETL处理基数”是什么意思。我从来没有听说过“强制执行基数”,你不是说引用完整性吗
    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%