OData Exact Online filter performance

Bij filtering de bestanden via OData duurt het minuten om de data op te vragen ook al is het resultaat een paar records.

In dit voorbeeld probeer ik de mutaties van vandaag op te halen van 1 divisie

$Filter=Division eq 111111 and Modified gt 2024-12-04&$Orderby=Modified

Wat gaat hier niet goed?

Is het mogelijk om een (geanonimiseerde) schermafdruk van de details van het verzoek in Invantive Bridge Online Monitoring toe te voegen zoals beschreven in Meer inzicht met nieuwe Bridge Online Monitoring?

De details vindt u door te klikken op het downloadverzoek welke het onderwerp van dit onderwerp representeert.

Gelieve tenminste de volgende gegevens zichtbaar te laten:

  • de titelbalk met de request ID,
  • de statuscode, netwerkgrootte en tijdstippen in de linkerkolom,
  • de foutcode en foutmelding helemaal onderaan in de linkerkolom,
  • de gehele rechterkolom.

Query:

select t.*
from   ExactOnlineREST.Cashflow.PaymentsBulk@eol t
where  Division = :w1
and    Modified > :w2

met:

  • w1 = 2676517
  • w2 = 04-12-2024 00:00:00

Server-side filtering via query folding in Power BI is op Exact Online sinds 2022 beperkt voor een aantal tabellen. De reden hiervan is niet duidelijk.

Voor performanceverbetering is verstandig een sneller filter te kiezen.

SessionIOs

Door een query als deze uit te voeren is na afloop in SessionIOs@DataDictionary zichtbaar dat geen server-side filtering wordt toegepast, anders dan het doorsturen van de divisiecode. Het datumfilter wordt dus niet doorgestuurd:

select url
from   sessionios@datadictionary
order
by     id desc

met als resultaat:

https://start.exactonline.nl/api/v1/10523/bulk/cashflow/Payments?$select=Account,...,YourRef&$skiptoken=guid'b654ca40-fe89-4022-a239-a988e82e6225'

Aan het ontbreken van een $filter richting Exact Online is te zien dat dit veld niet doorgestuurd kan worden.

SQL execution steps

Het wordt mooier zichtbaar door de SQL executiestappen op te vragen zoals beschreven in SQL execution steps.

Het uitlezen van SystemSqlExecutionSteps@datadictionary in relatie tot de bijpassende kolommen uit SessionIOs@DataDictionary laat nog mooier het ontbreken van server-side filtering zien:

ID PARENT_ID DEPTH DURATION_MS DESCRIPTION
2462 2461 7 16857 Data container I/O on ‘t’ (EXACTONLINEREST.CASHFLOW.PAYMENTSBULK)
2461 2460 6 16858 Data container I/O on ‘t’
2460 2459 5 16858 Filter
2459 2458 4 16858 Column chaining into wider list
2458 2457 3 16858 Select columns
2457 2456 2 16858 Data container I/O on ‘t’
2456 1 16865 Root

Beschikbare kolommen

De kolommen beschikbaar voor server-side filtering zijn op te vragen via bijvoorbeeld:

select name
,      can_filter_server_side
from   SystemTableColumns@DataDictionary
where  table_name = 'PaymentsBulk'

Snelle Versie

Het ophalen kan sneller gemaakt worden door een van de kolommen met server-side filtering te gebruiken, zoals in de query:

select t.*
from   ExactOnlineREST.Cashflow.PaymentsBulk@eol t
where  Division = :w1
and    EntryDate > :w2

Deze is in een testomgeving 30x sneller als een filter op Modified.

In SessionIOs@DataDictionary is te zien dat dit filter wel doorgegeven kan worden aan Exact Online:

https://start.exactonline.nl/api/v1/10523/bulk/Cashflow/Payments?$select=Account,...,YourRef&$filter=EntryDate%20gt%20datetime'2024-12-04T00:00:00'

Thanks, dit maakt enorm verschil. Helaas geen generieke oplossing voor alle bestanden, maar zo kan ik door.

1 Like

Dit topic is 3 dagen na het laatste antwoord automatisch gesloten. Nieuwe antwoorden zijn niet meer toegestaan.