Odoo SQL-driver prestatieverbeteringen voor zeer grote Odoo-omgevingen

Go to English version

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.