OData Exact Online filter performance

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'