Apakah ada batasan panjang maksimum untuk kueri postgres?

33

Aplikasi yang kami bangun mungkin menjalankan kueri insert yang cukup besar. Apakah ada batasan bahwa permintaan postgres saya hanya dapat memiliki sejumlah karakter?

Kannan Ramamoorthy
sumber
2
Saya hanya akan mengatakan bahwa jika Anda bahkan mendekati segala jenis batas dari sifat itu, Anda perlu mempertimbangkan kembali desain Anda. Saya telah menemukan bahwa, biasanya, setiap pertanyaan yang mendekati biasanya dihasilkan oleh semacam kerangka kerja (yang melibatkan rangkaian string ekstrim) dan mereka cenderung kehilangan kontak dengan kenyataan.
Vérace

Jawaban:

43

Untuk versi PostgreSQL saat ini (hingga 9,5), kueri diterima oleh backend dalam Stringinfobuffer, yang terbatas pada MaxAllocSize, didefinisikan sebagai:

#define MaxAllocSize   ((Size) 0x3fffffff) /* 1 gigabyte - 1 */

(lihat http://doxygen.postgresql.org/memutils_8h.html )

Jadi kueri terbatas pada ukuran 1 gigabyte (2 ^ 30), minus 1 byte untuk terminasi null byte.

Jika klien mencoba mengirim permintaan yang lebih besar, kesalahan yang tampak seperti ini akan muncul kembali:

GALAT: kehabisan memori.
RINCIAN: Tidak dapat memperbesar buffer string yang berisi 0 byte demi N lebih banyak byte.

di mana Nukuran kueri.

Perlu diketahui bahwa permintaan tepat di bawah ini 1GBmungkin membutuhkan memori dalam jumlah besar untuk diuraikan, direncanakan atau dieksekusi, di samping 1GBbuffer itu.

Jika Anda perlu mendorong serangkaian literal besar ke dalam kueri, pertimbangkan alternatif membuat tabel sementara, COPYbaris ke dalamnya dan minta kueri utama merujuk ke tabel sementara itu.

Daniel Vérité
sumber