Apa yang terjadi ketika kita menambahkan indeks ke tabel yang ada dengan sejumlah besar data?

11

Saya punya tabel yang akan berisi sekitar ~ 15 Juta catatan. Sekarang saya perlu menambahkan indeks ke tabel.

Menambahkan indeks akan membutuhkan waktu untuk memperbarui setiap entri dalam tabel.

Saya cukup bingung apakah menambahkan indeks akan menyebabkan downtime.

Jika ya, lalu bagaimana saya bisa mengatasi downtime?

Harry Suren
sumber
2
Lihat Membangun Indeks Bersamaan
ypercubeᵀᴹ

Jawaban:

10

Dengan polos CREATE INDEX, tabel akan dikunci untuk penulisan tetapi tidak dibaca.

Gunakan CREATE INDEX CONCURRENTLYuntuk menghindari menulis kunci juga.

Dari dokumen PostgreSQL diCREATE INDEX :

Ketika opsi ini digunakan, PostgreSQL akan membangun indeks tanpa mengambil kunci apa pun yang mencegah penyisipan, pembaruan, atau penghapusan bersamaan di atas meja; sedangkan membangun indeks standar mengunci menulis (tetapi tidak membaca) di atas meja sampai selesai. Ada beberapa peringatan yang harus diperhatikan ketika menggunakan opsi ini - lihat Membangun Indeks Bersamaan .

Dan lebih khusus lagi (Seperti komentar @ypercube ):

PostgreSQL mendukung pembuatan indeks tanpa mengunci penulisan . Metode ini dipanggil dengan menentukan CONCURRENTLYopsi CREATE INDEX. Ketika opsi ini digunakan, PostgreSQL harus melakukan dua pemindaian tabel, dan di samping itu harus menunggu semua transaksi yang ada yang berpotensi menggunakan indeks untuk mengakhiri. Jadi metode ini membutuhkan lebih banyak pekerjaan daripada membangun indeks standar dan membutuhkan waktu lebih lama untuk menyelesaikannya. Namun, karena ini memungkinkan operasi normal untuk melanjutkan sementara indeks dibangun, metode ini berguna untuk menambahkan indeks baru di lingkungan produksi.

Penekanan berani saya.

Fabrizio Mazzoni
sumber