Saya memiliki tabel dengan indeks multikolom, dan saya ragu tentang penyortiran indeks yang tepat untuk mendapatkan kinerja maksimum pada kueri.
Skenario:
PostgreSQL 8.4, tabel dengan sekitar satu juta baris
Nilai dalam kolom c1 dapat memiliki sekitar 100 nilai yang berbeda . Kita dapat mengasumsikan nilainya terdistribusi secara merata, jadi kami memiliki sekitar 10.000 baris untuk setiap nilai yang mungkin.
Kolom c2 dapat memiliki 1000 nilai yang berbeda . Kami memiliki 1000 baris untuk setiap nilai yang memungkinkan.
Saat mencari data, kondisi selalu menyertakan nilai untuk dua kolom ini, sehingga tabel memiliki indeks multikolom yang menggabungkan c1 dan c2. Saya telah membaca tentang pentingnya memesan kolom dengan benar dalam indeks multikolom jika Anda memiliki pertanyaan menggunakan hanya satu kolom untuk memfilter. Ini tidak terjadi dalam skenario kami.
Pertanyaan saya adalah yang ini:
Mengingat fakta bahwa salah satu filter memilih set data yang jauh lebih kecil, dapatkah saya meningkatkan kinerja jika indeks pertama adalah yang paling selektif (yang memungkinkan set lebih kecil)? Saya tidak pernah mempertimbangkan pertanyaan ini sampai saya melihat gambar dari artikel yang direferensikan:
Gambar diambil dari artikel yang direferensikan tentang indeks multikolom .
Kueri menggunakan nilai dari dua kolom untuk memfilter. Saya tidak memiliki pertanyaan menggunakan hanya satu kolom untuk memfilter. Semua dari mereka adalah: WHERE c1=@ParameterA AND c2=@ParameterB
. Ada juga kondisi seperti ini:WHERE c1 = "abc" AND c2 LIKE "ab%"
sumber
Jika, seperti yang Anda katakan, kueri yang melibatkan 2 kolom ini, semuanya adalah pemeriksaan kesetaraan dari kedua kolom, misalnya:
jangan repot-repot dengan ini. Saya ragu akan ada perbedaan dan jika ada, itu akan diabaikan. Tentu saja Anda selalu dapat menguji, dengan data dan pengaturan server Anda. Versi DBMS yang berbeda dapat berperilaku sedikit berbeda mengenai pengoptimalan.
Urutan di dalam indeks akan berpengaruh pada jenis kueri lain, memiliki pemeriksaan satu kolom saja, atau kondisi ketidaksetaraan, atau kondisi di satu kolom dan pengelompokan di kolom lain, dll.
Jika saya memilih salah satu dari dua pesanan, saya akan memilih untuk menempatkan kolom yang kurang selektif terlebih dahulu. Pertimbangkan tabel dengan kolom
year
danmonth
. Itu lebih mungkin bahwa Anda memerlukan suatuWHERE year = 2000
kondisi atau aWHERE year BETWEEN 2000 AND 2013
atau aWHERE (year, month) BETWEEN (1999, 6) AND (2000, 5)
.Permintaan jenis ini
WHERE month = 7 GROUP BY year
mungkin diinginkan (Cari orang yang lahir pada bulan Juli), tetapi akan lebih jarang. Itu tentu saja tergantung pada data aktual yang disimpan di tabel Anda. Pilih satu pesanan untuk saat ini, ucapkan(c1, c2)
dan Anda selalu dapat menambahkan indeks lain di lain waktu(c2, c1)
.Perbarui, setelah komentar OP:
Jenis kueri ini jika tepatnya rentang kondisi pada
c2
kolom dan akan membutuhkan(c1, c2)
indeks. Jika Anda juga memiliki pertanyaan dengan tipe terbalik:maka akan lebih baik jika Anda memiliki
(c2, c1)
indeks juga.sumber