Tentu saja. Kami membahasnya dengan sangat terperinci di bawah pertanyaan terkait ini:
Space dialokasikan dalam kelipatan MAXALIGN, yang biasanya 8 byte pada OS 64-bit atau (jauh lebih umum) 4 byte pada OS 32-bit. Jika Anda tidak yakin, periksa pg_controldata. Itu juga tergantung pada tipe data kolom yang diindeks (beberapa memerlukan pelurusan pelurusan) dan konten aktual.
Indeks pada, katakanlah, dua integerkolom (masing-masing 4 byte) biasanya berakhir persis sama dengan indeks hanya pada satu, di mana 4 byte lainnya hilang untuk bantalan pelurusan.
Dalam kasus seperti itu benar-benar tidak ada kerugian bagi perencana kueri untuk menggunakan indeks aktif (a,b)- dibandingkan dengan indeks hanya (a). Dan umumnya lebih disukai beberapa kueri untuk menggunakan indeks yang sama. Peluangnya (atau bagiannya) untuk berada dalam cache (cepat) tumbuh ketika dibagikan.
Jika Anda sudah mempertahankan indeks (a,b), maka tidak masuk akal untuk membuat indeks lain hanya (a)- kecuali secara substansial lebih kecil. Hal yang sama tidak berlaku untuk (b,a)vs (a). Ikuti tautan di baris pertama untuk informasi lebih lanjut.
Datang dari arah yang berlawanan, ketika Anda membutuhkan indeks tambahan seperti itu (a,b), maka pertimbangkan untuk menjatuhkan indeks yang ada hanya (a)- jika mungkin. Seringkali tidak mungkin karena itulah indeks PK atau UNIQUEkendala. Sejak Postgres 11 Anda mungkin lolos hanya dengan menambahkan bdefinisi kendala dengan INCLUDEklausa sebagai gantinya. Detail dalam manual.
Atau buat indeks baru pada (b,a)sebagai gantinya untuk menutupi permintaan hanya btambahan. Untuk kondisi kesetaraan saja urutan ekspresi indeks dalam indeks btree tidak masalah. Meskipun demikian, hal itu melibatkan kondisi jangkauan. Lihat:
Ada potensi kerugian untuk menyertakan kolom tambahan dalam indeks, bahkan jika itu hanya menggunakan ruang yang dinyatakan hilang untuk pelurusan pelurus:
- Setiap kali kolom tambahan diperbarui, indeks sekarang juga membutuhkan pembaruan, yang mungkin menambah biaya untuk menulis operasi dan membuat lebih banyak indeks mengasapi.
- Pembaruan HOT (Heap Only Tuple) di atas meja tidak dimungkinkan saat kolom indeks apa pun terlibat.
Lebih lanjut tentang pembaruan HOT:
Cara mengukur ukuran objek: