Katakanlah saya punya tabel dengan bidang A
dan B
. Saya membuat kueri reguler pada A
+ B
, jadi saya membuat indeks gabungan pada (A,B)
. Apakah kueri hanya A
juga akan sepenuhnya dioptimalkan oleh indeks komposit?
Selain itu, saya membuat indeks aktif A
, tetapi Postgres masih menggunakan indeks komposit hanya untuk permintaan A
. Jika jawaban sebelumnya positif, saya kira itu tidak terlalu penting, tetapi mengapa ia memilih indeks komposit secara default, jika A
indeks tunggal tersedia?
explain analyze
dan teks kueri?Jawaban:
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, periksapg_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 atauUNIQUE
kendala. Sejak Postgres 11 Anda mungkin lolos hanya dengan menambahkanb
definisi kendala denganINCLUDE
klausa sebagai gantinya. Detail dalam manual.Atau buat indeks baru pada
(b,a)
sebagai gantinya untuk menutupi permintaan hanyab
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:
Lebih lanjut tentang pembaruan HOT:
Cara mengukur ukuran objek:
sumber
Menurut pertanyaan Anda, Anda memiliki tabel dengan bidang A dan B. Jika Anda kueri Anda adalah:
Pengoptimal akan memilih indeks Komposit untuk menghindari Ekstrak akses acak!
sumber
Ini ada dalam kasus jika Anda hanya menggunakan pertama dalam predikat.
Ini akan melakukan pemindaian jika Anda menggunakan kolom pertama dari kunci komposit dan kolom non-kunci dari kunci komposit.
Untuk mengelabui Anda, Anda bisa saja membuat dummy predikat seperti ini dan kemudian kolom non-kunci:
[A, B] adalah indeks Anda, [C] - kolom lain
Untuk menggunakan indeks Anda menulis sebagai:
Ini akan menggunakan indeks hanya dalam kasus jika ada satu atau dua predikat [A] Atau [A], [B]. Itu tidak akan menggunakannya dalam urutan [B], [A] atau [A], [C]. Untuk dapat menggunakan indeks dengan kolom tambahan [C], Anda perlu menegakkan indeks dengan memesan predikat sebagai [A], [B] dan [C].
sumber
B=B
? Saya pikir Anda tidak mencapai apa-apa jadi saya memilih tidak ada bukti apa pun ini tidak hanya diabaikan oleh pengoptimalB=B
secara efektif sama denganB IS NOT NULL
, yang tampaknya tidak pantas. Tentunya tidak perlu menggunakan indeks pada(a,b)
.