Procedure consigliate per la creazione di calcoli in Tableau
Questo articolo illustra diversi suggerimenti e linee guida per la creazione di calcoli efficienti in Tableau. Queste linee guida sono concepite per ottimizzare le prestazioni della cartella di lavoro. Per ulteriori informazioni su tutti i modi in cui è possibile migliorare le prestazioni della cartella di lavoro, consulta la sezione Ottimizzare le prestazioni delle cartelle di lavoro.
Regola generale: evita di utilizzare più volte un campo calcolato in un altro calcolo
Se si fa riferimento allo stesso campo calcolato più volte all’interno di un altro calcolo, si verificheranno problemi di prestazioni. Se si utilizza un campo calcolato in un calcolo (noto anche come creazione di calcoli nidificati), cerca di farvi riferimento solo una volta per calcolo.
Nota che il riferimento a un campo (campo terminale) ripetuto più volte in un calcolo non influisce negativamente sulle prestazioni.
Esempio
Supponiamo di creare un campo calcolato che utilizza un complicato calcolo a linee multiple per trovare menzioni, o account Twitter, nei tweet. Il campo calcolato si chiama Account Twitter. Ogni account che viene restituito inizia con il segno "@" (ad esempio: @user).
Per l’analisi, vuoi rimuovere il simbolo “@”.
A tale scopo, è possibile utilizzare il seguente calcolo per rimuovere il primo carattere dalla stringa:
RIGHT([Twitter Handle], LEN([Twitter Handle]) -1)
Questo calcolo è piuttosto semplice. Tuttavia, poiché fa riferimento due volte al calcolo dell’account Twitter, esegue due volte il calcolo per ogni record dell’origine dati: una volta per la funzione RIGHT e una per la funzione LEN.
Per evitare di fare lo stesso calcolo più di una volta, puoi riscrivere il calcolo trasformandolo in uno che utilizza il calcolo dell’account Twitter solo una volta. In questo esempio è possibile utilizzare la funzione MID per ottenere lo stesso risultato:
MID([Twitter Handle], 2)
Suggerimento 1: converti i confronti multipli di uguaglianza in un’espressione CASE o in un gruppo
Supponiamo di avere il seguente calcolo, che utilizza più volte il campo calcolato Person (calc) e impiega una serie di funzioni OR. Questo calcolo, sebbene sia una semplice espressione logica, causa problemi di prestazioni delle query perché esegue il calcolo Person (calc) almeno dieci volte.
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
Anziché utilizzare un confronto di uguaglianza, prova le soluzioni seguenti.
Soluzione 1
Utilizza un’espressione CASE. Ad esempio:
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
In questo esempio, il campo calcolato, Person (calc), viene citato solo una volta. Viene pertanto eseguito una sola volta. Anche le espressioni CASE sono ulteriormente ottimizzate nell’ordine delle query per ottenere un ulteriore vantaggio in termini di prestazioni.
Soluzione 2
Crea un gruppo invece di un campo calcolato. Per maggiori informazioni, consulta Raggruppare i dati.
Suggerimento 2: converti più calcoli stringa in un’unica espressione REGEXP
Nota: i calcoli REGEXP sono disponibili solo se si utilizzano estrazioni dati di Tableau o se ci si collega a origini dati file di testo, Hadoop Hive, Google BigQuery, PostgreSQL, Estrazione dati Tableau, Microsoft Excel, Salesforce, Vertica, Pivotal Greenplum, Teradata (versione 14.1 e successive) e Oracle. Per ulteriori informazioni, consulta Funzioni aggiuntive.
Esempio 1: CONTIENE
Supponiamo di avere il calcolo seguente, che utilizza più volte il campo calcolato Category (calc). Questo calcolo, sebbene sia una semplice espressione logica, causa problemi di prestazioni delle query, poiché esegue il calcolo Category (calc) più volte.
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
Puoi usare un’espressione REGEXP per ottenere gli stessi risultati senza tante ripetizioni.
Soluzione
IF REGEXP_MATCH([Segment (calc)], 'UNKNOWN|LEADER|ADVERTISING|CLOSED|COMPETITOR|REPEAT') THEN 'UNKNOWN'
ELSE [Segment (calc)] END
Con calcoli stringa che utilizzano un modello simile, puoi utilizzare la stessa espressione REGEXP.
Esempio 2: INIZIA CON
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'
Soluzione
IF REGEXP_MATCH([Segment (calc)], '^(UNKNOWN|LEADER|ADVERTISING|CLOSED|COMPETITOR|REPEAT)') THEN 'UNKNOWN'
ELSE [Segment (calc)] END
Nota che in questa soluzione si utilizza il simbolo '^'.
Esempio 3: FINISCE CON
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
Soluzione
IF REGEXP_MATCH([Segment (calc)], '(UNKNOWN|LEADER|ADVERTISING|CLOSED|COMPETITOR|REPEAT)$') THEN 'UNKNOWN'
ELSE [Segment (calc)] END
Nota che in questa soluzione si utilizza il simbolo '$' .
Suggerimento 3: lavora utilizzando stringhe con REGEXP anziché LEFT, MID, RIGHT, FIND, LEN
Le espressioni regolari possono essere uno strumento molto potente. Quando si eseguono operazioni di manipolazione complesse delle stringhe, è consigliabile utilizzare espressioni regolari. In molti casi, l’utilizzo di un’espressione regolare avrà come risultato un calcolo più corto e più efficiente. Per ulteriori informazioni sulle espressioni regolari, consulta il post Diventare un habitué delle regex e confrontarsi con dati imperfetti.(Il collegamento viene aperto in una nuova finestra) sul blog di Tableau.
Esempio 1
Supponiamo di avere il calcolo seguente, che rimuove i protocolli dagli URL. Ad esempio: "https://www.tableau.com" diventa "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
Soluzione
È possibile semplificare il calcolo e migliorare le prestazioni utilizzando una funzione REGEXP_REPLACE.
REGEXP_REPLACE([Server], "^(http://|https://|tcp:|\\\\)", "")
Esempio 2
Supponiamo di avere il seguente calcolo, che fornisce la seconda parte di un indirizzo IPv4. Ad esempio: "172.16.0.1" diventa "16".
IF (FINDNTH([Server], ".", 2) > 0) THEN
MID([Server],
FIND([Server], ".") + 1,
FINDNTH([Server], ".", 2) - FINDNTH([Server], ".", 1) - 1
)
END
Soluzione
È possibile semplificare il calcolo e migliorare le prestazioni utilizzando una funzione REGEXP_EXTRACT.
REGEXP_EXTRACT([Server], "\.([^\.]*)\.")
Suggerimento 4: non utilizzare insiemi nei calcoli
Se utilizzi gli insiemi in un calcolo, considera la possibilità di sostituirli con un calcolo alternativo, ma equivalente.
Esempio
Supponiamo di avere il seguente calcolo che utilizza l’insieme Top Customers (set).
IF ISNULL([Customer Name]) OR [Top customers (set)] THEN [Segment] ELSE [Customer Name] END
Soluzione 1
Se l’insieme è semplice, è possibile creare un campo calcolato che dia lo stesso risultato dell’insieme. Ad esempio:
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
Nota: in questa situazione si consiglia di utilizzare il modello SE VERO ..... ALTRIMENTI per evitare problemi di prestazioni dovuti all’uso degli insiemi. Si tratta di un modello non consigliato nella maggior parte degli scenari.
Soluzione 2
Se l’insieme è più complesso, è consigliabile creare un gruppo che mappi tutti gli elementi dell’insieme a un valore o attributo specifico, come ad esempio 'IN', e quindi modifica il calcolo per controllare tale valore/attributo. Ad esempio:
IF ISNULL([Customer Name]) OR [Top Customers(group)]='IN' THEN [Segment] ELSE [Customer Name] END
Per ulteriori informazioni, consulta Raggruppare i dati e Creare insiemi.
Suggerimento 5: non utilizzare insiemi per raggruppare i dati
Gli insiemi hanno lo scopo di effettuare confronti su sottoinsiemi di dati. I gruppi hanno lo scopo di combinare i membri correlati in un campo. Non è consigliabile convertire insiemi come nell’esempio seguente:
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
Questa soluzione non è consigliata per i seguenti motivi:
Non sempre gli insiemi sono esclusivi. Alcuni elementi possono comparire in più insiemi. Ad esempio, la Russia può essere inserita sia nell’insieme Europa che nell’insieme Asia.
Non sempre gli insiemi possono essere convertiti in gruppi. Se gli insiemi sono definiti per esclusione, condizioni o limiti, è possibile che sia difficile o addirittura impossibile creare un gruppo equivalente.
Soluzione
Raggruppa i dati utilizzando la funzione Gruppo. Per maggiori informazioni, consulta Raggruppare i dati.