De API van Odoo behoort tot de industrieleiders in termen van leesperformance, zelfs bij zeer grote datasets. De Invantive SQL-driver voor Odoo is verbeterd om gebruik te maken van deze mogelijkheden om grote datavolumes eenvoudig en snel te verwerken, terwijl de belasting van de Odoo-servers wordt verminderd.
De volgende verbeteringen zijn aangebracht in de driver voor Odoo:
- paginering, waardoor de tijd tot ontvangst van de eerste rij wordt ingekort,
- server-side filtering (in Power BI bekend als “query folding”).
Paginering met Odoo
Odoo ondersteunt gepagineerde en niet-gepagineerde toegang via de externe API. Het gebruik van pagina’s kan de tijd verkorten totdat de eerste rij gegevens beschikbaar komt voor de gebruiker.
In Power BI bijvoorbeeld vraagt de Power BI Navigator bij het navigeren naar een Odoo-tabel aan de Invantive SQL-driver om alleen de eerste x aantal rijen op te halen (x varieert hierbij tussen 100 en 1000). Niet-gepagineerde toegang maakt het nodig om eerst alle rijen te laden voordat een preview wordt weergegeven in de Power BI Navigator, maar gepagineerde toegang toont de preview binnen enkele seconden, terwijl het de belasting van CPU, het netwerk en de I/O op de Odoo-server verlaagt.
Dit geldt echter ook voor typische data-integratie queries en vooral bij grootschalige data-integratie met behulp van Invantive’s speciale synchronize
statement om data uit te wisselen in Odoo met (bijvoorbeeld) een warehouse management systeem.
Paginering is nu ingeschakeld met een standaard paginagrootte van 1500.
Standaard paginagrootte op Odoo
Er is een analyse gemaakt om een eerste zinvolle waarde voor paginagrootte vast te stellen met behulp van de tabel event
met 9390 agenda-afspraken op odoo.com. Een aantal queries werd uitgevoerd voor elke geteste paginagrootte op een snel HP-werkstation met een snelle internetverbinding:
set use-http-disk-cache false
set use-http-memory-cache false
set requested-page-size x
select count(*)
from ( select 1 c
from event
limit 10000
)
select avg(cast(duration_ms as decimal))
from SessionIos@DataDictionary
where call_safe_name like '%event'
and id between z1 and z2
De resultaten staan in de onderstaande tabel. De resultaten zijn inclusief de verwerkingstijd door de Invantive SQL driver, maar exclusief rijverwerking en andere SQL-pipeline activiteiten op hogere niveau’s; de werkelijke API responstijden zullen iets sneller zijn. Er is gemeten dat het ophalen van individuele pagina’s niet gerelateerd is aan het paginanummer, dus de onderstaande tabel geeft alleen de responstijden van individuele pagina’s van de Odoo externe API weer.
De externe API op Odoo.com heeft geen formele definitie van een rate limit naast “redelijk gebruik” vanaf maart 2023, maar een snelheidslimiet van 60 API-aanroepen per database per minuut werd beschouwd als “redelijk gebruik”.
Paginagrootte | Individuele Page (ms) | Alle, zonder rate limit (ms) | Alle, met rate limit (ms) | Gemeten (ms) | Doorvoersnelheid (rijen/seconde) |
---|---|---|---|---|---|
10 | 100 | 93900 | 939000 | 939000 | 10 |
100 | 237 | 22254 | 93900 | 93900 | 100 |
500 | 748 | 14047 | 18780 | 18780 | 500 |
1000 | 1382 | 12977 | 9390 | 12977 | 724 |
10000 | 12133 | 12133 | 1000 | 12133 | 774 |
De zelfopgelegde rate limit van 60 API-aanroepen per minuut beperkt het maximum tot een bepaald paginagrootte-niveau ergens tussen 500 en 1000 rijen per API-aanroep. De maximale doorvoer tijdens de meting bleek ongeveer 750 rijen per seconde te zijn. Het verhogen van de paginagrootte naar 10.000 verhoogt de prestaties niet significant, maar verhoogt de responstijd van de eerste pagina met een factor van bijna 10.
Daarom is de standaard paginagrootte ingesteld op 1500 rijen per pagina, waarmee een evenwicht wordt gevonden tussen snelle ontvangst van de eerste rijen binnen de grens van 2500 ms die door informatie-ergonomie is vastgesteld voor een acceptabele respons en maximale doorvoer.
Server-side Filtering
De externe Odoo API heeft uitgebreide ondersteuning voor filteren. De SQL-driver voor Odoo ondersteunt nu filteren voor optimale prestaties wanneer slechts een selectie van de rijen wordt opgevraagd door de Invantive SQL-query.
“Server-side filtering” stuurt Invantive SQL-condities (inclusief datareducties verzonden door Power BI met behulp van “query-folding”) door naar de externe API van Odoo. Deze voorwaarden worden normaliter opgenomen in de where
clausule van de tabel in de from
en in de on
clausule van een samengevoegde tabel. Condities worden vereenvoudigd voordat ze worden doorgestuurd naar Odoo. Dergelijke vereenvoudigingen van SQL-query’s omvatten vereenvoudiging van constante expressies en het herschrijven van query’s tussen hashjoins en join sets, afhankelijk van het aantal gegevensrijen dat wordt gevonden in het uitvoeringsplan van de Invantive SQL-query.
De volgende filtercondities in SQL-query’s worden momenteel doorgestuurd naar Odoo:
- gelijk,
- niet gelijk aan,
- kleiner dan,
- kleiner dan of gelijk,
- groter dan,
- groter dan of gelijk,
- in,
- niet in,
- tussen,
- zoals.
Prestatie-impact van filteren op de server
Als voorbeeld van prestatieverbeteringen door filteren op de server worden de volgende SQL-query’s gebruikt. Beide queries geven hetzelfde resultaat van 3 rijen in de testdataset uit een tabel met 9380 rijen.
Odoo SQL-query 1
De eerste query voor Odoo is zo geschreven dat de filters kunnen worden gebruikt:
select *
from event
where start_date >= to_date('20210301', 'YYYYMMDD')
and stop_date <= to_date('20210308', 'YYYYMMDD')
Odoo SQL-query 1
De tweede query herformuleert de oorspronkelijke SQL-query om het gebruik van filters effectief te voorkomen:
select *
from event
where start_date + 1 >= to_date('20210301', 'YYYYMMDD') + 1
and stop_date + 1 <= to_date('20210308', 'YYYYMMDD') + 1
Resultaten
De onderstaande tabel toont de prestatieverbeteringen in responstijd en verbruikte netwerkbandbreedte zoals gevonden in SessionIOs@DataDictionary
:
Query# | Reactietijd (ms) | Bandbreedte (KB) |
---|---|---|
1 | 84 | 9 |
2 | 12.251 | 34.769 |
Server-side filtering verminderde de totale reactietijd met een factor 150 en verminderde het bandbreedtegebruik met een kolossale factor van 3863.
Samenvatting
De externe API van Odoo biedt naast een volledige dekking van de “modellen” (tabellen) ook uitstekende leesprestaties in termen van doorvoersnelheid en netwerkgebruik.
Vergeleken met andere cloudplatformen zoals Twinfield en Exact Online, biedt de externe API van Odoo een zeer groot voordeel voor grote omgevingen dankzij de geavanceerde filtermogelijkheden over alle velden zonder beperkingen in grootte van de filters en payload. Groupfuncties zijn ook beschikbaar, maar nog niet geactiveerd op Invantive SQL.
Odoo is vergelijkbaar met populaire platformen zoals AFAS Profit en Salesforce in termen van doorvoersnelheid en schaalbaarheid.
Beschikbaarheid van Odoo SQL-prestatieverbeteringen
De genoemde prestatieverbeteringen voor de SQL-driver op Odoo zijn beschikbaar vanaf BETA-release 22.1.150.