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

Indeks PostgreSQL tidak digunakan untuk kueri pada rentang IP

Coba indeks multikolom, tetapi dengan urutan terbalik pada kolom kedua:

CREATE INDEX index_ips_begin_end_ip_num ON ips (begin_ip_num, end_ip_num DESC);

Pengurutan sebagian besar tidak relevan untuk indeks satu kolom, karena dapat dipindai mundur hampir sama cepatnya. Tapi ini penting untuk indeks multikolom.

Dengan indeks yang saya usulkan, Postgres dapat memindai kolom pertama dan menemukan alamat, di mana sisa indeks memenuhi kondisi pertama. Kemudian dapat, untuk setiap nilai kolom pertama, mengembalikan semua baris yang memenuhi kondisi kedua, hingga yang pertama gagal. Kemudian lompat ke nilai berikutnya dari kolom pertama, dst.
Ini masih kurang efisien dan Postgres mungkin lebih cepat hanya memindai kolom indeks pertama dan memfilter yang kedua. Sangat tergantung pada distribusi data Anda.

Apa pun itu, CLUSTER menggunakan indeks multikolom dari atas bisa membantu kinerja:

CLUSTER ips USING index_ips_begin_end_ip_num

Dengan cara ini, kandidat yang memenuhi persyaratan pertama Anda dikemas ke halaman data yang sama atau berdekatan. Dapat banyak membantu kinerja jika Anda memiliki banyak baris per nilai kolom pertama. Kalau tidak, itu hampir tidak efektif.
(Ada juga alat eksternal non-pemblokiran untuk tujuan ini:pg_repack atau pg_squeeze.)

Juga, apakah autovacuum berjalan dan dikonfigurasi dengan benar atau sudahkah Anda menjalankan ANALYZE di atas meja? Anda memerlukan statistik terkini untuk Postgres guna memilih paket kueri yang sesuai.

Apa yang akan sangat membantu di sini adalah indeks GiST untuk int8range kolom, tersedia sejak PostgreSQL 9.2.

Bacaan lebih lanjut:

  • Mengoptimalkan kueri pada rentang stempel waktu (dua kolom)

Jika rentang IP Anda dapat dicakup dengan salah satu jenis jaringan bawaan inet atau cidr , pertimbangkan untuk mengganti dua bigint your Anda kolom. Atau, lebih baik lagi, lihat modul tambahan ip4r oleh Andrew Gierth (tidak dalam distribusi standar. Strategi pengindeksan berubah sesuai dengan itu.

Kecuali itu, Anda dapat melihat jawaban terkait ini di dba.SE dengan menggunakan rezim canggih dengan indeks parsial. Hal-hal canggih, tetapi memberikan kinerja yang luar biasa:

  • Dapatkah indeks spasial membantu kueri "rentang - urutkan berdasarkan - batas"


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mengonversi kueri SELECT DISTINCT ON dari Postgresql ke MySQL

  2. Meneliti kelambatan PostGIS (edisi 2019)

  3. Instruksi ilegal:4 saat menjalankan Django

  4. tidak dapat membuat kunci utama peningkatan otomatis dengan flask-sqlalchemy

  5. Membuat Database PostgreSQL