PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Indeks PostgreSQL di JSON

Dua indeks Anda yang lain tidak akan berfungsi hanya karena ->> operator mengembalikan text , sementara Anda jelas memiliki jsonb kelas operator gin dalam pikiran. Perhatikan bahwa Anda hanya menyebutkan json , tetapi Anda sebenarnya membutuhkan jsonb untuk kemampuan pengindeksan tingkat lanjut.

Untuk menyusun strategi pengindeksan terbaik, Anda harus menentukan lebih dekat kueri mana yang akan dicakup. Apakah Anda hanya tertarik pada sapi? Atau semua hewan / semua tag? Operator mana yang memungkinkan? Apakah dokumen JSON Anda juga menyertakan kunci non-hewan? Apa yang harus dilakukan dengan itu? Apakah Anda ingin memasukkan baris dalam indeks di mana sapi (atau apa pun) tidak muncul di dokumen JSON sama sekali?

Dengan asumsi:

  • Kami hanya tertarik pada sapi di tingkat pertama bersarang.
  • Nilainya selalu berupa integer yang valid .
  • Kami tidak tertarik dengan barisan tanpa sapi.

Saya menyarankan indeks btree fungsional, seperti yang sudah Anda miliki, tetapi berikan nilainya ke integer . Saya rasa Anda tidak ingin perbandingan dievaluasi sebagai text (di mana '2' lebih besar dari '1111').

CREATE INDEX animal_index ON farm (((animal ->> 'cow')::int));  -- !

Kumpulan tanda kurung tambahan diperlukan untuk penulisan singkatan agar sintaks untuk ekspresi indeks tidak ambigu.

Gunakan ekspresi yang sama dalam kueri Anda untuk membuat Postgres menyadari bahwa indeks dapat diterapkan:

SELECT * FROM farm WHERE (animal ->> 'cow')::int > 3;

Jika Anda membutuhkan jsonb yang lebih umum indeks, pertimbangkan:

  • Apa indeks yang tepat untuk menanyakan struktur dalam array di Postgres jsonb?

Untuk dikenal, statis, sepele jumlah hewan (seperti yang Anda komentari), saya sarankan indeks parsial seperti:

CREATE INDEX animal_index ON farm (((animal ->> 'cow')::int))
WHERE (animal ->> 'cow') IS NOT NULL;

CREATE INDEX animal_index ON farm (((animal ->> 'chicken')::int))
WHERE (animal ->> 'chicken') IS NOT NULL;

dll.

Anda mungkin harus menambahkan kondisi indeks ke kueri:

SELECT * FROM farm
WHERE (animal ->> 'cow')::int > 3
AND   (animal ->> 'cow') IS NOT NULL; 

Mungkin tampak berlebihan, tetapi mungkin perlu. Uji dengan ANALYZE !




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mengapa PostgreSQL menggabungkan pengguna dan grup menjadi peran?

  2. Kiat untuk Mengelola PostgreSQL dari Jarak Jauh

  3. Nama Proses PostgreSQL di Solaris

  4. Bagaimana cara saya memasukkan beberapa baris dengan benar ke PG dengan node-postgres?

  5. Urutan PostgreSQL berdasarkan kolom lain