Best practices voor het maken van berekeningen in Tableau
Dit artikel beschrijft verschillende tips en richtlijnen voor het maken van efficiënte berekeningen in Tableau. Deze richtlijnen zijn bedoeld om u te helpen de prestaties van uw werkmap te optimaliseren. Raadpleeg het gedeelte Werkmapprestaties optimaliseren voor meer informatie over alle manieren waarop u de prestaties van werkmappen kunt verbeteren.
Algemene regel: vermijd meermalig gebruik van een berekend veld in een andere berekening
Als u meerdere keren naar hetzelfde berekende veld verwijst binnen een andere berekening, gaat dit ten koste van de prestaties. Als u een berekend veld binnen een berekening gebruikt (ofwel een geneste berekening maakt), is het raadzaam hiernaar slechts één keer in de berekening te verwijzen.
Het meermalig verwijzen naar een veld (eindveld) in een berekening zal de prestaties normalerwijs niet verslechteren.
Voorbeeld
Stel dat u een berekend veld maakt dat een ingewikkelde berekening van meerdere regels gebruikt om vermeldingen of Twitter-handles in tweets te vinden. Het berekende veld heet Twitter Handle. Elke handle die wordt geretourneerd, begint met het teken @ (bijvoorbeeld: @gebruiker).
Voor uw analyse wilt u het symbool @ verwijderen.
Dit doet u door de volgende berekening te gebruiken om het eerste teken uit de string te verwijderen:
RIGHT([Twitter Handle], LEN([Twitter Handle]) -1)
Deze berekening is vrij eenvoudig. Omdat er echter twee keer naar de berekening Twitter Handle wordt verwezen, wordt die berekening tweemaal uitgevoerd voor elke record in uw databron: één keer voor de RIGHT-functie en nogmaals voor de LEN-functie.
Om te voorkomen dat dezelfde berekening meermaals wordt uitgevoerd, kunt u de berekening wijzigen in een berekening die slechts eenmaal gebruikmaakt van de Twitter Handle-berekening. In dit voorbeeld kunt u MID gebruiken om hetzelfde doel te bereiken:
MID([Twitter Handle], 2)
Tip 1: converteer meerdere gelijkheidsvergelijkingen naar een CASE-expressie of een groep
Stel dat u de volgende berekening hebt, waarbij het berekende veld Person (calc) meerdere keren wordt gebruikt en waarbij een reeks OR-functies wordt gebruikt. Hoewel deze berekening een eenvoudige logische expressie is, veroorzaakt deze prestatieproblemen bij query's, omdat de berekening Person (calc) minstens tien keer wordt uitgevoerd.
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
Probeer de volgende oplossingen in plaats van een gelijkheidsvergelijking te gebruiken.
Oplossing 1
Gebruik een CASE-expressie. Bijvoorbeeld:
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 dit voorbeeld wordt slechts één keer verwezen naar het berekende veld Person (calc). Daarom wordt het slechts één keer uitgevoerd. CASE-expressies zijn ook verder geoptimaliseerd in de querypijplijn, zodat u een extra prestatievoordeel krijgt.
Oplossing 2
Maak een groep in plaats van een berekend veld. Zie Uw data groeperen voor meer informatie.
Tip 2: converteer meerdere tekenreeksberekeningen naar één REGEXP-expressie
Opmerking: REGEXP-berekeningen zijn alleen beschikbaar bij gebruik van Tableau-data-extracten of bij verbinding met databronnen van de volgende typen: tekstbestand, Hadoop Hive, Google BigQuery, PostgreSQL, Tableau-data-extract, Microsoft Excel, Salesforce, Vertica, Pivotal Greenplum, Teradata (versie 14.1 en hoger) en Oracle. Zie Aanvullende functies voor meer informatie.
Voorbeeld 1: CONTAINS
Stel dat u de volgende berekening hebt, waarbij het berekende veld Category (calc) meerdere keren wordt gebruikt. Hoewel deze berekening ook een eenvoudige logische expressie is, worden de prestaties van query's erdoor aangetast, omdat de berekening Category (calc) meermaals wordt uitgevoerd.
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
U kunt een REGEXP-expressie gebruiken om dezelfde resultaten te krijgen met minder herhaling.
Oplossing
IF REGEXP_MATCH([Segment (calc)], 'UNKNOWN|LEADER|ADVERTISING|CLOSED|COMPETITOR|REPEAT') THEN 'UNKNOWN'
ELSE [Segment (calc)] END
Bij tekenreeksberekeningen die een soortgelijk patroon gebruiken, kunt u dezelfde REGEXP-expressie gebruiken.
Voorbeeld 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'
Oplossing
IF REGEXP_MATCH([Segment (calc)], '^(UNKNOWN|LEADER|ADVERTISING|CLOSED|COMPETITOR|REPEAT)') THEN 'UNKNOWN'
ELSE [Segment (calc)] END
Houd er rekening mee dat het symbool ^ in deze oplossing wordt gebruikt.
Voorbeeld 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
Oplossing
IF REGEXP_MATCH([Segment (calc)], '(UNKNOWN|LEADER|ADVERTISING|CLOSED|COMPETITOR|REPEAT)$') THEN 'UNKNOWN'
ELSE [Segment (calc)] END
Houd er rekening mee dat het symbool $ in deze oplossing wordt gebruikt.
Tip 3: manipuleer tekenreeksen met REGEXP in plaats van LEFT, MID, RIGHT, FIND, LEN
Reguliere expressies kunnen een zeer krachtig hulpmiddel zijn. Overweeg het gebruik van reguliere expressies bij complexe tekenreeksmanipulatie. In veel gevallen zal het gebruik van een reguliere expressie resulteren in een kortere en efficiëntere berekening. Zie de blogpost Vertrouwd raken met regex en werken met imperfecte data(Link wordt in een nieuw venster geopend) (in het Engels) op de Tableau-blog voor meer informatie over reguliere expressies.
Voorbeeld 1
Stel dat u de volgende berekening hebt, waarbij protocollen uit URL's worden verwijderd. Bijvoorbeeld: "https://www.tableau.com" wordt "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
Oplossing
U kunt de berekening vereenvoudigen en de prestaties verbeteren door een REGEXP_REPLACE-functie te gebruiken.
REGEXP_REPLACE([Server], "^(http://|https://|tcp:|\\\\)", "")
Voorbeeld 2
Stel dat u de volgende berekening hebt, die het tweede deel van een IPv4-adres retourneert. Bijvoorbeeld: "172.16.0.1" wordt "16".
IF (FINDNTH([Server], ".", 2) > 0) THEN
MID([Server],
FIND([Server], ".") + 1,
FINDNTH([Server], ".", 2) - FINDNTH([Server], ".", 1) - 1
)
END
Oplossing
U kunt de berekening vereenvoudigen en de prestaties verbeteren door een REGEXP_EXTRACT-functie te gebruiken.
REGEXP_EXTRACT([Server], "\.([^\.]*)\.")
Tip 4: gebruik geen sets in berekeningen
Als u sets in een berekening gebruikt, overweeg dan om deze te vervangen door een alternatieve maar gelijkwaardige berekening.
Voorbeeld
Stel dat u de volgende berekening hebt, waarbij gebruik wordt gemaakt van de set Top Customers (set).
IF ISNULL([Customer Name]) OR [Top customers (set)] THEN [Segment] ELSE [Customer Name] END
Oplossing 1
Als de set eenvoudig is, kunt u een berekend veld maken dat hetzelfde resultaat retourneert als de set. Bijvoorbeeld:
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
Opmerking: gebruik van het patroon WHEN TRUE … ELSE wordt in deze situatie aanbevolen om prestatieproblemen als gevolg van het gebruik van sets te voorkomen. In de meeste scenario's is dit geen aanbevolen patroon.
Oplossing 2
Als de set complexer is, kunt u overwegen een groep te maken die alle elementen in de set toewijst aan een bepaalde waarde of een bepaald kenmerk, zoals 'IN', en vervolgens de berekening aan te passen om te controleren op die waarde of dat kenmerk. Bijvoorbeeld:
IF ISNULL([Customer Name]) OR [Top Customers(group)]='IN' THEN [Segment] ELSE [Customer Name] END
Zie Uw data groeperen en Sets maken voor meer informatie.
Tip 5: gebruik geen sets om uw data te groeperen
Sets zijn bedoeld om vergelijkingen te maken op subsets van data. Groepen zijn bedoeld om verwante leden in een veld te combineren. Het converteren van sets naar groepen, zoals in het volgende voorbeeld, wordt niet aanbevolen:
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
Dit wordt niet aanbevolen om de volgende redenen:
Sets zijn niet altijd exclusief. Sommige leden kunnen in meerdere sets voorkomen. Rusland zou bijvoorbeeld zowel in de set Europe als in de set Asia kunnen worden geplaatst.
Sets kunnen niet altijd naar groepen worden vertaald. Als de sets worden gedefinieerd door uitsluiting, voorwaarden of limieten, kan het moeilijk of zelfs onmogelijk zijn om een gelijkwaardige groep te creëren.
Oplossing
Groepeer uw data met behulp van de functie Groep. Zie Uw data groeperen voor meer informatie.