sql >> Databasteknik >  >> RDS >> Oracle

JPA och 1000 ID används i Oracle IN Operator

Arbeta runt IN limit är ineffektivt och JPA är inte alltid rätt verktyg för jobbet. Tänk på följande:

  1. 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 ( ,,, ...)" .

  2. 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 ).

  3. 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.



  1. Hur man skickar ArrayList<> som IN-klausul i SQL-fråga i MySQL

  2. Välja värden från Oracle Table Variable/Array?

  3. Varför returnerar mysqli fetch() tomma resultat från långtextkolumnen?

  4. Använda en databastabell som en kö