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行(非常小),预计每个月都会以这个数量增长
每个外键是否应该有自己的非聚集非唯一单列索引以便于联接?如果是,为什么
每个外键都是其维度表中聚集索引(主键)的一部分
如果索引应该放在外键上,那么如果列的基数较低,填充因子和填充索引应该设置为什么?首先,我认为不应该基于外键创建集群主键。聚集索引用于组织磁盘上的数据,最好是
- 狭窄的
- 数字的
- 递增(严格单调)
您的配置文件在“%”列中没有实际意义-为什么要在字段中查找不同值的“百分比”?您需要关于不同值分布的统计信息-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%