创建高效的计算

  • 版本 :2022.1 及更高版本

适用于: Tableau Desktop

当您的数据未提供回答问题所需的所有信息时,您可以创建计算字段以帮助您进行分析。

在计算字段内,您可以定义硬编码常量(如税率)、执行像减法或乘法这样非常简单的数学运算(例如,收入减去成本)、使用较复杂的数学公式、执行逻辑测试 (IF/THEN, CASE)、执行类型转换、将表达式发送到诸如 R 之类的外部服务等等。

Tableau 中有以下不同的计算类型:

基本和聚合计算查询基础数据源时会生成这些类型的计算并在数据库中执行这些计算。通常,基本计算和聚合计算伸缩性非常好,而且许多数据库调整技术可以提高其性能。

表计算:Tableau 会对查询结果集执行这些计算。虽然这意味着 Tableau 要做更多的工作,但是表计算通常通过比原始数据源中的记录集小得多的记录集来完成。如果表计算性能成问题(可能因为返回到 Tableau 的结果集很大),请考虑将计算的某些方面推回到数据源层。执行此操作的一种方法是聚合数据,然后对聚合的数据执行计算。

详细级别 (LOD) 表达式:系统会在数据库中计算查询基础数据源时生成的 LOD 表达式。这些表达式表示为嵌套选择,所以它们依赖于数据库的性能。表计算或混合的性能可能比 LOD 表达式的性能好,或者情况相反。

如果怀疑 LOD 表达式造成了性能缓慢,则可以尝试将其替换为表计算或数据混合,看看是否提高了性能。有关示例,请参见Tableau 的操作顺序中的示例 2。

联接挑选可能会影响 LOD 表达式,所以如果在使用 LOD 表达式时您的查询运行缓慢,请看一看假设存在联接的引用完整性

有关详细信息,请参见 Tableau 白皮书了解详细级别 (LOD) 表达式

布尔值和整数较快

当您创建计算字段时,您所使用的数据类型对计算速度有显著的影响。整数和布尔值一般比字符串快得多。如果计算产生二进制结果(例如,是/否、通过/未通过、超过/低于),请一定要返回布尔值结果,而不是字符串。

使用条件计算的参数

Tableau 中常用的技巧是显示参数控制,以便用户可以选择一个值来确定如何执行计算。通常,为了向用户提供易于理解的选项,将参数创建为字符串类型是有道理的。但是数值计算比字符串计算快得多,因此,请利用参数的“显示为”功能;即显示文本标签,但是对计算逻辑使用基础整数值。有关详细信息,请参见创建参数

转换日期字段

用户经常具有未以本机日期格式存储的日期数据 - 例如,日期可能是字符串或数字时间戳。如果数据支持的话,您可以使用 DATEPARSE 函数,此函数适用于非旧版 Microsoft Excel 和文本文件连接、MySQL、Oracle、PostgreSQL 和 Tableau 数据提取数据源。否则,将字段解析为日期字符串,例如“2012-01-01”。ISO 字符串是首选项,因为它们并非特定于区域设置。然后将值传递给 DATE 函数。如果原始数据是数字字段,则先将其转换为字符串然后转换为日期的做法效率非常低下。使数据保持为数字并使用 DATEADD 和日期文本值来执行计算要好得多。对于大型数据集,性能提升可能较显著。有关这些函数的更多信息,请参见日期函数

使用 ELSEIF 逻辑语句

使用复杂的逻辑语句时,请记住 ELSEIF 比 ELSE IF 快,因为嵌套的 IF 会计算第二个 IF 语句,而不是作为第一项的一部分进行计算。

聚合度量

如果创建的视图较慢,请确保使用聚合度量。对于解聚的数据,您可能会尝试一次查看多行数据。可通过对数据进行聚合来减少行数。为此,请选择“分析”>“聚合度量”

计算提示

您可以做有很多小事情以提高计算性能。

  • 非重复计数值是几乎所有数据源中最慢的聚合类型之一。慎用 COUNTD 聚合。

  • 如果使用影响范围广泛的参数(例如,在自定义的 SQL 语句中),则会影响缓存性能。

  • 对复杂的计算进行筛选可能会导致基础数据中缺少索引。

  • 像 RAWSQL 和 SCRIPT_* 之类用于与外部服务集成的脚本函数可能性能缓慢,特别是在有很多需要与 DBMS/R 服务器相互传递的值的情况下。

  • 只有在需要时间戳详细级别时才使用 NOW。使用 TODAY 进行日期级别计算。

  • 请记住,所有基本计算都会传递到基础数据 - 甚至像标签字符串这样的文本计算也是如此。如果您需要创建标签(例如,针对列标题而创建)并且您的数据很大,请创建一个简单的文本/Excel 文件数据源,其中只包含一个记录来容纳这些标签,以便它们不会为大数据源添加开销。