OData-filters optimaliseren om de prestaties te verbeteren

Go to English version

De OData-specificatie biedt vele mogelijkheden om filters door te sturen naar de OData-server. Power BI doet goed werk met het afbeelden van filterstappen naar OData-filters dankzij query-folding, maar vooral bij een grote Power BI-omgeving met tientallen of honderden bedrijven kan het nodig zijn de prestaties van query’s te controleren en te verbeteren. Het verbeteren van queryprestaties vermindert looptijd, abonnementskosten en kosten voor bandbreedte, verwerkingskracht en gebruikerstijd.

Invantive Bridge Online, onderdeel van Invantive Cloud, is een OData4-proxy die uw OData4 beheert en vertaalt naar real-time verzoeken voor meer dan 70 (cloud) platformen. Invantive Bridge Online kan OData-verzoeken afhandelen die over honderden bedrijven lopen in populaire boekhoudpakketten zoals Twinfield, AFAS, Exact Online of Visma.net Financials.

In dit onderwerp wordt de impact van verschillende filters op het resourceverbruik uitgelegd.

Leidraad

Voordat u verder gaat, zorg ervoor dat u de structuur van Invantive Cloud begrijpt door de inhoud op Invantive Cloud Structure te bestuderen.

Een lijst met prestatie technieken en tips over het optimaliseren van de prestaties en download grootte voor Power BI is beschikbaar op Overzicht van Power BI-technieken om prestaties en downloadtijd te verbeteren om u te helpen de Power BI-rapportprestaties nog verder te verbeteren.

Query voor metingen

Exact Online Testset

De Power BI-omgeving gebruikt in deze metingen was een testomgeving met 200 kleine Exact Online bedrijven. De tabel TransactionLinesIncremental werd gebruikt, omdat dat de meest intensief gebruikte tabel op Exact Online is.

Een telling van transactieregels over de 200 bedrijven is slechts 217.668 rijen. De gecomprimeerde downloadgrootte via OData4 is 16 MB (ongecomprimeerd 245 MB).

Alle tests werden tweemaal uitgevoerd om er zeker van te zijn dat alle caches geladen en vers waren. Alleen de meting van de tweede test is opgenomen.

Query-metingen werden vastgesteld met behulp van [Invantive Bridge Online Monitoring] (https://bridge-online.cloud/monitoring).

Volledige Download

Eerst werden alle transacties ongefilterd gedownload (zonder zoekoptie):

  • Duur: 30 seconden
  • Aantal rijen gegevens: 217,668
  • Grootte van de gedownloade gegevens: 15.522.956
  • URL: BASE

waarbij “BASE” de URL van de server is plus de tabelnaam ExactOnlineREST.Incremental.TransactionLinesIncremental@url.

De gegenereerde SQL is:

select t.* 
from   ExactOnlineREST.Incremental.TransactionLinesIncremental@eol t

De Invantive SQL-engine die op Invantive Cloud draait zal meerdere verzoeken uitvoeren, minstens één per Exact Online bedrijf, om alle relevante gegevens op te halen. Power BI hoeft slechts één verzoek uit te voeren op het OData-eindpunt; Invantive Cloud voegt de gegevens van alle bedrijven samen in één dataset.

In dit scenario verhoogt het gebruik van een enkel verzoek op OData per dataset de OData-prestaties aanzienlijk: Invantive Cloud retourneert op een streaming manier gegevens over alle geselecteerde Exact Online bedrijven heen.

Andere datasets kunnen parallel worden opgehaald om de OData-prestaties verder te verbeteren. Deze mengen ook gegevens van meerdere Exact Online-administraties.

Download één Exact Online-administratie

In de Power Query Editor is slechts één Exact Online divisie 868045 geselecteerd:

Power BI filter op 1 Exact Online-administratie|394x305](upload://dIA3Ujm1DeePSWykL18K9HoVXQd.png).

Er is een filterstap toegevoegd om slechts één bedrijf op te halen:

Nieuwe filterstap op Exact Online-administratie|424x279](upload://7p7be8NWIfldrjVq3KuDEHTox3x.png)

Merk op dat deze filterstap direct na het downloaden staat. Dat voorkomt dat Power BI query-folding niet meer kan toepassen.

De metingen waren:

  • Duur: 1 seconde
  • Aantal rijen gegevens: 172
  • Data download grootte: 17.986
  • URL: BASE?$filter=Divisie eq 868045

De query in de geavanceerde editor is:

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] = 868045))
in
    #"Filtered Rows"

De gegenereerde SQL voor Invantive SQL is:

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

De Invantive SQL heeft een filter op division, waardoor de SQL-engine alleen deze administratie kan ophalen en retourneren.

In dit scenario, zowel tussen Power BI en Invantive Bridge Online, als tussen Invantive Bridge Online en Exact Online, worden de filters doorgestuurd. De client-side filtering wordt nog steeds toegepast, maar gooit niet meer een significant percentage van de payload ongebruikt weg.

Vier Exact Online-administraties downloaden

In de Power Query Editor zijn vier Exact administraties geselecteerd:

Selecteer vier Exact Online-administraties

De filterrijen worden weergegeven als:

De metingen waren:

  • Duur: 1 seconde
  • Aantal rijen gegevens: 1,114
  • Data download grootte: 102.562
  • URL: BASE?$filter=Division eq 868041 or Division eq 868045 or Division eq 868046 or Division eq 868047

De query in de Geavanceerde Editor is:

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"

Merk op dat Power BI de selectie van waarden herschrijft in een OR in plaats van de IN-operator te gebruiken.

De gegenereerde Invantive SQL is:

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. Het filter op divisie wordt niet doorgestuurd en alle bedrijven die in de On Startup SQL van de database zijn geconfigureerd worden bevraagd en in rekening gebracht.

In dit scenario, tussen Power BI en Invantive Bridge Online, worden de filters doorgestuurd. Echter, tussen Invantive Bridge Online en de Exact Online API server, past de Invantive SQL-engine overmatige client-side filtering toe op het antwoord van de API servers. De client-side filtering vernietigt ongebruikt 90+% van de payload.

Een prestatieverbetering is gemaakt op Invantive SQL; vanaf juli 2021 zullen alleen de gespecificeerde bedrijven worden benaderd. Voorheen werden alle bedrijven met app rechten benaderd. Voor meer details: zie Betere prestaties op Power BI voor Exact Online accountants.

Vier bedrijven en Filter op Boekjaar

De selectie van bedrijven wordt verbeterd door een filter toe te passen op de boekjaren:

Filter op Exact Online boekjaren

De metingen waren:

  • Duur: 1 seconde
  • Aantal rijen gegevens: 482
  • Data download grootte: 44.809
  • URL: BASE?$filter=(Division eq 868041 or Division eq 868045 or Division eq 868046 or Division eq 868047) and (FinancialYear eq 2011 or FinancialYear eq 2012 or FinancialYear eq 2013)

De query in de Geavanceerde Editor is:

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) and ([FinancialYear] = 2011 or [FinancialYear] = 2012 or [FinancialYear] = 2013))
in
    #"Filtered Rows"

Het OData-verzoek wordt vertaald naar de volgende Invantive SQL:

OData query was transformed into: select t.*
from   ExactOnlineREST.Incremental.TransactionLinesIncremental@eol t
where  ((((([Division] = :w1) or ([Division] = :w2)) or ([Division] = :w3)) or ([Division] = :w4)) and ((([FinancialYear] = :w5) or ([FinancialYear] = :w6)) or ([FinancialYear] = :w7)))

De Invantive SQL raakt dezelfde Exact Online bedrijven als voorheen, maar past per bedrijf een keurig filter toe op boekjaar.