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

Apakah indeks JSON postgres cukup efisien dibandingkan dengan tabel klasik yang dinormalisasi?

Saya akan memerlukan beberapa pertanyaan dalam bentuk "daftar semua objek di mana salah satu altnames adalah 'foobar'." Ukuran tabel yang diharapkan berada di urutan beberapa juta catatan. Kueri JSON Postgres dapat digunakan untuk itu, dan itu juga dapat diindeks (Indeks Untuk Menemukan Elemen dalam array JSON, misalnya). Namun, HARUSkah itu dilakukan dengan cara itu atau apakah ini solusi yang salah yang tidak disarankan?

Itu bisa dilakukan seperti itu tetapi itu tidak berarti bahwa Anda harus melakukannya. Dalam beberapa hal, praktik terbaik sudah didokumentasikan dengan baik (lihat misalnya menggunakan hstore vs menggunakan XML vs menggunakan EAV vs menggunakan tabel terpisah) dengan tipe data baru yang, untuk semua maksud dan tujuan praktis (selain validasi dan sintaks), tidak berbeda dari opsi tidak terstruktur atau semi-terstruktur sebelumnya.

Dengan kata lain, itu babi tua yang sama dengan riasan baru.

JSON menawarkan kemampuan untuk menggunakan indeks pohon pencarian terbalik , dengan cara yang sama seperti hstore, tipe array dan tsvectors lakukan. Mereka bekerja dengan baik, tetapi perlu diingat bahwa mereka terutama dirancang untuk mengekstraksi titik di lingkungan (pikirkan jenis geometri) yang diurutkan berdasarkan jarak, daripada untuk mengekstraksi daftar nilai dalam urutan leksikografis.

Sebagai ilustrasi, ambil dua rencana yang diuraikan jawaban Roman:

  • Yang melakukan pemindaian indeks membajak halaman disk secara langsung, mengambil baris dalam urutan yang ditunjukkan oleh indeks.
  • Yang melakukan pemindaian indeks bitmap dimulai dengan mengidentifikasi setiap halaman disk yang mungkin berisi baris, dan membacanya saat muncul di disk, seolah-olah (dan sebenarnya, persis seperti) melakukan pemindaian urutan yang melewati area yang tidak berguna.

Kembali ke pertanyaan Anda:indeks pohon terbalik yang berantakan dan terlalu besar memang akan meningkatkan kinerja aplikasi Anda jika Anda menggunakan tabel Postgres sebagai toko JSON raksasa. Tapi mereka juga bukan peluru perak, dan mereka tidak akan membawa Anda sejauh desain relasional yang tepat ketika berhadapan dengan kemacetan.

Intinya, pada akhirnya, tidak ada bedanya dengan apa yang Anda dapatkan saat memutuskan untuk menggunakan hstore atau EAV:

  1. Jika memerlukan indeks (yaitu sering muncul di klausa where atau, yang lebih penting, dalam klausa gabungan), Anda mungkin menginginkan data di bidang terpisah.
  2. Jika utamanya kosmetik, JSON/hstore/EAV/XML/whatever-makes-you-sleep-at-night berfungsi dengan baik.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pencocokan algoritma dalam SQL

  2. Nilai kunci duplikat IntegrityError melanggar batasan unik - Django/postgres

  3. Tidak ada hasil yang dikembalikan oleh kesalahan Kueri di PostgreSQL

  4. Cara Mengubah Pengguna menjadi Pengguna Super di PostgreSQL

  5. Bagaimana cara mengatur ulang urutan kunci utama postgres ketika tidak sinkron?