Praca z IN
limit jest nieefektywny, a JPA nie zawsze jest odpowiednim narzędziem do pracy. Rozważ następujące kwestie:
-
Tysiące powiązanych wartości dadzą potencjalnie megabajty SQL. Wysłanie tego kodu SQL do bazy danych zajmie dużo czasu. Baza danych może potrwać dłużej, aby odczytać tekst SQL, niż wykonać go zgodnie z Odpowiedź Tomka na pytanie "Limit i konwersja bardzo długa lista IN:WHERE x IN (,,, ...)" .
-
Będzie nieefektywny z powodu parsowania SQL. Nie tylko parsowanie tego długiego kodu SQL zajmuje dużo czasu, ale każde wywołanie ma inną liczbę powiązanych parametrów, które będą analizowane i planowane osobno (patrz ten artykuł wyjaśniający to ).
-
W instrukcji SQL istnieje sztywny limit parametrów powiązanych. Możesz powtórzyć
OR
kilka razy, aby obejśćIN
limit, ale w pewnym momencie osiągniesz limit instrukcji SQL.
W przypadku tego typu zapytań zwykle lepiej jest utworzyć tymczasowe stoły
. Utwórz je przed zapytaniem, wstaw do niego wszystkie identyfikatory i połącz je z tabelą encji w zapytaniu, aby zasymulować IN
stan.
W idealnym przypadku można zastąpić JPA procedurą składowaną, zwłaszcza jeśli wyciągasz dziesiątki tysięcy identyfikatorów z bazy danych tylko po to, aby przekazać je z powrotem do bazy danych w następnym zapytaniu.