Arbeta runt IN
limit är ineffektivt och JPA är inte alltid rätt verktyg för jobbet. Tänk på följande:
-
Tusentals bundna värden kommer att resultera i potentiellt megabyte av SQL. Det kommer att ta lång tid att skicka denna SQL till databasen. Databasen kan ta längre tid att läsa SQL-texten än att köra den enligt Toms svar på frågan "Begränsning och konvertering mycket lång IN-lista:WHERE x IN ( ,,, ...)" .
-
Det kommer att vara ineffektivt på grund av SQL-parsning. Det tar inte bara lång tid att analysera denna långa SQL utan varje anrop har olika antal bundna parametrar som kommer att analyseras och planeras separat (se den här artikeln som förklarar det ).
-
Det finns en hård gräns för bundna parametrar i en SQL-sats. Du kan upprepa
OR
några gånger för att kringgåIN
limit men du kommer att nå SQL-satsens gräns någon gång.
För dessa typer av frågor är det vanligtvis bättre att skapa tillfälliga tabeller
. Skapa en före din fråga, infoga alla identifierare i den och sammanfoga den med entitetstabellen i din fråga för att simulera IN
skick.
Helst kan du ersätta JPA med en lagrad procedur, särskilt om du tar ut tiotusentals identifierare från databasen bara för att skicka tillbaka dem till databasen i nästa fråga.