Apakah REINDEX diperlukan setelah CLUSTER?

12

Saya sedang mempertimbangkan menggunakan CLUSTER untuk menyusun ulang tabel dengan indeks. Saya mengerti bahwa rekreasi data tabel ini membuat semua indeks yang ada baik kembung atau tidak berguna. Saya telah melihat beberapa indikasi bahwa REINDEX diperlukan setelah CLUSTER. Saya telah menemukan referensi lain yang menunjukkan bahwa CLUSTER melakukan REINDEX. The Dokumentasi Resmi mengatakan apa-apa tentang Reindex menjadi bagian dari CLUSTER atau diperlukan (Meskipun itu menyarankan berjalan ANALISIS setelah KLASTER yang)

Adakah yang bisa secara definitif (yaitu dengan semacam referensi ke dokumen resmi) mengatakan apakah REINDEX diperlukan atau tidak setelah CLUSTER?

POHON
sumber
2
Saya pikir itu tidak perlu. clustermemindahkan baris, sehingga harus memperbarui informasi indeks.
a_horse_with_no_name
Ya, tetapi teori dalam setengah diskusi yang saya temukan adalah yang menyebabkan indeks kembung.
POHON

Jawaban:

12

Anda tidak perlu mengindeks ulang, karena CLUSTERsecara efektif melakukannya untuk Anda.

Lebih khusus lagi, CLUSTERkunci tabel sumber kemudian buat salinan baru yang dipesan sesuai dengan indeks target. Itu membuat indeks pada salinan baru kemudian menggantikan tabel lama dan indeks dengan yang baru.

Perhatikan bahwa ini juga berlaku VACUUM FULLdi 9.0+.

Jika Anda telah melihat diskusi yang menyarankan bahwa CLUSTERindeks bloats mungkin orang-orang yang menganggapnya CLUSTERberfungsi seperti pra-9.0 VACUUM FULL. Anda mungkin juga melihat dan salah membaca diskusi yang menyebutkan index bloat yang disebabkan oleh VACUUM FULLimplementasi lama dan menyarankan CLUSTERsebagai alternatif .

Ini tersirat dalam dokumentasi :

salinan sementara dari tabel dibuat yang berisi data tabel dalam urutan indeks. Salinan sementara setiap indeks di atas meja juga dibuat . Oleh karena itu, Anda memerlukan ruang kosong pada disk setidaknya sama dengan jumlah ukuran tabel dan ukuran indeks

Apa yang tidak dikatakan, tetapi harus, adalah bahwa salinan sementara itu kemudian mengganti tabel asli . (Tambang tebal).

Craig Ringer
sumber
1
Apakah Anda memiliki referensi bahwa CLUSTER menggantikan indeks?
POHON
1
@ TREE Ditambahkan. Dokumen tidak secara eksplisit memberi tahu Anda bahwa tabel sementara dan indeks kemudian mengganti yang asli, tetapi Anda akan melihat bahwa jika Anda benar-benar melihat direktori data sebelum / sesudah CLUSTER atau jika Anda memeriksa kode sumber.
Craig Ringer
Saya telah menguji ini, dan setidaknya dalam skenario pengujian saya, ukuran file indeks berkurang. Tapi ini hanya satu skenario, dan mungkin ada banyak variabel yang mempengaruhi perilaku (jumlah indeks, ukuran total pada disk, dll) jadi saya tidak bisa mempercayai tes sederhana.
POHON
1
@ TREE Untuk kepastian mutlak dalam memahami perilaku dalam semua keadaan yang memungkinkan, Anda harus membaca kode sumber. Semua saya dapat memberitahu Anda adalah bahwa saya tidak mengetahui adanya situasi di mana CLUSTERtidak tidak menulis ulang indeks, dan pemeriksaan file yang sebenarnya di base/jelas akan menunjukkan baru relfilenodes. Sepertinya Anda mengkhawatirkan masalah yang belum Anda miliki.
Craig Ringer
8

Saya dengan a_horse_with_no_name tentang ini: Anda tidak perlu membuat ulang indeks. Selain itu, CLUSTERdokumentasi tidak menyebutkannya, kami juga dapat berkonsultasi lebih lanjut dengan REINDEXhalaman ini:

Ada beberapa skenario untuk menggunakan REINDEX:

  • Indeks telah rusak, dan tidak lagi berisi data yang valid. Meskipun secara teori hal ini seharusnya tidak pernah terjadi, dalam praktiknya indeks dapat rusak karena bug perangkat lunak atau kegagalan perangkat keras. REINDEX menyediakan metode pemulihan.

  • Indeks telah menjadi "kembung", yang berisi banyak halaman kosong atau hampir kosong. Ini dapat terjadi dengan indeks B-tree di PostgreSQL di bawah pola akses tidak umum tertentu. REINDEX menyediakan cara untuk mengurangi konsumsi ruang indeks dengan menulis versi baru indeks tanpa halaman mati. Lihat Bagian 23.2 untuk informasi lebih lanjut.

  • Anda telah mengubah parameter penyimpanan (seperti fillfactor) untuk indeks, dan berharap untuk memastikan bahwa perubahan telah berpengaruh penuh.

  • Pembuatan indeks dengan opsi CONCURRENTLY gagal, meninggalkan indeks "tidak valid". Indeks semacam itu tidak berguna tetapi akan lebih mudah menggunakan REINDEX untuk membangunnya kembali. Perhatikan bahwa REINDEX tidak akan melakukan build bersamaan. Untuk membangun indeks tanpa mengganggu produksi, Anda harus menjatuhkan indeks dan menerbitkan kembali perintah CREATE INDEX CONCURRENTLY.

Jelas, CLUSTERtidak termasuk dalam semua kasus ini.

Dan ada sebuah kalimat kecil dalam CLUSTERdokumen:

[while clustering] Salinan sementara dari setiap indeks di atas meja juga dibuat.

Ini menunjukkan bahwa seperti tabel itu sendiri, indeks juga disusun ulang selama proses - cara ini membuat pengindeksan ulang tidak berguna.

dezso
sumber
Sarannya tentu ada di sana, dan pengujian tampaknya mengkonfirmasi itu. Saya akan merasa lebih baik mengandalkan perilaku ini jika dokumen benar-benar mengatakan bahwa indeks diciptakan kembali (secara permanen).
POHON
2
Saya melihat hal-hal untuk patch doc di sini. Manual harus lebih eksplisit tentang membuat ulang indeks.
Erwin Brandstetter
Kecurigaan saya pada saat ini adalah bahwa para devs tidak ingin secara resmi mendokumentasikan perilaku ini karena mereka tidak ingin terikat secara permanen dengan implementasi ini.
POHON
@ TREE ada banyak perubahan fitur antara versi dan perubahan dokumen (kebanyakan) sesuai. Agaknya spesifikasi juga berubah :), jadi saya tidak melihat dasi di mana pun.
dezso
@dezso Benar, tetapi mereka enggan menghapus fungsionalitas yang didokumentasikan. Mengingat kualitas dokumentasi secara umum, saya masih menganggap kelalaian perilaku ini disengaja.
POHON
5

Menemukan referensi, di bagian Memulihkan Ruang Disk .

Jika Anda memiliki tabel seperti itu dan Anda perlu mendapatkan kembali ruang disk berlebih yang ditempati, Anda harus menggunakan VACUUM FULL, atau sebagai alternatif, CLUSTER atau salah satu varian penulisan ulang tabel dari ALTER TABLE. Perintah-perintah ini menulis ulang seluruh salinan tabel dan membangun indeks baru untuk itu.

POHON
sumber
-3

Menganalisis semua jawaban, menurut saya cara yang tepat untuk melakukan itu adalah dengan memasukkan kembali SEBELUM cluster. Karena dokumentasi tidak mengetahui apakah cluster melakukan atau tidak indeks ulang, dan hanya salinan indeks, dipesan atau tidak, saya pikir indeks yang diindeks akan menghasilkan tabel cluster yang lebih baik. Setelah itu analisis akan menyelesaikan pekerjaan. Vakum penuh sebelum semua tampaknya tidak berguna, kecuali klaster dan / atau indeks ulang tidak membebaskan tupel mati

Aislan Luiz Wendling
sumber
Seperti yang saya sebutkan dalam jawaban yang diterima, dokumentasi tidak mengatakan bahwa indeks akan dibangun kembali, hanya tidak pada halaman tentang perintah CLUSTER.
POHON
Dan keduanya CLUSTERdan VACUUM FULLmenghasilkan tabel fisik baru - tidak mungkin ada yang mati setelah itu. Ruang yang digunakan oleh salinan lama akan dibebaskan pada akhir operasi.
dezso
Memang. Ini menciptakan kembali tabel dan semua indeks. Tetapi saya memiliki keraguan tentang indeks yang digunakan Cluster untuk menyusun ulang tabel. Ini akan diindeks ulang terlebih dahulu atau akan digunakan untuk menyusun ulang tabel seperti apa adanya? Dan setelah itu indeks dibuat kembali? Karena indeks yang bermasalah dapat menghasilkan beberapa masalah ...
Aislan Luiz Wendling