Tableau性能优化:计算位置对筛选效率的影响

筛选的本质是计算!本文详解行级别筛选与聚合筛选的性能差异,帮你理解不同计算位置对查询效率的影响,避开Tableau仪表板常见性能陷阱。

摘自《业务可视化分析:从问题到图形的 Tableau 方法》第13章

13.5 性能:逻辑计算位置对筛选的影响

在企业服务的过程中,笔者越来越多地遇到“性能”方面的咨询。性能是一个综合软硬件、计算、筛选、视图设计等多个要素的主题。这里介绍最普遍存在的一种:在不同位置建立筛选条件对性能的影响。

13.5.1 筛选的本质与筛选的标准位置

第13.2节介绍了筛选的多种形式,如果要分析它们的“异中之同”,即筛选的本质是计算。更准确地说,所有的筛选都是布尔判断的计算。不同的工具,只是用不同的“外壳”做了人性化的包装而已。

而布尔判断的计算中,主要使用以下的逻辑运算符和判断:

前面介绍的“相等判断筛选器”“范围条件筛选器”都可以转化为对应的计算过程。比如:

[类别] = '办公用品' OR [类别] = '家具'

[类别] = '办公用品' AND YEAR([订单日期]) = 2020

理解了这个基础,关键是下面的一段:

所有的筛选都可以转化为计算,而计算又可以分为行级别计算、聚合计算和指定详细级别的聚合计算等多种方法,因此,筛选和计算的结合就有了多种方法。

__BLOCK_p__比如,2016年,各个类别、子类别 的 销售额总和

以逗号和“的”为分隔,这个问题可以清晰地分为样本范围(对应计算为:订单日期=2016)、问题描述(对应维度:类别*子类别)和问题答案(对应聚合:销售额总和)3个部分。其中,样本范围约束聚合的大小、问题描述约束聚合的数量。

在Excel中,可以先筛选订单日期,然后把减少后的数据明细做成透视图;在SQL中,可以在where条件中增加筛选条件,然后基于维度完成聚合,语法如图13-20左侧所示;而在Tableau中,创建快速筛选只需要把对应的字段拖到“筛选器”窗格并选择即可,它的背后对应的就是计算的判断,如图13-20右侧所示。

图13-20 SQL和Tableau完成筛选的标准操作

所谓“筛选的标准位置”,就是筛选部分和问题部分要严格区分,这也是后续性能优化的关键之一。

13.5.2 在聚合过程中间接筛选的“非标准操作”及其代价

除了上述标准化的筛选操作,还可以通过“打标签”的方法间接完成筛选——这种方法在IT用户和Excel用户中流行。还是以上面的问题(2016年,各个类别、子类别 的 销售额总和)为例,很多人习惯在Excel中先建立辅助字段,再完成分析聚合,如图13-21所示。

图13-21 使用逻辑判断创建辅助列的方法

笔者把这种增加辅助列完成特定需求的方法称为“打标签”。这种方法借助中间的辅助计算完成“预先数据处理”,强制把不符合条件的数据行改为空值(NULL)或0值,然后做聚合计算。它的本质是用数据处理的思维解决分析问题,这种思维试图把所有的分析过程尽可能在明细阶段预先处理好。

它的优势是“一招胜百招”,对初学者简单实用;它的缺点则是“只有一招”,通用性的背后是维护困难、性能低下。很多人把这种方法不分场合地迁移到SQL和Tableau中,如图13-22所示。虽然结果与之前标准的方法并无二致,但却是完全不同的两种思路。

在第3章中,本书把字段分为“行级别字段”(业务字段)和“聚合字段”(分析字段)两个类型,并总结为“第三字段分类”,这个字段分类通常包括数据准备和高级的聚合计算。在这里,建立在 IF()函数基础上的计算实质上是行级别的计算函数,它并没有完成数据筛选,只是强制修改了不符合条件的值。所以,它是“用数据处理的方法间接地完成筛选”。这种借助行级别计算间接完成筛选并聚合的方法,无形中浪费了很多计算资源和性能,过度使用,会带来严重的性能问题。

例如,你是一所万人学校的校长,希望选拔100名优秀学生代表参加“全国可视化大赛”,设置了两门科目的考试题。可以先考第一门,而后基于第一门考试的成绩减少第二门考试的人数,从而节约选拔成本和大家的时间;但是提供考试卷的供应商建议所有人都参加两门考试——并告诉大家,如果第一门考试表现不佳,第二门考试可以交白卷。你应该知道这两种方法的差异。

图13-22 SQL和Tableau中,基于辅助字段的间接筛选方法

很多时候,“在聚合计算中通过逻辑判断间接完成筛选”就像上述拙劣的安排。它没有提前筛选数据从而减少之后聚合的数据明细数量,反而通过辅助计算累计空值或者0值,其实是多此一举,消耗算力。根据笔者不太严谨的本地测试,上面的案例中,“借助辅助字段的筛选方法”,比“标准方法”耗时要增加30%以上,随着筛选字段中数据值的特征,性能影响会有明显不同。

13.5.3 不同筛选方法的高级分类与适用场景

在这里,笔者并非一味反对使用辅助计算完成筛选计算,笔者反对的是不加分辨地过度使用这种方法,看似简单,实则性能低下,并非最优选择。

笔者强烈建议,业务分析师应该把建立完善的思考模型和理论方法当作第一要务,当然也大可不必看到“模型”和“理论”就觉得深不可测,无非是经验丰富的人总结的最佳实践而已。读者首先要建立以下的综合认识:

随着理论认识前后贯通、实践经验日渐丰富,每位读者都可以建立自己逻辑自洽的知识和方法体系,而从不断优化自己的分析作品。

本书推荐把“筛选范围”作为一个单独的过程完成(对应SQL中的where条件部分),结合第13.2节与第13.4节,可以把基于单一工作簿的筛选分为以下几种类型:

这是基于“第三字段分类”建立的筛选器分类规则,同时也要考虑聚合依赖的详细级别与视图详细级别的关系(记住,维度/详细级别是聚合的依据)。

那什么时候使用诸如IIF(YEAR( [订单日期])=2016, [销售额],NULL )数据处理的方法间接完成筛选,而后用SUM()等聚合方法嵌套完成聚合分析呢?以笔者目前有限的项目经验,姑且说明如下:

这里用一个简单的例子说明,如图13-23所示。这里使用SUM(IIF([类别]='办公用品', [销售额],null ))计算,在“全国各连续季度的销售额趋势中”加入了“办公用品各连续季度的销售额趋势”,“相当于”加入了更低聚合度详细级别的聚合(注意仅仅是“相当于”,并未真正构建第二个详细级别,因为没有表计算或者侠义LOD计算)。虽然结果正确,但是10万行的数据就无形中增加了10万次的判断(假定数据明细有10万行)。

图13-23 使用逻辑计算创建行级别辅助字段,完成聚合

本书极力推荐的“层次分析方法”,旨在让大家区分“总公司的销售额”是相当于“类别(办公用品)”更高聚合度详细级别的聚合,这里可以使用FIXED LOD完成,如图13-24所示。

图13-24 标准方法:使用LOD计算(预先聚合)完成指定详细级别的聚合

在这里,FIXED 指定季度,只需要预先聚合16个数据值(各连续季度的销售额总和),然后和原来的16个聚合值构建共同图形即可,相比10万次的行级别计算,它们的性能一个“天上”、一个“地上”。

要进入大数据的深层次领域,建议大家适当放下之前的一些思维习惯,从而换取更高效的可能性。如今的很多业务用户和分析师,已经被所使用的工具限制住了思考,从这个意义讲,Tableau对笔者而言是一种“业务思考的救赎”。

📖 相关文章
Tableau技巧:用参数动作制作提交按钮,实现多条件批量筛选
Tableau中的排序与筛选器顺序
解构Tableau绘图逻辑(二):2个界面与3个功能区详解
解构Tableau绘图逻辑(四):行列功能区与离散/连续数据的本质
解构Tableau绘图逻辑(五):标记栏核心功能与绘图原理详解
——————————————————————————————

No comments yet