Invantive UniversalSQL vertaalt SQL select-statements naar dataverzoeken naar het achterliggende platform. Ook insert, update en delete statements worden vertaald naar dataverzoeken.
De dataverzoeken vinden plaats in een “native” formaat dat afhankelijk is van de mogelijkheden van het achterliggende platform. Een groot aantal optimalisaties - deels afhankelijk van de mogelijkheden van het platform - worden toegepast voordat de uitvoering van de statement(s) begint.
Naast de hieronder beschreven opties is het ook op veel omgevingen mogelijk om native call logging in te schakelen; zie hiervoor Collect Native Platform Call Data.
PostgreSQL native SQL met where clause
Een query met een where
clause met een veldnaam en een constante voor PostgreSQL wordt omgezet in een query volgens PostgreSQL standaarden. De where clause
wordt hierin waar mogelijk verwerkt zodat de query zo snel mogelijk verwerkt kan worden en zo weinig mogelijk gegevens transporteert.
Visma net API calls
Een query over meerdere administraties op Visma net wordt vertaald in meerdere API calls naar Visma net (een per administratie). De uitvoering hiervan vindt vaak parallel plaats.
Exact Online XML en REST
Een query met een join tussen een Exact Online XML API en een Exact Online REST API gebeurt voor de XML API op basis van XMLDownload.aspx
en voor de Exact Online REST API op basis van REST met bijvoorbeeld een $filter=
in de URL.
Analyse met sessionios@datadictionary
Je kunt uiteraard met Invantive Trace de executie volgen, maar dat is erg gedetailleerd. Via de data dictionary view sessionios
ben je meestal al goed geholpen als je alleen geinteresseerd bent in de daadwerkelijke dataverzoeken. Dit laat ik aan de hand van een voorbeeld zien.
De API calls van Invantive UniversalSQL kun je als volgt bepalen:
- Start een Invantive UniversalSQL product zoals Invantive Query Tool.
- Kies de connector voor Simplicate als voorbeeld en vul de aanmeldgegevens in:
- Voer een query uit op de uren in Simplicate:
select *
from hours /* Simplicate hours API */
- Voer nog een query uit op de uren in Simplicate, maar geef nu een filter op datum door:
select *
from hours /* Simplicate hours API met filter */
where start_date >= '2020-10'
- Terzijde: merk op dat specifiek de Simplicate API bij de uren de datum als een tekst behandelt. Mocht je
start_date
gebruiken in een vergelijking met een datum zoalstrunc(sysdate)
dan haal je waarschijnlijk eerst alle rijen op waarna Invantive UniversalSQL lokaal de gegevens filtert. Dat is vele malen trager. - Voer tenslotte een query uit om te achterhalen welke API calls Invantive UniversalSQL daadwerkelijk heeft uitgevoerd:
select *
from sessionios@datadictionary
order
by id
- Het eindresultaat laat zien dat bij de eerste query geen filter doorgegeven is naar de Simplicate API server, maar bij de tweede wel:
- Als je deze resultaten wilt exporteren naar een bestand, gebruik dan de Export knop.
- Je kunt ook vanuit een script een export maken met:
local export results as "c:\temp\ios.xlsx" format xlsx include technical headers
- De gemakkelijkste manier om zo’n export statement samen te stellen is om in de query editor een rechtsklik te doen en dan via Scripting, Data transfer, Export results een sjabloon voor het exportstatement te laten toevoegen aan de query editor.
Een luxe versie van het exporteren van de lijst van API calls is het gebruik met een variabele bestandsnaam met daarin bijvoorbeeld de tijd. Dat kan met:
local define OUT_PATH "${system:userdocumentsdirectory}\${database:connection}"
select *
from SESSIONIOS@DataDictionary
local create directory "${OUT_PATH}"
local export results as "${OUT_PATH}\sessionios.xlsx" format xlsx include technical headers
Wil je de bestandsnaam van de API call dump helemaal flexibel hebben, gebruik dan een stukje SQL met Invantive Script:
select to_char(sysdateutc, 'YYYYMM') folder
, to_char(sysdateutc, 'YYYYMMDDHH24MISS') fileprefix
local define OUT_PATH "${system:userdocumentsdirectory}\${database:connection}\${outcome:0,0}"
local define FILE_PREFIX "${outcome:0,1}"
select *
from SESSIONIOS@DataDictionary
local create directory "${OUT_PATH}"
local export results as "${OUT_PATH}\${FILE_PREFIX}sessionios.xlsx" format xlsx include technical headers