@Tregoreg mengajukan pertanyaan dalam komentar untuk hadiah yang ditawarkannya:
Saya tidak menemukan jawaban saat ini berfungsi. Menggunakan indeks GIN pada kolom array-typed tidak meningkatkan kinerja operator ANY (). Benarkah tidak ada solusi?
@ Jawaban diterima Frank memberitahu Anda untuk menggunakan operator array , yang masih benar untuk Postgres 11. Manual:
... distribusi standar PostgreSQL mencakup kelas operator GIN untuk array, yang mendukung kueri yang diindeks menggunakan operator ini:
<@
@>
=
&&
Daftar lengkap kelas operator bawaan untuk indeks GIN dalam distribusi standar ada di sini.
Dalam indeks Postgres terikat ke operator (yang diterapkan untuk jenis tertentu), bukan tipe data saja atau fungsi atau apa pun. Itu adalah warisan dari desain Berkeley asli Postgres dan sangat sulit untuk diubah sekarang. Dan itu umumnya bekerja dengan baik. Berikut adalah utas tentang pgsql-bug dengan Tom Lane mengomentari ini.
Beberapa fungsi PostGis (seperti ST_DWithin()
) tampaknya melanggar prinsip ini, tetapi tidak demikian. Fungsi-fungsi tersebut ditulis ulang secara internal untuk menggunakan masing-masing operator .
Ekspresi yang diindeks harus di sebelah kiri operator. Untuk sebagian besar operator ( termasuk semua yang di atas ) perencana kueri dapat mencapai ini dengan membalik operan jika Anda menempatkan ekspresi yang diindeks ke kanan - mengingat bahwa COMMUTATOR
telah ditentukan. The ANY
membangun dapat digunakan dalam kombinasi dengan berbagai operator dan tidak operator itu sendiri. Ketika digunakan sebagai constant = ANY (array_expression)
indeks saja yang mendukung =
operator pada elemen array akan memenuhi syarat dan kami akan membutuhkan komutator untuk = ANY()
. Indeks GIN keluar.
Postgres saat ini tidak cukup pintar untuk mendapatkan ekspresi yang bisa diindeks GIN darinya. Sebagai permulaan, constant = ANY (array_expression)
adalah tidak benar-benar setara dengan array_expression @> ARRAY[constant]
. Operator array mengembalikan kesalahan jika ada elemen NULL yang terlibat, sementara ANY
konstruk dapat menangani NULL di kedua sisi. Dan ada hasil yang berbeda untuk ketidakcocokan tipe data.
Jawaban terkait:
Selain itu
Saat bekerja dengan integer
array ( int4
, bukan int2
atau int8
) tanpa NULL
nilai (seperti contoh Anda menyiratkan) pertimbangkan modul tambahan intarray
, yang menyediakan operator khusus, lebih cepat dan dukungan indeks. Lihat:
Adapun UNIQUE
kendala dalam pertanyaan Anda yang tidak dijawab: Itu diterapkan dengan indeks btree pada seluruh nilai array (seperti yang Anda duga) dan tidak membantu dengan pencarian elemen sama sekali. Detail:
jsonb
dan menggunakan indeks? postgresql.org/docs/9.5/static/functions-json.html dan postgresql.org/docs/9.5/static/datatype-json.html#JSON-INDEXING