@Tregoreg , sunduğu ödülün yorumunda bir soru sordu :
Mevcut cevapları işe yaramadı. Dizi tipi sütunda GIN dizini kullanmak, ANY () operatörünün performansını artırmaz. Gerçekten bir çözüm yok mu?
@ Frank'in kabul ettiği cevap , Postgres 11 için hala doğru olan dizi operatörlerini kullanmanızı söyler . Kılavuz:
... PostgreSQL'in standart dağıtımı, diziler için şu işleçleri kullanarak dizinlenmiş sorguları destekleyen bir GIN işleç sınıfı içerir:
<@
@>
=
&&
Standart dağıtımdaki GIN dizinleri için yerleşik operatör sınıflarının tam listesi burada.
Postgres'de dizinler , yalnızca veri türlerine veya işlevlere veya başka bir şeye değil, operatörlere (belirli türler için uygulanır) bağlıdır. Bu Postgres'in orijinal Berkeley tasarımından bir miras ve şimdi değiştirmek çok zor. Ve genellikle iyi çalışıyor. İşte Tom Lane bu konuda yorum yapan pgsql-bugs hakkında bir konu.
Bazı PostGis işlevleri (gibi ST_DWithin()
) bu prensibi ihlal ediyor gibi görünüyor, ama öyle değil. Bu işlevler, ilgili işleçleri kullanmak için dahili olarak yeniden yazılır .
Dizine alınan ifade , operatörün solunda olmalıdır . Çoğu işleç için ( yukarıdakilerin tümü dahil ) sorgu planlayıcısı, dizinli ifadeyi sağa yerleştirirseniz işlenenleri çevirerek bunu başarabilir - a'nın COMMUTATOR
tanımlandığı göz önüne alınırsa . ANY
Yapı çeşitli operatörler ile kombinasyon halinde kullanılan bir operatör kendisi değil edilebilir. Dizi öğelerindeconstant = ANY (array_expression)
yalnızca =
operatörü destekleyen dizinler kullanıldığında hak kazanırız ve bunun için bir komütatöre ihtiyacımız olur . GIN dizinleri çıktı.= ANY()
Postgres şu anda ondan bir GIN ile endekslenebilir ifade türetecek kadar akıllı değildir. Yeni başlayanlar için, constant = ANY (array_expression)
olduğu tamamen eşdeğer değildir için array_expression @> ARRAY[constant]
. Dizi işleçleri herhangi bir NULL öğesi varsa hata döndürür ; ANY
yapı ise her iki tarafta da NULL ile başa çıkabilir. Ve veri türü uyuşmazlıkları için farklı sonuçlar vardır.
İlgili cevaplar:
asides
Değerleri olmayan integer
dizilerle (( ya da int4
değil ) dizilerle çalışırken ( örneğinizin ima ettiği gibi) özel, daha hızlı işleçler ve dizin desteği sağlayan ek modülü göz önünde bulundurun . Görmek:int2
int8
NULL
intarray
UNIQUE
Sorunuzda yanıtsız bırakılan kısıtlamaya gelince : Bu, tüm dizi değeri (şüphelendiğiniz gibi) üzerinde bir btree dizini ile uygulanır ve hiç öğe aramasına yardımcı olmaz . Detaylar:
jsonb
kullanmak ve indeksleri kullanmak mümkün müdür ? postgresql.org/docs/9.5/static/functions-json.html ve postgresql.org/docs/9.5/static/datatype-json.html#JSON-INDEXING