Postgresql berbeda dari DBMS lain dalam hal bahwa selama operasi UPDATE, perubahan pada baris yang ada tidak terjadi, dan sebagai gantinya salinan dari baris dibuat yang berbeda dari aslinya dengan nilai-nilai kolom yang dipengaruhi oleh pembaruan - mereka sudah tua dalam aslinya dan diubah dalam salinan. Pendekatan ini, di satu sisi, memungkinkan Anda untuk menghindari kunci saat menjalankan permintaan baca dan tulis, dan di sisi lain, itu menciptakan kebutuhan untuk terus-menerus menghapus string versi lama yang tak seorang pun akan pernah membaca. Sehubungan dengan fitur arsitektur ini, pertanyaan yang sering muncul tentang apa yang akan terjadi jika Anda perlu menyimpan dalam database, seperti waktu akses terakhir ke data yang tidak berubah. Apakah akan merespons kinerja? Apakah akan mengarah pada restrukturisasi indeks yang konstan?
Singkatnya, ya, Copy On Write tidak akan pergi ke mana pun, tetapi dalam banyak kasus indeks tidak dapat dibangun kembali, terima kasih kepada HOT.
Heap only tuple, juga dikenal sebagai HOT, adalah optimasi yang digunakan Postgres untuk mengurangi jumlah I / O yang diperlukan untuk pembaruan. Karena MVCC, pembaruan di Postgres terdiri dari menemukan baris untuk pembaruan dan memasukkan versi baru dari baris ke dalam database. Kelemahan utama dari prosedur ini adalah kebutuhan untuk menambahkan kembali satu baris ke setiap indeks.
Ini membutuhkan lebih banyak I / O karena baris perlu dimasukkan kembali ke setiap indeks dalam tabel. Perlunya memasukkan kembali muncul karena posisi fisik dari versi baru dari baris pada disk berbeda dari posisi fisik versi lama.
Untuk mengurangi jumlah I / O yang diperlukan untuk UPDATE, tim Postgres menambahkan HOT ke Postgres. Gagasan di balik HOT relatif sederhana. Saat memperbarui baris, jika memungkinkan, Postgres akan segera menyalin baris tersebut setelah salinan lama baris tersebut. Plus, dalam salinan string yang lama, label khusus ditempel sehingga Postgres tahu bahwa salinan string yang baru segera setelah yang lama. Karena itu, memperbarui semua indeks tidak diperlukan.
Selama pemindaian oleh indeks yang salinan string baru dilewati, filter Postgres akan menemukan salinan string yang lama. Karena ada label khusus pada salinan lama dari baris, Postgres akan mengerti bahwa salinan baru dari baris terletak segera setelah yang lama dan akan menemukan versi baru dan menggunakannya. Ternyata Postgres dalam kasus seperti itu dapat berperilaku seolah-olah semua indeks menunjuk ke salinan baru dari string, dan mereka tidak perlu dibangun kembali.
Sekarang HOT hanya terlibat ketika hanya kolom yang tidak dapat diindeks terlibat dalam pembaruan. Jika setidaknya satu kolom yang berpartisipasi dalam pembaruan termasuk dalam indeks, HOT tidak dapat diterapkan. Dalam hal ini, ada beberapa masalah dengan menggunakan HOT. Misalnya, ketika indeks pada kolom yang perlu diperbarui diindeks oleh pemindaian dan salinan lama dari garis jatuh ke dalam predikat pemindaian, tetapi yang baru tidak. Dalam situasi ini, Postgres akan mencoba menggunakan indeks untuk dengan cepat menemukan semua baris yang cocok untuk predikat kueri, dan dalam kasus kolom yang diperbarui menggunakan HOT, itu akan menghasilkan salinan baru dari baris yang tidak cocok dengan predikat kueri. Karena batasan ini (bahwa HOT tidak berfungsi ketika kolom yang dapat diindeks dimasukkan dalam pembaruan), Postgres dapat menjamin bahwa ketika ia mencoba untuk menemukan baris yang sesuai untuk predikat yang dilalui indeks, maka jika predikat cocok dengan versi lama dari baris, maka versi baru dari baris juga cocok untuknya dan sebaliknya.
Saat ini sedang dikembangkan adalah ekstensi HOT yang disebut WARM, yang juga berfungsi ketika memperbarui kolom di mana indeks dibuat. Gagasan di balik WARM adalah untuk menempatkan baris baru segera setelah yang lama dan memperbarui baris untuk indeks yang telah mengubah kolom. Ini sangat menyulitkan situasi yang dijelaskan, karena sekarang Postgres membutuhkan cara untuk menentukan apakah baris melewati filter untuk indeks atau tidak.
NB Dalam artikel asli, mekanisme HOT dijelaskan, tetapi di sini kita memiliki mekanisme di mana tumpukan hanya tuple yang terlibat, dan istilah itu sendiri memiliki arti yang terpisah.
Heap only tuple hanyalah versi baru dari baris tersebut. Anehnya, Heap adalah sebuah tabel, dan Heap hanya berarti bahwa baris ini hanya dapat ditemukan oleh rantai yang mengarah dari versi lama dari garis yang disebut root.