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 integer
kolom (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 UNIQUE
kendala. Sejak Postgres 11 Anda mungkin lolos hanya dengan menambahkan b
definisi kendala dengan INCLUDE
klausa sebagai gantinya. Detail dalam manual.
Atau buat indeks baru pada (b,a)
sebagai gantinya untuk menutupi permintaan hanya b
tambahan. 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: