Tworzona przez nas aplikacja może wykonywać dość duże zapytania dotyczące wstawiania. Czy istnieje ograniczenie, że moje zapytanie postgres może mieć tylko określoną liczbę znaków?
Tworzona przez nas aplikacja może wykonywać dość duże zapytania dotyczące wstawiania. Czy istnieje ograniczenie, że moje zapytanie postgres może mieć tylko określoną liczbę znaków?
Odpowiedzi:
Dla aktualnej wersji PostgreSQL (do 9.5) zapytania są odbierane przez backend w Stringinfo
buforze, który jest ograniczony do MaxAllocSize
, zdefiniowany jako:
#define MaxAllocSize ((Size) 0x3fffffff) /* 1 gigabyte - 1 */
(patrz http://doxygen.postgresql.org/memutils_8h.html )
Zatem zapytanie jest ograniczone do 1 gigabajta (2 ^ 30), minus 1 bajt dla kończącego bajtu zerowego.
Jeśli klient spróbuje wysłać większe zapytanie, wróci taki błąd:
BŁĄD: brak pamięci
SZCZEGÓŁY: Nie można powiększyć buforu ciągów zawierającego 0 bajtów o N więcej bajtów.
gdzie N
jest rozmiar zapytania.
Należy pamiętać, że zapytanie znajdujące się poniżej 1GB
może wymagać przeanalizowania, zaplanowania lub wykonania dużej ilości pamięci oprócz tego 1GB
bufora.
Jeśli chcesz wepchnąć dużą liczbę literałów do zapytania, zastanów się nad alternatywą tworzenia tabeli tymczasowej, COPY
wierszy do niej i poproś, aby zapytanie główne odnosiło się do tej tabeli tymczasowej.