Práticas recomendadas para a criação de cálculos no Tableau

Este artigo descreve várias dicas e diretrizes para criar cálculos eficientes no Tableau. Essas diretrizes são destinadas a ajudá-lo a otimizar o desempenho da sua pasta de trabalho. Para obter mais informações sobre todas as maneiras de melhorar o desempenho da pasta de trabalho, consulte a série Otimizar o desempenho da pasta de trabalho.

Regra geral: evite usar um campo calculado várias vezes em um outro cálculo

Fazer referência ao mesmo campo calculado várias vezes em outro cálculo resultará em problemas de desempenho. Se você usar um campo calculado em um cálculo (também conhecido como criação de um Cálculo aninhado), tente referenciá-lo apenas uma vez.

Observe que fazer referência a um campo (campo de terminal) várias vezes em um cálculo não deve reduzir o desempenho.

Exemplo

Suponhamos que você crie um campo calculado que usa um cálculo complexo de várias linhas para encontrar em tweets menções ou nomes de usuários do Twitter. O campo calculado é chamado de Nome de usuário do Twitter. Todos os nomes de usuário retornados começam com o sinal "@" (por exemplo: @usuário).

Para a análise, remova o símbolo "@".

Para fazer isso, use o seguinte cálculo para remover o primeiro caractere da cadeia de caracteres:

RIGHT([Twitter Handle], LEN([Twitter Handle]) -1)

Esse cálculo é bem simples. No entanto, como ele faz referência duas vezes ao cálculo do Nome de usuário do Twitter, ele executa esse cálculo duas vezes para cada registro em sua fonte de dados: uma para a função RIGHT e a outra para a função LEN.

Para evitar o mesmo cálculo mais de uma vez, é possível reescrevê-lo para um que use o cálculo do Nome de usuário do Twitter apenas uma vez. Neste exemplo, você pode usar MID para alcançar o mesmo objetivo:

MID([Twitter Handle], 2)

Dica 1: converter várias comparações de igualdade em uma expressão CASE ou um grupo

Suponhamos que você tenha o seguinte cálculo, que usa o campo calculado Pessoa (calc.) várias vezes e aplica uma série de funções OR. Esse cálculo, apesar de ser uma simples expressão lógica, causará problemas de desempenho de consulta, pois executa o cálculo Pessoa (calc.) pelo menos dez vezes.

IF [Person (calc)] = 'Henry Wilson'
OR [Person (calc)] = 'Jane Johnson'
OR [Person (calc)] = 'Michelle Kim'
OR [Person (calc)] = 'Fred Suzuki'
OR [Person (calc)] = 'Alan Wang'
THEN 'Lead'
ELSEIF [Person (calc)] = 'Susan Nguyen'
OR [Person (calc)] = 'Laura Rodriguez'
OR [Person (calc)] = 'Ashley Garcia'
OR [Person (calc)] = 'Andrew Smith'
OR [Person (calc)] = 'Adam Davis'
THEN 'IC'
END

Em vez de usar uma comparação de igualdade, tente as soluções a seguir.

Solução 1

Use uma expressão CASE. Por exemplo:

CASE [Person (calc)]
WHEN 'Henry Wilson' THEN 'Lead'
WHEN 'Jane Johnson' THEN 'Lead'
WHEN 'Michelle Kim' THEN 'Lead'
WHEN 'Fred Suzuki' THEN 'Lead'
WHEN 'Alan Wang' THEN 'Lead'

WHEN 'Susan Nguyen' THEN 'IC'
WHEN 'Laura Rodriguez' THEN 'IC'
WHEN 'Ashley Garcia' THEN 'IC'
WHEN 'Andrew Smith' THEN 'IC'
WHEN 'Adam Davis' THEN 'IC'
END

Neste exemplo, o campo calculado Pessoa (calc.) é referenciado somente uma vez. Portanto, é realizado somente uma vez. As expressões CASE também são otimizadas na linha de consulta, para que você obtenha um benefício de desempenho adicional.

Solução 2

Crie um grupo, em vez de um campo calculado. Para obter mais informações, consulte Agrupar seus dados.

Dica 2: converter vários cálculos de cadeia de caracteres em uma única expressão REGEXP

Observação: os cálculos do REGEXP estão disponíveis somente ao usar as extrações de dados do Tableau ou quando conectados a fontes de dados de arquivos de texto, Hadoop Hive, Google BigQuery, PostgreSQL, Extração de dados do Tableau, Microsoft Excel, Salesforce, Vertica, Pivotal Greenplum, Teradata (versão 14.1 e posterior) e Oracle. Para obter mais informações, consulte Funções adicionais.


Exemplo 1: CONTAINS

Suponhamos que você tenha o seguinte cálculo, que usa o campo calculado Categoria (calc.) várias vezes. Esse cálculo, apesar de também ser uma simples expressão lógica, causará problemas de desempenho de consulta, pois executa o cálculo de Categoria (calc.) várias vezes.

IF CONTAINS([Segment (calc)],'UNKNOWN')
OR CONTAINS([Segment (calc)],'LEADER')
OR CONTAINS([Segment (calc)],'ADVERTISING')
OR CONTAINS([Segment (calc)],'CLOSED')
OR CONTAINS([Segment (calc)],'COMPETITOR')
OR CONTAINS([Segment (calc)],'REPEAT')
THEN 'UNKNOWN'
ELSE [Segment (calc)] END

Você pode usar uma expressão REGEXP para obter os mesmos resultados sem muita repetição.

Solução

IF REGEXP_MATCH([Segment (calc)], 'UNKNOWN|LEADER|ADVERTISING|CLOSED|COMPETITOR|REPEAT') THEN 'UNKNOWN'
ELSE [Segment (calc)] END


Com cálculos de cadeia de caracteres que usam um padrão semelhante, você pode usar a mesma expressão REGEXP.

Exemplo 2: STARTSWITH

IF STARTSWITH([Segment (calc)],'UNKNOWN')
OR STARTSWITH([Segment (calc)],'LEADER')
OR STARTSWITH([Segment (calc)],'ADVERTISING')
OR STARTSWITH([Segment (calc)],'CLOSED')
OR STARTSWITH([Segment (calc)],'COMPETITOR')
OR STARTSWITH([Segment (calc)],'REPEAT')
THEN 'UNKNOWN'

Solução

IF REGEXP_MATCH([Segment (calc)], '^(UNKNOWN|LEADER|ADVERTISING|CLOSED|COMPETITOR|REPEAT)') THEN 'UNKNOWN'
ELSE [Segment (calc)] END

Observe que o símbolo "^" é usado nessa solução.

Exemplo 3: ENDSWITH

IF ENDSWITH([Segment (calc)],'UNKNOWN')
OR ENDSWITH([Segment (calc)],'LEADER')
OR ENDSWITH([Segment (calc)],'ADVERTISING')
OR ENDSWITH([Segment (calc)],'CLOSED')
OR ENDSWITH([Segment (calc)],'COMPETITOR')
OR ENDSWITH([Segment (calc)],'REPEAT')
THEN 'UNKNOWN'
ELSE [Segment (calc)] END

Solução

IF REGEXP_MATCH([Segment (calc)], '(UNKNOWN|LEADER|ADVERTISING|CLOSED|COMPETITOR|REPEAT)$') THEN 'UNKNOWN'
ELSE [Segment (calc)] END

Observe que o símbolo "$" é usado nessa solução.

Dica 3: manipular as cadeias de caracteres com REGEXP em vez de LEFT, MID, RIGHT, FIND, LEN

As expressões regulares podem ser uma ferramenta muito eficiente. Ao manipular uma cadeia de caracteres complexa, considere o uso de expressões regulares. Em muitos casos, usar uma expressão regular resultará em um cálculo mais curto e eficiente. Para obter mais informações sobre expressões regulares, consulte a publicação Torne-se um regex regular e lide com dados imperfeitos(O link abre em nova janela) no blog do Tableau.

Exemplo 1

Suponhamos que você tenha o seguinte cálculo, que remove protocolos de URLs. Por exemplo: "https://www.tableau.com" torna-se "www.tableau.com".

IF (STARTSWITH([Server], "http://")) THEN
MID([Server], Len("http://") + 1)
ELSEIF(STARTSWITH([Server], "https://")) THEN
MID([Server], Len("https://") + 1)
ELSEIF(STARTSWITH([Server], "tcp:")) THEN
MID([Server], Len("tcp:") + 1)
ELSEIF(STARTSWITH([Server], "\\")) THEN
MID([Server], Len("\\") + 1)
ELSE [Server]
END

Solução

Use uma função REGEXP_REPLACE para simplificar o cálculo e melhorar o desempenho.

REGEXP_REPLACE([Server], "^(http://|https://|tcp:|\\\\)", "")

Exemplo 2

Suponhamos que você tenha o seguinte cálculo, que retorna a segunda parte de um endereço IPv4. Por exemplo: "172.16.0.1" torna-se "16".

IF (FINDNTH([Server], ".", 2) > 0) THEN
MID([Server],
FIND([Server], ".") + 1,
FINDNTH([Server], ".", 2) - FINDNTH([Server], ".", 1) - 1
)
END

Solução

Você pode simplificar o cálculo e melhorar o desempenho usando uma função REGEXP_EXTRACT.

REGEXP_EXTRACT([Server], "\.([^\.]*)\.")

Dica 4: não usar conjuntos em cálculos

Se você estiver usando conjuntos em um cálculo, considere substituí-los por um cálculo alternativo, mas equivalente.

Exemplo

Suponhamos que você tenha o seguinte cálculo, que usa o conjunto Clientes principais (conjunto).

IF ISNULL([Customer Name]) OR [Top customers (set)] THEN [Segment] ELSE [Customer Name] END

Solução 1

Se o conjunto for simples, você pode criar um campo calculado que retorna o mesmo resultado do conjunto. Por exemplo:

CASE [Customer Name]
WHEN 'Henry Wilson' THEN True
WHEN 'Jane Johnson' THEN True
WHEN 'Michelle Kim' THEN True
WHEN 'Fred Suzuki' THEN True
WHEN 'Alan Wang' THEN True
ELSE False
END


Observação: recomenda-se o uso do padrão WHEN TRUE... ELSE nesta situação para evitar problemas de desempenho devido ao uso de conjuntos. Não é um padrão recomendado na maioria dos cenários.

Solução 2

Se o conjunto for mais complexo, considere a criação de um grupo que mapeie todos os elementos no conjunto para um determinado valor ou atributo, como "IN", e modifique o cálculo para verificar esse valor/atributo. Por exemplo:

IF ISNULL([Customer Name]) OR [Top Customers(group)]='IN' THEN [Segment] ELSE [Customer Name] END

Para obter mais informações, consulte Agrupar seus dados e Criar conjuntos.

Dica 5: não usar conjuntos para agrupar dados

Conjuntos são projetados para fazer comparações em subconjuntos de dados. Grupos são projetados para combinar os membros relacionados em um campo. Não é recomendado converter conjuntos em grupos, como mostrado no seguinte exemplo:

IF [Americas Set] THEN "Americas"
ELSEIF [Africa Set] THEN "Africa"
ELSEIF [Asia Set] THEN "Asia"
ELSEIF [Europe Set] THEN "Europe"
ELSEIF [Oceania Set] THEN "Oceania"
ELSE "Unknown"
END

Isso não é recomendado pelos seguintes motivos:

  • Os conjuntos nem sempre são exclusivos. Alguns membros podem ser exibidos em vários conjuntos. Por exemplo, Rússia poderia ser colocada tanto no conjunto Europa como no conjunto Ásia.

  • Os conjuntos nem sempre podem ser convertidos em grupos. Se os conjuntos forem definidos por exclusão, condições ou limites, pode ser difícil ou mesmo impossível criar um grupo equivalente.

Solução

Agrupe os dados usando o recurso Grupo. Para obter mais informações, consulte Agrupar seus dados.

Consulte também

Criar cálculos eficientes

Otimizar o desempenho da pasta de trabalho

Tipos de cálculo no Tableau

Funções no Tableau

Agradecemos seu feedback!Seu feedback foi enviado. Obrigado!