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

Mencari di indeks ekspresi

Sama seperti Anda membaca dari jjanes di tempat lain:indeks ekspresi hanya dipertimbangkan jika ekspresi cocok dengan predikat kueri secara tepat. Perencana kueri Postgres bukanlah AI. Ini akan dengan cepat mengalahkan tujuan membuat kueri dengan cepat jika perencanaannya memakan waktu terlalu lama.

Anda dapat mengoptimalkan indeks Anda sedikit, jika itu penghiburan. left() lebih sederhana dan lebih cepat daripada substring() :

CREATE INDEX record_changes_log_detail_old_value_ix_btree
ON record_changes_log_detail (left(old_value,1024) text_pattern_ops);

Juga, ada ukuran baris maksimum 2704 byte untuk indeks btree, bukan "batas karakter 2172 pada B-tree" .

Yang paling penting, hanya untuk pemeriksaan kesetaraan, seperti yang disarankan pertanyaan Anda, indeks btree pada nilai hash menggunakan md5(old_value) atau hashtext(old_value) akan menjadi banyak lebih efisien. Jika ya, ingatlah untuk bertahan melawan tabrakan hash seperti ini:

SELECT *
FROM   record_changes_log_detail 
WHERE  hashtext(old_value) = hashtext('Gold Kerrison Neuro')
AND    old_value = 'Gold Kerrison Neuro';

Predikat pertama memberi Anda akses indeks cepat. Yang kedua mengecualikan positif palsu. Tabrakan seharusnya sangat jarang. Tapi mungkin. Dan kemungkinan itu tumbuh seiring dengan ukuran tabel.

Terkait:

  • Kueri PILIH dengan DISTINCT pada struktur tabel untuk grafik sangat lambat
  • Apa tipe data optimal untuk bidang MD5?
  • Penelusuran teks lengkap di CouchDB

Atau indeks hash seperti yang telah Anda pertimbangkan sendiri:

  • Mengapa indeks hash Postgres 11 begitu besar?

(Di sini Anda tidak perlu khawatir tentang tabrakan hash; ditangani secara internal.)




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pembandingan Postgres-XL

  2. Mengambil semua hak objek untuk peran tertentu

  3. Perlengkapan Django gagal, menyatakan DatabaseError:nilai terlalu panjang untuk variasi karakter tipe (50)

  4. DATEADD setara di PostgreSQL

  5. Mengelola Commitfest PostgreSQL