Meilleures pratiques pour la création de calculs dans Tableau

Cet article décrit divers conseils et recommandations relatifs à la création de calculs efficaces dans Tableau. Ces recommandations sont conçues pour vous aider à optimiser les performances de vos classeurs. Pour plus d’informations sur toutes les manières dont vous pouvez améliorer les performances des classeurs, consultez la série Optimiser les performances du classeur.

Règle générale : Éviter d’utiliser un champ calculé plusieurs fois dans un autre calcul

Le référencement du même champ calculé plusieurs fois dans un autre calcul peut entraîner des problèmes de performances. Si vous utilisez un champ calculé au sein d’un calcul (également connu comme la création d’un calcul imbriqué), essayez de le référencer une seule fois dans le calcul.

Notez que le référencement d’un champ plusieurs fois (champ terminal) dans un calcul ne devrait pas dégrader ses performances.

Exemple

Imaginons que vous créez un champ calculé utilisant un calcul complexe à plusieurs lignes pour trouver des mentions, ou poignées Twitter, dans des gazouillis. Le champ calculé est appelé Poignée Twitter. Chaque poignée retournée commence par le signe « @ » (par exemple : @utilisateur).

Pour votre analyse, vous souhaitez supprimer le symbole « @ ».

Pour cela, vous pouvez utiliser le calcul suivant pour supprimer le premier caractère de la chaîne :

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

Ce calcul est très simple. Toutefois, étant donné qu’il référence deux fois le calcul Poignée Twitter, il exécute ce calcul deux fois pour chaque enregistrement dans votre source de données : une fois pour la fonction RIGHT et à nouveau pour la fonction LEN.

Pour éviter d’effectuer plus d’une fois le même calcul, vous pouvez réécrire le calcul en un calcul qui utilise le calcul Poignée Twitter une seule fois. Dans cet exemple, vous pouvez utiliser MID pour atteindre le même objectif :

MID([Twitter Handle], 2)

Conseil 1 : Convertir plusieurs comparaisons d’égalité en une expression CASE ou un groupe

Prenons le calcul suivant, qui utilise le champ calculé, Person (calc), plusieurs fois et emploie une série de fonctions OR. Ce calcul, bien qu’il soit une expression logique simple, entraînera des problèmes de performances des requêtes parce qu’il effectue le calcul Person (calc) au moins dix fois.

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

Au lieu d’utiliser une comparaison d’égalité, essayons les solutions suivantes.

Solution 1

Utilisez une expression CASE, Par exemple :

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

Dans cet exemple, le champ calculé, Person (calc), est référencé une seule fois. Il est donc exécuté une seule fois. Les expressions CASE peuvent également être optimisées encore davantage dans le pipeline de requête pour bénéficier de performances supplémentaires.

Solution 2

Créez un groupe au lieu d’un champ calculé. Pour plus d’informations, consultez Réunir vos données.

Conseil 2 : Convertir plusieurs calculs de chaînes en une seule expression REGEXP

Remarque : les calculs REGEXP sont disponibles uniquement lorsque vous utilisez des extraits de données Tableau ou que vous êtes connecté à des sources de données au format fichier texte, Hadoop Hive, Google BigQuery, PostgreSQL, Tableau Data Extract, Microsoft Excel, Salesforce, Vertica, Pivotal Greenplum, Teradata (version 14.1 et versions supérieures) et Oracle. Pour plus d’informations, consultez Fonctions supplémentaires.


Exemple 1 : CONTAINS

Prenons le calcul suivant, qui utilise le champ calculé, Category (calc), plusieurs fois. Ce calcul, bien qu’il soit une expression logique simple, entraînera des problèmes de performances des requêtes parce qu’il effectue le calcul Category (calc) au moins dix fois.

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

Vous pouvez utiliser une expression REGEXP pour obtenir les mêmes résultats sans autant de répétions.

Solution

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


Avec les calculs de chaînes utilisant un modèle similaire, vous pouvez utiliser la même expression REGEXP.

Exemple 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'

Solution

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

Notez que le symbole « ^ » est utilisé dans cette solution.

Exemple 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

Solution

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

Notez que le symbole « $ » est utilisé dans cette solution.

Conseil 3 : Manipuler les chaînes avec REGEXP au lieu de LEFT, MID, RIGHT, FIND, LEN

Les expressions régulières peuvent être un outil très puissant. Si vous effectuez une manipulation complexe de chaînes, envisagez d’utiliser des expressions régulières. Dans de nombreux cas, l’utilisation d’une expression régulière peut entraîner un calcul plus court et plus efficace. Pour plus d’informations sur les expressions régulières, consultez le blogue Become a regex regular and wrangle imperfect data(Le lien s’ouvre dans une nouvelle fenêtre) dans le blogue de Tableau.

Exemple 1

Prenons le calcul suivant, qui supprime des protocoles d’URL. Par exemple, « https://www.tableau.com » devient « 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

Solution

Vous pouvez simplifier le calcul et améliorer les performances en utilisant une fonction REGEXP_REPLACE.

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

Exemple 2

Prenons le calcul suivant, qui retourne la seconde partie d’une adresse IPv4. Par exemple, « 172.16.0.1 » devient « 16 ».

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

Solution

Vous pouvez simplifier le calcul et améliorer les performances en utilisant une fonction REGEXP_EXTRACT.

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

Conseil 4 : N’utilisez pas d’ensembles dans des calculs

Si vous utilisez des ensembles dans un calcul, envisagez de les remplacer par une alternative, mais un calcul équivalent.

Exemple

Prenons le calcul suivant, qui utilise l’ensemble Top Customers (set).

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

Solution 1

Si l’ensemble est simple, vous pouvez créer un champ calculé qui retourne le même résultat que l’ensemble, Par exemple :

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


Remarque : l’utilisation du modèle WHEN TRUE … ELSE est recommandée dans ce cas pour éviter les problèmes de performances dus à l’utilisation d’ensembles. Dans la plupart des scénarios, ce modèle n’est pas recommandé.

Solution 2

Si l’ensemble est plus complexe, envisagez de créer un groupe qui mappe tous les éléments de l’ensemble à une valeur ou un attribut spécifique, par exemple « N », puis modifiez le calcul pour vérifier cette valeur/cet attribut. Par exemple :

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

Pour plus d’informations, consultez Réunir vos données et Créer des ensembles.

Conseil 5 : N’utilisez pas des ensembles pour réunir vos données

Les ensembles sont conçus pour effectuer des comparaisons entre des sous-ensembles de données. Les groupes sont conçus pour combiner les membres liés dans un champ. Il n’est pas recommandé de convertir des ensembles en des groupes, comme dans cet exemple :

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

Cette opération est déconseillée pour les raisons suivantes :

  • Les ensembles ne sont pas toujours exclusifs. Certains membres peuvent apparaître dans plusieurs ensembles. Par exemple, la Russie pourrait être placée à la fois dans l’ensemble Europe et dans l’ensemble Asie.

  • Les ensembles ne peuvent pas toujours être traduits en des groupes. Si les ensembles sont définis par l’exclusion, des conditions ou des limites, il peut être difficile, consulteze impossible, de créer un groupe équivalent.

Solution

Réunissez vos données à l’aide de la fonctionnalité Groupe. Pour plus d’informations, consultez Réunir vos données.

Voir également

Créer des calculs efficaces

Optimiser les performances du classeur

Types de calculs dans Tableau

Fonctions dans Tableau

Merci de vos commentaires!Votre commentaire s été envoyé avec succès. Merci!