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

Batasan praktis indeks ekspresi di PostgreSQL

Saya belum pernah bermain dengan hstore, tetapi saya melakukan hal serupa ketika saya membutuhkan kolom EAV, mis.:

create index on product_eav (eav_value) where (eav_type = 'int');

Batasan dalam melakukannya adalah Anda harus eksplisit dalam kueri Anda untuk menggunakannya, yaitu kueri ini tidak akan menggunakan indeks di atas:

select product_id
from product_eav
where eav_name = 'size'
and eav_value = :size;

Tapi yang ini akan:

select product_id
from product_eav
where eav_name = 'size'
and eav_value = :size
and type = 'int';

Dalam contoh Anda kemungkinan besar akan lebih seperti:

create index on product ((data->'size')::int) where (data->'size' is not null);

Ini harus menghindari penambahan referensi ke indeks ketika tidak ada entri ukuran. Bergantung pada versi PG yang Anda gunakan, kueri mungkin perlu dimodifikasi seperti ini:

select product_id
from products
where data->'size' is not null
and data->'size' = :size;

Perbedaan besar lainnya antara indeks reguler dan parsial adalah bahwa yang terakhir tidak dapat menerapkan batasan unik dalam definisi tabel. Ini akan berhasil:

create unique index foo_bar_key on foo (bar) where (cond);

Berikut ini tidak akan:

alter table foo add constraint foo_bar_key unique (bar) where (cond);

Tapi ini akan:

alter table foo add constraint foo_bar_excl exclude (bar with =) where (cond);



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara Mengonversi Kasus String di PostgreSQL

  2. Haruskah saya menyertakan SELECT dalam transaksi?

  3. Bagaimana tidak membangun ekstensi PostgreSQL 9.0 pada platform RPM

  4. Dua pertanyaan untuk memformat stempel waktu dan nomor menggunakan postgresql

  5. Konversi Akses ke PostgreSQL?