@Tregoreg ตั้งคำถามในความคิดเห็นเพื่อรับรางวัลของเขา:
ฉันไม่พบคำตอบปัจจุบันที่ใช้งานได้ การใช้ดัชนี GIN ในคอลัมน์ที่พิมพ์อาร์เรย์จะไม่เพิ่มประสิทธิภาพของตัวดำเนินการใด ๆ () ไม่มีวิธีแก้ปัญหาจริงเหรอ?
คำตอบที่ยอมรับของ @ Frankบอกให้คุณใช้โอเปอเรเตอร์อาเรย์ซึ่งยังคงถูกต้องสำหรับ Postgres 11 คู่มือ:
... การกระจายมาตรฐานของ PostgreSQL รวมคลาส GIN โอเปอเรเตอร์สำหรับอาร์เรย์ซึ่งรองรับเคียวรีที่จัดทำดัชนีโดยใช้โอเปอเรเตอร์เหล่านี้:
<@
@>
=
&&
รายการที่สมบูรณ์ของคลาสตัวดำเนินการในตัวสำหรับดัชนี GIN ในการแจกแจงมาตรฐานอยู่ที่นี่
ในดัชนี Postgres ถูกผูกไว้กับโอเปอเรเตอร์ (ซึ่งนำไปใช้กับบางประเภท) ไม่ใช่ชนิดข้อมูลเพียงอย่างเดียวหรือฟังก์ชันหรืออย่างอื่น นั่นเป็นมรดกจากการออกแบบของ Berkeley ดั้งเดิมของ Postgresและยากมากที่จะเปลี่ยนแปลงในขณะนี้ และโดยทั่วไปก็ใช้งานได้ดี นี่คือกระทู้ใน pgsql-bug ที่ Tom Lane แสดงความคิดเห็นในเรื่องนี้
ฟังก์ชั่น PostGis บางอย่าง(เหมือนST_DWithin()
) ดูเหมือนจะละเมิดหลักการนี้ แต่ก็ไม่เป็นเช่นนั้น ฟังก์ชั่นเหล่านั้นจะถูกเขียนใหม่ภายในเพื่อใช้ตัวดำเนินการที่เกี่ยวข้อง
นิพจน์ที่จัดทำดัชนีจะต้องอยู่ทางด้านซ้ายของตัวดำเนินการ สำหรับตัวดำเนินการส่วนใหญ่ ( รวมถึงทั้งหมดข้างต้น ) ตัววางแผนคิวรีสามารถทำได้โดยพลิกตัวถูกดำเนินการถ้าคุณวางนิพจน์ที่จัดทำดัชนีไว้ทางด้านขวา - เนื่องจากCOMMUTATOR
มีการกำหนด ANY
สร้างสามารถนำมาใช้ในการทำงานร่วมกับผู้ประกอบการต่าง ๆ และไม่ได้เป็นผู้ประกอบการเอง เมื่อใช้เป็นconstant = ANY (array_expression)
ดัชนีเฉพาะการสนับสนุน=
ผู้ประกอบการในองค์ประกอบมากมาย= ANY()
จะมีคุณสมบัติและเราจะต้องสับเปลี่ยนหา ดัชนี GIN หมดแล้ว
ปัจจุบัน Postgres ไม่ฉลาดพอที่จะรับนิพจน์ที่สามารถจัดทำดัชนี GIN ได้ สำหรับการเริ่มconstant = ANY (array_expression)
เป็นไม่สมบูรณ์เทียบเท่าarray_expression @> ARRAY[constant]
การ ตัวดำเนินการ Array ส่งคืนข้อผิดพลาดหากองค์ประกอบ NULL ใด ๆที่เกี่ยวข้องในขณะที่การANY
สร้างสามารถจัดการกับ NULL ทั้งสองด้าน และมีผลลัพธ์ที่แตกต่างกันสำหรับชนิดข้อมูลไม่ตรงกัน
คำตอบที่เกี่ยวข้อง:
มานี
ในขณะที่ทำงานกับinteger
อาร์เรย์ ( int4
ไม่ใช่int2
หรือint8
) โดยไม่มีNULL
ค่า (เช่นตัวอย่างของคุณบอกเป็นนัย) ให้พิจารณาโมดูลเพิ่มเติมintarray
ซึ่งให้บริการตัวดำเนินการพิเศษและการสนับสนุนดัชนีที่เร็วขึ้น ดู:
สำหรับUNIQUE
ข้อ จำกัด ในคำถามของคุณที่ยังไม่ได้รับคำตอบ: นั่นนำมาใช้กับดัชนี btree ในค่าอาร์เรย์ทั้งหมด (เช่นคุณสงสัย) และไม่ช่วยในการค้นหาองค์ประกอบเลย รายละเอียด:
jsonb
และใช้ดัชนี? postgresql.org/docs/9.5/static/functions-json.htmlและpostgresql.org/docs/9.5/static/datatype-json.html#JSON-INDEXING