W Postgres możesz określić klauzulę IN, na przykład:
SELECT * FROM user WHERE id IN (1000, 1001, 1002)
Czy ktoś wie, jaka jest maksymalna liczba parametrów, które możesz przekazać do IN?
postgresql
Alex Riley
źródło
źródło
PLAN ZAPYTANIA
Ale jeśli spróbujesz drugiego zapytania:
PLAN ZAPYTANIA
Widzimy, że postgres buduje tabelę tymczasową i łączy się z nią
źródło
Nie ma ograniczeń co do liczby elementów, które przekazujesz do klauzuli IN. Jeśli będzie więcej elementów, uzna je za tablicę, a następnie przy każdym skanowaniu w bazie danych sprawdzi, czy znajduje się w tablicy, czy nie. To podejście nie jest tak skalowalne. Zamiast używać klauzuli IN spróbuj użyć INNER JOIN z tabelą tymczasową. Więcej informacji można znaleźć pod adresem http://www.xaprb.com/blog/2006/06/28/why-large-in-clauses-are-problematic/ . Używając skal INNER JOIN, a także optymalizatora zapytań, można wykorzystać łączenie hash i inną optymalizację. Podczas gdy w przypadku klauzuli IN optymalizator nie ma możliwości optymalizacji zapytania. Zauważyłem przyspieszenie co najmniej 2x przy tej zmianie.
źródło
OR
iIN
klauzulami ze względu na duży narzut związany z analizowaniem i planowaniem takich zapytań, nie mogłem potwierdzić problemu z Postgres 9.5, zobacz tę odpowiedź .Jako osoba bardziej doświadczona w Oracle DB, byłem również zaniepokojony tym limitem. Przeprowadziłem test wydajności dla zapytania z ~ 10
IN
000 parametrami na liście -list, pobierając liczby pierwsze do 100 000 z tabeli zawierającej pierwsze 100 000 liczb całkowitych , wymieniając wszystkie liczby pierwsze jako parametry zapytania .Moje wyniki wskazują, że nie musisz się martwić o przeciążenie optymalizatora planu zapytań lub uzyskanie planów bez użycia indeksu , ponieważ przekształci to zapytanie w miejsce, w
= ANY({...}::integer[])
którym może wykorzystać indeksy zgodnie z oczekiwaniami:Jednak ten (dość stary) wątek na liście mailingowej pgsql-hackers wskazuje, że planowanie takich zapytań nadal wiąże się z niemałymi kosztami, więc wierz mi na słowo z przymrużeniem oka.
źródło
Jeśli masz zapytanie takie jak:
możesz zwiększyć wydajność, jeśli przepiszesz zapytanie na przykład:
źródło
EXPLAIN
mówi, że wewnętrznie przepisuje mójIN (...)
asANY ('{...}'::integer[])
.Po prostu spróbowałem. odpowiedź brzmi -> liczba całkowita spoza zakresu jako wartość 2-bajtowa: 32768
źródło
Możesz rozważyć refaktoryzację tego zapytania zamiast dodawać dowolnie długą listę identyfikatorów ... Możesz użyć zakresu, jeśli identyfikatory rzeczywiście są zgodne ze wzorcem z Twojego przykładu:
Inną opcją jest dodanie wewnętrznego wyboru:
źródło