Itgenase288: The list of values with an IN for GIS_WAARDE must be less than or equal to 1.000 on OracleManaged

Bij het uitvoeren van een query met een join treedt de volgende foutmelding op:

itgenase288: The list of values with an IN for GIS_WAARDE must be less than or equal to 1.000 on OracleManaged.

voor de query:

select 1 c
from   table1@pg piy
left
outer
join   table2@ora gis
on     gis.waarde = piy.column

Hoe kan deze foutmelding opgelost worden?

Standaard maakt Invantive SQL gebruik van hash-joins (documentatie).

In plaats van alle gegevens van twee gerelateerde tabellen op te halen en te koppelen, wordt een van beide tabellen gebruikt als uitgangspunt en worden voor alle bijbehorende waardes uit de andere tabel queries afgevuurd. Dit gedrag wordt gehanteerd tot een bepaald maximum aantal waardes, die standaard op 5.000 staan. Daarboven wordt een full join gemaakt tussen beide tabellen.

In het geval van bijvoorbeeld OData gebeurt dat met een of meerdere queries, telkens met een beperkt aantal waardes.

In het geval van bijvoorbeeld Oracle gebeurt dat met precies één aparte query met een lange IN-clause. Oracle accepteert echter maximaal 1.000 elementen achter een IN. In de huidige versie 20.2.56 van Invantive SQL leidt een hash-join met bijvoorbeeld 2.000 elementen tot een foutmelding.

Hash-joins kunnen volledig uitgeschakeld worden voor een join met de no_join_set hint of beperkt qua aantal met een join_set hint.

Voorlopig is het advies om een no_join_set te hanteren mits het datavolume van de tabellen niet extreem groot is met bijvoorbeeld:

select /*+ no_join_set(gis, waarde) */
       1 c
...

Voor de langere termijn wordt de Invantive SQL engine verbeterd op het gebied van hash-joins zodat ook op bijvoorbeeld Oracle hash-join gebruikt kan worden met meer dan 1.000 waarden.