Laden van 4 Exact Online bedrijven in dashboard duurt lang

We hebben een groot aantal interne administraties en van zelfboekende klanten. Een van de dashboards duurt erg lang. Het gaat om een klant met vier Exact Online administraties waarvan de gegevens samengevoegd worden in 1 Power BI dashboard.

De volgende query duurt erg lang en volgens het scherm Session I/O’s raakt hij vrijwel alle administraties terwijl er toch echt maar vier Exact administraties gevraagd worden:

let
    Source = OData.Feed("BASEURL", null, [Implementation="2.0"]),
    #"ExactOnlineREST.Incremental.TransactionLinesIncremental@eol_table" = Source{[Name="ExactOnlineREST.Incremental.TransactionLinesIncremental@eol",Signature="table"]}[Data],
    #"Filtered Rows" = Table.SelectRows(#"ExactOnlineREST.Incremental.TransactionLinesIncremental@eol_table", each [Division] = 868041 or [Division] = 868045 or [Division] = 868046 or [Division] = 868047)
in
    #"Filtered Rows"

Hoe kan ik deze query versnellen?

De vraag betreft een optimalisatieprobleem voor Power BI met Invantive Cloud. Specifiek gaat het om de optimalisatie van een OData filter. Hierover staan een aantal algemene tips op Optimize OData Filters to Improve Performance.

Probleem bij deze query is dat Power BI geen gebruik maakt van de IN-operator van OData. Met de IN-operator kun je een lijst van waardes doorgeven waarvan je de gegevens wilt hebben. Dat mogen allemaal verschillende waardes zijn, zoals ‘Appels’ en ‘Peren’, maar ook een opeenvolgende lijst zoals ‘2017’, ‘2018’, ‘2019’.

Mocht het een opeenvolgende lijst zijn van administraties (onwaarschijnlijk, maar gaat wel vaker op bij optimalisatie op bijvoorbeeld boekjaar), dan kun je Power BI verleiden om een slimmer filter te gebruiken in plaats van OR: gebruik een waarde groter dan of gelijk aan (>=) en kleiner dan/gelijk (<=).

Bij administraties zal dat meestal niet lukken om ze te behandelen als een opeenvolgende reeks.

SQL-statement

Voor de genoemde query zal een stukje Invantive SQL samengesteld worden zoals:

select t.* 
from   ExactOnlineREST.Incremental.TransactionLinesIncremental@eol t 
where  (((([Division] = :w1) or ([Division] = :w2)) or ([Division] = :w3)) or ([Division] = :w4))

De gegenereerde Invantive SQL heeft een filtergroep, bestaande uit OR-ed elementen op division. Een dergelijk filter met OR wordt sinds juli 2021 geoptimaliseerd om maar 4 van de zeg 1.000 administraties te verwerken. Zie Betere prestaties op Power BI voor Exact Online accountants voor een uitleg.

Om onnodige kosten te voorkomen is het advies wel om altijd de Exact Online app machtigingen te beperken Hoe trek ik de app rechten in voor Exact Online? tot de minimaal noodzakelijke administraties of een use statement in de on startup te laten zetten.