SSAS

来源:互联网 发布:mac版matlab安装 编辑:程序博客网 时间:2024/05/17 07:53

问题

在本系列中,我们已经讨论了可以用来优化您的SQL Server分析服务环境的各种技术。在这一节中,我们将讨论多维数据集设计和开发的性能优化最佳实践。

解决方案

在本系列的第1部分中,谈到了一个典型的SSAS应用程序体系结构和SSAS内部体系结构的不同组件。还谈到了不同组件和领域的性能改进的角色。原文第二节讨论了源系统设计来提高性能。主要目的优化从数据源系统查询数据的性能,主要涉及的是SQL Server性能优化的内容。本系列删减了第二节,有兴趣的可以看原文。

在本文中,将与您分享多维数据集设计和开发的最佳实践和性能优化技术:

维度设计

1.在维度中只包含业务需要的那些列

2.定义属性关系或级联属性关系

默认情况下,所有属性都与关键属性相关。应该在合适的属性上,定义属性关系。例如,日上卷到月,月上卷到季度,季度上卷到年,等等……这使得查询的速度更快,因为它已经聚合了4个季度或12个月的数据,当需要一年的汇总值时,不需要聚集365天的数据。其次,确保不要创建冗余的属性关系,因为这会增加额外的开销,例如“日上卷到月”和“月上卷到季度”和“日上卷到季度”。

3.指定适当的属性关系类型

默认情况下,属性关系设置为Flexible。在合适的情况下,设置为Rigid,以获得更好的性能。如果设置为Rigid,SSAS就不需要在后续的处理中更新聚合值,从而提高性能。

4.关闭属性层次结构和使用成员属性

对不需要聚合计算或者希望他们作为成员属性访问它的属性(如地址或定价等),设置这些熟悉的AttributeHierarchyEnabled为False。设置AttributeHierarchyEnabled为False,可以提高处理性能,还可以降低整个cube大小(这些属性会被认为不需要聚合和创建索引)。

5.设置适当的KeyColumns属性

确保Keycolumns属性为惟一标识值。例如,如果维度包含超过一年的时间,月份列不能唯一标识。因此,需要将年份和月份的列组合在一起,使其成为唯一标识。

6.设置AttributeHierarchyOptimizedState为不优化

在处理主键属性时,会为每个相关属性创建位图索引。如果为一个或多个具有高基数的相关属性的主键构建位图索引,可能需要很多时间,(例如地址或电话号码或列表价格)。但是,在查询时,这些属性的位图索引在加速检索方面作用不大,因为存储引擎仍然需要筛选大量不同的值以得到所需的值。无用的位图索引增加了处理时间,增加了多维数据集的大小,同时也会对查询响应时间产生负面影响。可通过设置AttributeHierarchyOptimizedState为不优化,避免在处理过程中花时间建立不必要的位图索引。

7.创建用户定义的层次结构

8.将已在用户定义的层次结构的属性的AttributeHierarchyVisible设置为False

9.定义默认成员

默认情况下,“所有成员”被认为是一个属性的默认成员,因此建议定义属性的默认成员,特别是在属性不能聚合的情况下。

度量值组的设计和优化

1.分区度量值组

为所有的度量组(特别是那些存储相当大的组)应用分区策略,并根据使用情况,从一个或者多个维度进行分区。这将极大地改进多维数据集处理以及多维数据集的查询性能。
由于多个线程可以并行地在一个度量组的多个分区上协同处理和服务查询响应,因此可以提高处理和查询性能。同时也可以为每个分区定义不同的聚合策略。比如,旧数据高聚合度,常用的新数据低聚合度。

2.聚合

合理的设计聚合,可以减少SSAS从磁盘扫描生成响应的数据量。合理的聚合可以提高查询性能,但会处理阶段需要更多的时间。设计聚合需要考虑到业务应用场景,平衡处理和查询时间,遵守不要创建大于实际数据大小三分之一的聚合。

3.基于使用的优化向导-重新定义聚合

通常,我们在开始时创建聚合,以获得20% - 30%的性能为目标。然后再使用基于使用的优化向导,为所有正在运行的查询创建更多的聚合。您可以对正在运行的查询进行日志记录,然后将收集的信息作为基于使用的优化向导的输入,用于为所有或长时间运行的查询创建聚合。要了解更多关于这个主题,点击这里。

4.AggregationUsage属性

AggregationUsage属性是SSAS用来确定该属性是否是聚合候选项的设置。默认情况下,SSAS只考虑为关键熟悉和包含在自然层次结构中的属性创建聚合。对于用来切片的属性,应该考虑将AggregationUsage属性设置为不受限制,对其进行聚合。其次,要避免将包含很多成员的属性的AggregationUsage属性设置Full。

5.IgnoreUnrelatedDimensions属性的使用

IgnoreUnrelatedDimensions是测量组的属性,默认值为True。在这种情况下,度量值组会对不相关的维度展示当前数量。

6.维度和度量组的引用关系

如果两个维度和度量组都来自同一个多维数据集,可以考虑具体化引用维度来提高性能。

多维数据集处理

在处理一个多维数据集时,它分两个部分。处理数据阶段包含重建维度的属性存储、层次存储和事实数据存储。处理索引阶段包含创建位图索引和定义聚合。可以通过执行单个命令(ProcessFull),将这两个操作一起执行,或者执行每个操作的单独命令(ProcessData和ProcessIndexes),这样就可以确定每个操作需要花费多少时间。
我们可以会选择每次执行ProcessFull,或者第一次执行ProcessFull,后续做增量处理。不管使用什么样的方式,SSAS都使用基于作业的体系结构(根据属性、层次、分区等的数量来创建控制器作业和其他的作业)来处理维度和事实。

多维数据集同步

多维数据集处理有排他性,这意味着在提交过程中的cube对象将不可用,无法进行查询。同时长时间的查询也会阻止处理进程获取cube对象的排它锁,造成cube处理时间长的问题。为了防止处理和查询相互干扰,可以使用不同的策略。我们可以对一个多维数据集(也称为处理多维数据集)处理和刷新来自源的最新数据。同时查询另一个多维数据集(也称为查询多维数据集),查询多维数据集和处理多维数据集进行同步。第二个立方体是用户将访问的内容。要了解更多关于多维数据集同步的最佳实践,单击此处。

缓存预热(Cache Warming)

如果还记得在本系列的第一部分讨论过的SSAS架构,查询处理器缓存/公式引擎缓存将缓存计算结果,而存储引擎缓存缓存被查询聚合/事实数据。如果查询再次执行,或者其他查询的响应可以从缓存中获取,这种缓存技术有助于提高查询的性能。现在的问题是,我们真的需要等待第一个查询完成,还是可以自己运行查询(预执行),并准备好缓存?答案是,我们可以预先执行一个或多个经常使用的查询或者运行CREATE CACHE语句来加载缓存,这就是缓存预热。
我们应该知道并不是一旦查询结果被缓存,它就会永远存在缓存中。如果没有足够的空间缓存额外的查询结果,那么可能会被其他查询结果挤出缓存。
为了清除公式引擎缓存和存储引擎缓存,可以执行下面的XMLA命令:

<ClearCache xmlns="http://schemas.microsoft.com/analysisservices/2003/engine">   <Object>      <DatabaseID>Adventure Works</DatabaseID>   </Object></ClearCache>

请继续关注本系列的下一节

原文地址:
https://www.mssqltips.com/sqlservertip/2567/ssas–best-practices-and-performance-optimization–part-3-of-4/

原创粉丝点击