SSAS Cube优化笔记记录大全 来自天善与xpivot经典问与答 【N年经验实战分享,经典12问12答,持续更新】

浏览: 7967
xpivot http://www.flybi.net/people/xpivot @xpivot
问题1: 处理几个知识点记录、处理全部、处理默认值、处理增量、处理更新、处理索引、处理数据、不处理
处理选项和设置 (Analysis Services) http://msdn.microsoft.com/zh-C ... .aspx
处理默认值 检测对象的处理状态,进行必要的处理,将未处理对象或部分处理的对象转变成为已完全处理的对象。 多维数据集、数据库、维度、度量值组、挖掘模型、挖掘结构和分区均支持此处理选项。
处理全部 处理 Analysis Services 对象及其包含的所有对象。 对已被处理的对象执行“处理全部”时,Analysis Services 将删除该对象中的所有数据,然后再处理该对象。 如果对对象进行了结构更改(例如,添加、删除或重命名属性层次结构),则需要此类处理。 多维数据集、数据库、维度、度量值组、挖掘模型、挖掘结构和分区均支持此处理选项。
处理增量 添加新的可用事实数据并只处理相关分区。 度量值组和分区支持该处理选项。
处理更新 强制重新读取数据并更新维度属性。
处理索引 为所有已处理的分区创建或重新生成索引和聚合
处理数据 只处理数据,而不生成聚合或索引。
不处理 删除指定对象和任何低级构成对象中的数据。

简单的来说 :处理全部就是整个Cube重新处理,类似DB里面的, 全部DROP,在 INSERT.
处理增量 类似 DB 里面新增记录 (只会新增记录,做INSERT,要写一个增量的Query。这个一般用于缓慢变化维度)
处理更新:在维度的处理有这个概念,事实表没有。表示的是处理增量数据(这个日处理的时候常用的操作,不要进行全量处理),还可以生成聚合和索引。
处理索引 : 重新生产聚合和索引,是Cube性能达到最优
处理数据: 在维度表 和事实表都有这个概念,也是处理增量数据的意思,但跟处理更新区别是 这个不生产聚合 和索引,在度量值组经常用处理 数据就可以啦。


天善问 : 问题1:在 SSAS处理的时候,有一个 处理全部,处理增量,处理增量,处理索引 ,都是啥意思
xpivot答案: daily process通常都不会process full,用process update就可以了
process update就是处理增量,当有任何一个维度或事实被porcess full,都会造成整个cube无法访问,而process update不会,相当于另外起了一个事务在process
如果以db的理论去理解的话,process full相当于drop table,然后insert data,这个期间默认的隔离级别是无法访问db的,而process update相当于快照隔离


天善问 : 问题2:分区、聚合的应用
xpivot答案:分区: 通过分区可以把数据进行分割成若干个逻辑区,当进行查询时就不需要在所有的数据中进行计算,而是只在一个数据区间内执行计算。即查询的时候只在此分区查询才有效果。
聚合:通过聚合可以确保数据以相同的方式聚合并把聚合值存储在多维数据集的分区内,通过聚合可以使存储引擎能很快的响应计算引擎的数据请求,因为设计了聚合只在第一次部署时对多维数据集进行聚合,一旦处理后,聚合值就会存储在分区内,之后的请求只需要到聚合索引中查找就可以,不需要二次计算,可以极大提高查询效率。
属性关系:日期维度创建对应的属性关系,查询的时候在层级加载的时候,可以有效的找到对应的子级。

天善问 : 问题3:做聚合的时候,这几个选项 预计存储空间达到 多少M,性能提示达到多少 等
xpivot答案:这个是聚合占用的空间limit设置。聚合可以按usage去自动设置,也就是说交给服务器自己去根据你的访问情况判断需要对哪些维度建立aggregation。这些aggregation是要占用物理磁盘空间的,这里是设置一个阀值,不允许它超过这个空间。不然很可能整块磁盘都被aggregation占去了。。按具体磁盘可用空间设置,随意的。 性能阀值指的是你希望做的aggregation能提高整体查询效率多少。


天善问 : 问题4: 聚合的设计如何提高性能
xpivot答案:当然能了,很明显的,默认情况下cube是不对维度做pre-aggregation的,就是说默认不做聚合的时候,你访问每个维度的聚合事实都是临时算出来的,就好比你去数据库执行sum函数,而做了聚合后,相当于你再数据库做了pre-calculation把sum好的值持久化了,mdx查询时就直接返回结果了。因为维度的组合非常多,所以在设计聚合的时候有个by usage,意思就是按你最常用的组合去设计聚合,那么就使你在查询这些常用组合的维度时效率提升了。设置的聚合越多,占用的磁盘越多
默认的界面是手动修改aggregation的设置界面,需要相当的业务经验才会使用那种设置的

天善问 : 问题5:聚合中by usage如何应用?
xpivot答案:by usage的是要访问OlapQueryLog表的,这个表默认不开启,开启后系统会自动往表里记录最近的mdx查询,所以cube的使用时间越长,OlapQueryLog表里的记录越多,by usage的设置就越好
1.jpg

需要这个配置了,它是要去dw里找OlapQueryLog表。ssas property
手动设置aggregation是非常专业的做法,专业性不止是体现在对ssas的熟悉程度上,而且还有对业务知识的理解程度,通常我们it是没有后者能力的,所以我们通常不会手动设置。cube配置的数据源是哪个dw就是哪个了,配置后不会立刻生成那个表,需要去cube里做些常规查询,才会生成表和插入记录。这些都是后期调优的事情了,还要做cache warmer等等
2.jpg

第一个参数要配置成true的 。第二个参数要设置好dw connection string

天善问 :问题6:维度属性那些设计可以提高性能
xpivot答案:我只在应用中感受到key和name的默认设置会影响性能,其它暂时没发现 ,keycolumn,namecolumn。keycolumn和namecolumn的确会影响process的性能,比如说会员表里的会员卡级别account.card这种重复性很高的字段,如果用字符串描述的话,默认的keycolumn和namecolumn要处理很长时间,而如果改成数字类型比如tinyint,然后指定namecolumn映射到一个字典表,process的速度就高很多。
还有个忌讳就是我昨天提到的keycolumn和namecolumn的设计,如果所有高度重复的维度属性都用字符串的话,默认的设置效率是很低的
对啊,所以要设置namecolun映射tinyint到一个字典表,保证显示到前端的是个字符串。。也就是说在cube里存储的是个tinyint的值,直到查询到前端时才去字典表找到对应的value返回


天善问 :问题7:处理默认值:检测数据库对象的处理状态,进行必要的处理,将未处理对象或部分处理的对象转变成为已完全处理的对象。 官方这这样解释的,怎么理解???
xpivot答案:这个你可以结合在vs data tools里操作deploy cube去理解,当你修改了cube structure后再deploy时就是自动选择了process full,而当你仅仅修改了某个calculation member再deploy时很快就结束了,明显不是process full,而当你修改某个维度并且没有影响stureture后的deploy就自动选择了process update,也是很快结束的。不,还是process的过程,deploy仅仅是在process之前多了个xlam部署cube更新的过程。如果你没有先deploy更新,直接选择process,vs会自动先deploy。
就是说ssas发现有些必须的processing 需要提交给服务器。进行的增量处理可能已经修改了ssas processed state,当前状态标识不是fully了。。
我通常是设置维度process update,事实process fully 。而且是先处理维度,再处理事实


天善问 :问题8:维度里面的 处理更新 和处理数据啥区别,我试验了几下,感觉是一样的,官方这样解释的。。 处理数据:只处理数据,而不生成聚合或索引。 如果分区中存在数据,则在使用源数据重新填充该分区之前,该数据被删除。 处理更新:强制重新读取数据并更新维度属性。 相关分区的灵活聚合和索引将被删除。 是不是 处理更新,把数据全部删掉,在加载。。而处理 数据: 有的话,就不删掉,没有的话,就加载。
xpivot答案:只有维度有process update,事实是没有的 http://book.51cto.com/art/200811/99307.htm
处理数据(process data) 处理数据,等同于维度的"处理数据",只把详细的数据加载到分区的MOLAP结构中,而不用处理索引或聚合。由于ROLAP和混合联机分析处理(Hybrid Online Analytical Processing,HOLAP)将数据保存在底层数据库中,所以处理数据仅适用于MOLAP结构。我理解这两个都是re-read。
事实里没有process update啊。维度里的处理数据(process data) "处理数据"类似于"处理更新",但只涉及到处理特性和层次的数据结构,但不包括特性位图索引。
理解维度里的process data只是比process update少了一步更新索引和聚合的过程
相当于db里的只更新table page不更新index page
我有印象如果仅仅对维度表process data,之后的cube是无法访问的,可能正是因为cube判断index page和table page数据不一致,这个观点仅供参考,不确定了。。
维度表每天都在变化啊,比如会员维度,每个会员的身份维度属性都可能会变化,如果不做增量更新的话,就得process update 把整个dim account表重新加载到cube里

**天善问 :问答9:数据源 :采用高性能的提供供器 : 不要使用.net提供器: “SQLClientData Provider”
**
xpivot答案::应该是兼容性的问题吧,比如说你要把这个Project部署到远程server上,那个server上没有相关的provider就会出问题,而在本地调试时又看不出来,因为本地可能有这个provider.ole db provider兼容性强些.... 不要在数据源中使用不支持的 OLE DB 访问接口。SSAS设计为使用特定的 OLE DB 访问接口集并经过测试。尽管其他 OLE DB 访问接口也可用,并且数据源向导可使您选择任何兼容的访问接口,但是不同访问接口的功能和行为可能有很大区别。

天善问 :问答10: excel也可以自定义一些 mdx 嘛??
xpivot答案:mdx写到calculation member里,也可以直接在excel里写mdx的 .当然,如果在excel里编写mdx做calculation member就仅会显示在当前客户端,别的用户那里不会显示,如果需要大家都显示,就需要在server上编写calculation member.kpi我不知道能不能,set肯定也是可以的

天善问 : 问答11: SSAS处理需要很少时间,一般原因出在哪里
xpivot答案:答案: process性能出问题,多半情况是设计上出了问题。就像你熟悉的db performance tuning一样,真正sql上的调优空间远远不如数据结构上的优化空间大。维度60万数据是小维度了,我这里的维度表有3千万。。我这里cube300G了,dw快T了。。从设计上去思考问题的话,其实cube里不需要持久化太多数据,可以提供一个接口给终端用户自己去配置需要往cube里放多少数据,我现在的做法是excel add-in提供接口给用户操作,非常友好。。但如果把作者提到的这些问题都了然了,对调整process的效率会非常有帮助。
几十G的cube process都有问题,要么是设计太乱搞,要么是硬件配置太差,我这里服务器内存20多G,cpu8 core,disk raid10。磁盘影响是最大的,玩这个的话,普通单磁盘肯定是不行的

天善问 : 问答12:一般你MDX这块的优化从哪入手
xpivot答案:能不写mdx的就不要写,尽量在dw上想办法 ,什么filter, exists, topcount之类的函数尽量都不要用,这些都可以通过dw或者插件实现 ,我以前经常用到复杂的mdx函数,但现在基本不用,刚看了下之前的项目,用到的函数也就iif,sum之类很基础的 。
就好像我们写sql,先经历的境界是只会用简单的函数和语法,之后慢慢的会用复杂的函数如pivot,concat_group之类,最后的境界是返璞归真只用简单的函数和语法,复杂的需求都尽量在数据结构上动手脚,我这边之所以采用excel做客户端,也是因为通过插件定制复杂需求更容易实现,比如说mdx filter函数,如果写在caculation member里是很消耗性能的,而通过插件去为用户提供更加友好的组织条件的方式,达到filter的目的效率是非常高
推荐 3
本文由 梁勇 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

8 个评论

QQ上随便聊的,掌柜的真费心,有些个人观点存疑尚待验证,以后发现有自己打脸的情况出现也得回来纠正了
zxhx

zxhx 回复 xpivot

认真写东西、分享总归是好事,应该多鼓励,而不是打击,有问题可以提出来大家一起探讨,而不是泛泛而论,谢谢!
xpivot

xpivot 回复 zxhx

还真就是泛泛而谈,不是做学问的人,没那个心思去梳理这些理论知识,一知半解不可怕,怕的是理解的不够透彻还懒得思考喜欢跟风拿别人的方案硬往自己的场合套,具体问题具体分析很重要
最近在梳理这块的知识,下面内容是关于维度的各种Process方式最准确合理的定义:

ProcessFull 命令放弃维度的所有存储内容并重新生成它们。 ProcessFull 在后台执行所有维度处理作业并对所有从属分区执行隐式 ProcessClear,会造成Cube脱机
ProcessData 命令放弃维度的所有存储内容,只重新生成属性存储区和层次结构存储区,同时还清除分区。 ProcessData 是由 ProcessFull 操作执行的第一部分处理,会造成Cube脱机
ProcessIndexes 要求维度已生成属性存储区和层次结构存储区,它将数据保存在这些存储区中,然后重新生成位图索引。 ProcessIndexes 是 ProcessFull 操作的第二部分处理。
ProcessUpdate 不放弃维度存储内容。 而是智能地应用更新以保留从属分区。 更具体地说,ProcessUpdate 发送 SQL 查询来读取整个维度表,然后将更改应用到维度存储区。ProcessUpdate 将删除无效的聚合和索引,要求您重新生成聚合以便维持查询性能。不会脱机
ProcessAdd 在您只需要插入新成员时优化 ProcessUpdate。 ProcessAdd 不删除或更新现有成员。 ProcessAdd 有利于提高性能是因为您可以使用不同源表或数据源视图命名的查询,这样就可以限制源维度表的行以只返回新行。 这样也不必读取所有源数据。 此外,ProcessAdd 还保留所有索引和聚合
非常有用。
问答11:.....从设计上去思考问题的话,其实cube里不需要持久化太多数据,可以提供一个接口给终端用户自己去配置需要往cube里放多少数据,我现在的做法是excel add-in提供接口给用户操作,非常友好。。

这块可以详细讲讲吗?
问答12:....这些都可以通过dw或者插件实现 .......
这里的插件是什么啊?
@zzmm113, 比如说交易事实有十年的交易数据,而最常用于分析的只是近两年的交易数据,偶尔可能会分析之前的数据,那么可以提供一个接口供前端用户去自定义加载到cube里的数据具体是哪些年份的,默认配置只加载近两年,而不用把十年的交易数据都塞进cube里,利用率不高,还影响整体性能
好东西, 整理花了不少时间吧.

要回复文章请先登录注册