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

PostgreSQL tidak menggunakan indeks parsial

Indeks parsial adalah ide yang bagus untuk mengecualikan setengah baris tabel yang jelas tidak Anda butuhkan. Lebih sederhana:

CREATE INDEX name_idx ON table (text_col)
WHERE text_col IS NOT NULL;

Pastikan untuk menjalankan ANALYZE table setelah membuat index. (Autovacuum melakukannya secara otomatis setelah beberapa waktu jika Anda tidak melakukannya secara manual, tetapi jika Anda menguji segera setelah pembuatan, pengujian Anda akan gagal.)

Kemudian, untuk meyakinkan perencana kueri bahwa indeks parsial tertentu dapat digunakan, ulangi WHERE kondisi dalam kueri - meskipun tampaknya sangat berlebihan:

SELECT col1,col2, .. colN
FROM   table 
WHERE  text_col = 'my_value'
AND   text_col IS NOT NULL;  -- repeat condition

Voila.

Per dokumentasi:

Namun, perlu diingat bahwa predikat harus cocok dengan kondisi yang digunakan dalam kueri yang seharusnya mendapat manfaat dari indeks. Tepatnya, indeks parsial dapat digunakan dalam kueri hanya jika sistem dapat mengenali bahwa WHERE kondisi query secara matematis menyiratkan predikat indeks. PostgreSQL tidak memiliki pembuktian teorema canggih yang dapat mengenali ekspresi ekuivalen secara matematis yang ditulis dalam bentuk yang berbeda. (Tidak hanya pembuktian teorema umum seperti itu yang sangat sulit untuk dibuat, mungkin akan terlalu lambat untuk digunakan secara nyata.) Sistem dapat mengenali implikasi pertidaksamaan sederhana, misalnya "x <1" menyiratkan "x <2"; jika tidak, predikat kondisi harus sama persis dengan bagian dari WHEREque kueri kondisi atau indeks tidak akan dikenali sebagai dapat digunakan. Pencocokan terjadi pada waktu perencanaan kueri, bukan pada waktu berjalan. Akibatnya, klausa kueri berparameter tidak berfungsi dengan indeks parsial.

Untuk kueri berparameter:sekali lagi, tambahkan predikat (berlebihan) dari indeks parsial sebagai tambahan, WHERE kondisi, dan berfungsi dengan baik.

Pembaruan penting di Postgres 9.6 sangat meningkatkan peluang untuk pemindaian hanya indeks (yang dapat membuat kueri lebih murah dan perencana kueri akan lebih mudah memilih paket kueri tersebut). Terkait:

  • PostgreSQL tidak menggunakan indeks selama hitungan(*)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mencegah entri yang berdekatan/tumpang tindih dengan EXCLUDE di PostgreSQL

  2. Fungsi lead/lag bersyarat PostgreSQL?

  3. Perbedaan antara indeks GiST dan GIN

  4. Penerapan &Konfigurasi PostgreSQL dengan Wayang

  5. Mengumumkan Barman 1.0, Manajer Pencadangan dan Pemulihan untuk PostgreSQL