Bij het ophalen van Twinfield BTW-aangiftes via “Query 1”:
--
-- Selecteer random 10 administraties.
--
use select code, 'tfd' from offices@tfd limit 10
select /*+ http_disk_cache(false) http_memory_cache(false) */ count(*)
from Twinfield.Views.VatReturnsAsXbrl@tfd
where DECLARATION_YEAR = 2024
is de looptijd meerdere minuten.
Echter, de volgende query (“Query 2”) met identiek resultaat is in minder dan 2 seconden klaar:
select /*+ http_disk_cache(false) http_memory_cache(false) */ count(*)
from Declarations@tfd m
join VatReturnAsXbrlByDocumentId@tfd(m.company_code, m.Id) d
where m.DocumentCode in ('VATICT', 'VATTURNOVER', 'YEARLYSUPPLETION')
and m.year=2024
Query blijkt volgens de sessie I/O’s in SessionIOs@DataDictionary
ook voor BTW-aangiftes in andere jaren alle documenten op te halen en daarna pas te filteren.
De problematiek speelt niet alleen bij provider-specifieke views, maar ook bij custom views (“Query 3”):
create or replace view test
as
select m.company_code
, m.company_name
, m.* except m.company_code, m.company_name prefix with 'DECLARATION_'
, d.xbrl
from Declarations@tfd m
join VatReturnAsXbrlByDocumentId@tfd(m.company_code, m.Id) d
where m.DocumentCode in ('VATICT', 'VATTURNOVER', 'YEARLYSUPPLETION')
select *
from test@DataDictionary
where Declaration_Year=2024
Het herschrijven van de view naar “Query 4” lost het probleem op:
create or replace view test
as
select m.company_code
, m.company_name
, m.* except m.company_code, m.company_name prefix with 'DECLARATION_'
, d.xbrl
from ( select * from Declarations@tfd m where m.DocumentCode in ('VATICT', 'VATTURNOVER', 'YEARLYSUPPLETION') ) m
join VatReturnAsXbrlByDocumentId@tfd(m.company_code, m.Id) d
select *
from test@DataDictionary
where Declaration_Year=2024
Vreemd genoeg zijn dan bij raadpleging van de view Query 4 met een filter op jaar net zo weinig sessie I/O’s nodig als bij Query 2, terwijl vrijwel alle DocumentCode
s betrekking hebben op VATTURNOVER
en YEARLYSUPPLETION
.
Het blijkt dat de volgende query (“Query 5”) ook snel blijft zolang de where
clause maar niet in de buitenste schil van de view komt:
create or replace view test
as
select m.company_code
, m.company_name
, m.* except m.company_code, m.company_name prefix with 'DECLARATION_'
, d.xbrl
from ( select * from Declarations@tfd m where m.DocumentCode like 'VAT%') m
join VatReturnAsXbrlByDocumentId@tfd(m.company_code, m.Id) d
Het toevoegen van een willekeurige niet-optimaliseerbare where
clause leidt niet tot het enorme performanceverlies, maar specifiek een filter op DocumentCode
wel, terwijl alle rijen hieraan voldoen hier in “Query 6”:
create or replace view test
as
select m.company_code
, m.company_name
, m.* except m.company_code, m.company_name prefix with 'DECLARATION_'
, d.xbrl
from ( select * from Declarations@tfd m where m.DocumentCode like 'VAT%') m
join VatReturnAsXbrlByDocumentId@tfd(m.company_code, m.Id) d
where m.DocumentCode in ('VATICT', 'VATTURNOVER', 'YEARLYSUPPLETION')
Vereenvoudiging van de kolomnaam DECLARATION_YEAR
naar YEAR
maakt geen verschil in deze “Query 7”:
create or replace view test
as
select m.*
, d.xbrl
from ( select * from Declarations@tfd m where m.DocumentCode like 'VAT%') m
join VatReturnAsXbrlByDocumentId@tfd(m.company_code, m.Id) d
where m.DocumentCode in ('VATICT', 'VATTURNOVER', 'YEARLYSUPPLETION')