Performance grootboekmutaties SnelStart / query folding

Een aantal tabellen worden effectief geladen. Maar we blijven hangen op de grootboekmutaties. Nu zien we dat onze klant al een lange tijd Snelstart gebruikt. Vandaar dit probleem denken we.

Is er een mogelijkheid om de hoeveelheid data load via OData te beperken, of werkt het leggen van een filter op de datum voldoende. Oftewel: wordt query folding ondersteunt op deze manier?

Nee, “server-side filtering” zoals de Invantive UniversalSQL-variant van “query folding” tussen de Invantive UniversalSQL-engine en de platform API-server heet is momenteel bewust niet geïmplementeerd voor SnelStart.

Voor meer uitleg en geadviseerde vervolgstappen zie onderstaande tekst.

Uitdaging

SnelStart is gebaseerd op een Swagger / OpenAPI-specificatie die SnelStart bijhoudt.

SnelStart ondersteunt filters, zoals beschreven in https://b2bapi-developer.snelstart.nl/odata (vereist mogelijk aanmelden als ontwikkelaar).

Voor server-side filtering is het nodig om een filter-specificatie door te kunnen geven. Het onhandige is dat de filter-specificatie van SnelStart gebruik maakt van properties die case-sensitive zijn en in “UpperCamelCase”. De properties die SnelStart echter in de specificatie heeft staan zijn in een andere schrijfwijze. Deze andere schrijfwijze komt ook terug in de JSON.

Een voorbeeld aan de hand van artikelen:

{
  "isHoofdartikel": false,
  "subartikelen": [],
  "artikelcode": "VOORBEELD",
  "omschrijving": "Diversen diensten hoog",
  "artikelOmzetgroep": {
    "id": "11a35e1b-dce0-48ef-bf25-7480fb0563ff",
    "uri": "/artikelomzetgroepen/11a35e1b-dce0-48ef-bf25-7480fb0563ff"
  },
  "verkoopprijs": 0,
  "inkoopprijs": 0,
  "eenheid": null,
  "modifiedOn": "2023-06-29T21:44:48.51",
  "relatie": null,
  "isNonActief": false,
  "voorraadControle": false,
  "technischeVoorraad": 0,
  "vrijeVoorraad": 0,
  "extraVelden": [],
  "id": "d691991a-9c3c-45d0-b6d0-aae11727e981",
  "uri": "/artikelen/d691991a-9c3c-45d0-b6d0-aae11727e981"
}

Het gefilterd ophalen van een artikel kan met (native call):

https://b2bapi.snelstart.nl/v2/artikelen?$filter=Artikelcode ge ''VANAF''

Een alternatief is om de schrijfwijze artikelcode zoals in de JSON hierboven te gebruiken:

https://b2bapi.snelstart.nl/v2/artikelen?$filter=artikelcode ge ''VANAF''

Deze geeft een HTTP 400 Bad request:

itgenoda137
The SnelStart server cannot or will not process the request due to an apparent client error (e.g., malformed request syntax, size too large, invalid request message framing, or deceptive request routing).
itgenclr217
The remote server returned an error:
(400) Bad Request.

Aanpak

Zoals boven beschreven zouden daarom alle filters met de hand uitgezocht moeten worden en waar mogelijk geïmplementeerd. De meeste SnelStart-administraties hebben een vrij beperkte omvang omdat SnelStart overwegend voorkomt bij wat kleinere organisaties. Daarnaast is de API op zich vrij vlot, met meerdere honderden per seconde.

Tot op zijn worden daarom geen filters geïmplementeerd.

Mocht er behoefte zijn aan specifieke filters, gelieve dan een antwoord toe te voegen met daarin per tabel de gewenste velden en de relationele operator, bijvoorbeeld in het formaat:

Tabel Veld Operator
Artikelen artikelcode >=
GrootboekMutaties Mutatiedatum between

Het is handig als per tabel ook opgemerkt wordt hoeveel rijen deze grofweg in totaal bevat (10.000, 100.000, 1 miljoen, etc.).

Beste,

Ik ben een collega van lrs4, die ook bezig is met dit project.
Wat opvalt is dat we bij het laden van de tabellen in Power BI wel de preview krijgen, maar als we de data daadwerkelijk in willen laden in het model, de melding blijft staan:

Waiting for bridge-online.invantive.com

Voor nu heb ik een analyse gedaan van de tabellen welke we veel gebruiken en waar we met behulp van Query Folding hopen om de dataload te verminderen waardoor de data wel in kunnen laden.

Als ik het goed begrijp zouden we deze stappen dan als eerste door kunnen voeren zodat ze nog als native query verzonden worden?

Voor alle tabellen geldt dat het wenselijk is om kolommen te kunnen verwijderen in Query Folding. Dit kan al een groot verschil maken.

Verder zijn de onderstaande filters wenselijk:

Tabel Veld Operator
SnelStart.Grootboekmutaties.GrootboekMutaties datum >=
SnelStart.Grootboekmutaties.GrootboekMutaties Grootboek_ID =
SnelStart.Grootboekmutaties.GrootboekMutaties factuurnummer = of <>
SnelStart.Handel.VerkoopFacturen factuurdatum >=
SnelStart.Verkooporders.VerkoopOrderRegels datum >=
SnelStart.Handel.Inkoopfacturen factuurdatum >=
SnelStart.Relaties.RelatieRelatiesoorten TEXT = of <>

Is dit mogelijk?

De melding Waiting for bridge-online.invantive.com is normaliter terecht. Via Bridge Online Monitoring kan dan de echte status en voortgang bekeken worden. Bij Voorvertoning worden door Power BI Desktop alleen de eerste paar honderd of duizend rijen opgehaald. Deze verschijnen al snel omdat Invantive UniversalSQL en Bridge Online streaming zijn, zodat enkel die paar rijen opgehaald hoeven te worden.

Het filteren van velden is altijd mogelijk met query folding. In de praktijk zien we echter geen snelheidswinsten of -verliezen door het veranderen van de kolommenlijst, behoudens extreem brede kolommen zoals documenten en afbeeldingen.

De gevraagde filters zullen bestudeerd worden en later aan dit antwoord toegevoegd.

Op dit moment zijn we nog in afwachting van een reactie vanuit SnelStart. Zodra meer informatie beschikbaar is zal dit topic bijgewerkt worden.