Ya, bisa ada kerugian. Jika kueri lain melihat pada segmen data yang berbeda yang tidak ditentukan oleh tanggal, mungkin diperlukan hit kinerja jika baris tersebar di lebih banyak halaman data sekarang. Sama seperti halnya kueri pertama Anda mendapat untung. Itu sepenuhnya tergantung pada informasi yang tidak ada dalam pertanyaan Anda.
kueri lain menggunakan PK tabel (misalkan id_foo)
Itu bisa apa saja . Itu tergantung pada apa yang Anda miliki dan apa yang Anda tanyakan dengan tepat . Meminta satu baris tidak akan terpengaruh, tetapi beberapa baris mungkin.
Sadarilah bahwa CLUSTER
menulis ulang tabel dalam kondisi murni seperti VACUUM FULL
tidak (menghilangkan tupel mati, memadatkan ukuran fisik tabel, menulis ulang indeks) Jadi, Anda mungkin melihat efek positif langsung pada kinerja baca terlepas dari urutan pengurutan. (Sama seperti yang Anda dapatkan VACUUM FULL
.)
Setelah itu CLUSTER
, Anda mungkin ingin menjalankan dataran VACUUM
di atas meja untuk memperbarui peta visibilitas juga - yang memungkinkan pemindaian hanya indeks.
Semua manfaat CLUSTER
menyusut dengan frekuensi tulis.
Juga, jika Anda memiliki banyak pembaruan pada tabel, CLUSTER
sebenarnya dapat merusak kinerja penulisan dengan menghapus "ruang gerak" untuk pembaruan HOT pada halaman data yang sama. Anda mungkin dapat mengatasi efek itu dengan FILLFACTOR
pengaturan di bawah 100. Sekali lagi, tergantung pada lokalitas baris yang diperbarui, dll.
Terkait:
Either way, saya mungkin tidak akan mengindeks dan mengelompok my_timestamp::date
, tetapi my_timestamp
langsung. Tidak ada yang hilang, sesuatu diperoleh. Para pemainnya sangat murah, tetapi masih lebih murah untuk tidak melakukan pemeran sama sekali. Dan indeks dapat mendukung lebih banyak permintaan.
CREATE INDEX foo_my_timestamp_idx ON foo (my_timestamp);
Meskipun date
menempati hanya 4 byte pada disk dan timestamp
menempati 8 byte, perbedaannya biasanya hilang pada bantalan pelurusan untuk casing Anda, dan kedua indeks memiliki ukuran yang persis sama.
Urutan beberapa baris pada hari yang sama yang dihasilkan dari indeks ekspresi Anda arbitrer. Masih ada dua cap waktu yang identik, tetapi dengan 6 digit fraksional yang biasanya sangat tidak mungkin. Selain itu Anda mendapatkan urutan baris deterministik, yang dapat memiliki berbagai keuntungan.
Saya juga menjatuhkan DESC
kata kunci karena Postgres dapat membaca indeks mundur hampir secepat maju. (Urutkan hal-hal penting untuk indeks multikolom!) Selengkapnya:
Dari pada:
SELECT * FROM foo
WHERE my_timestamp::date = '2016-07-25';
Anda sekarang akan menggunakan:
SELECT * FROM foo
WHERE my_timestamp >= '2016-07-25' -- this is a timestamp literal now
WHERE my_timestamp < '2016-07-26';
Performa yang sama.
Jika Anda tidak perlu komponen waktu kolom sama sekali , mengkonversi kolom ke date
...
Bagaimana cara memutar kembali CLUSTER
?
CLUSTER
pada satu tabel dapat digulirkan kembali dengan ROLLBACK
seperti perintah biasa lainnya selama transaksi belum dilakukan.
Namun, saya mengutip manualnya :
CLUSTER
tanpa parameter reclusters semua tabel yang sebelumnya dikelompokkan dalam database saat ini yang dimiliki oleh pengguna panggilan, atau semua tabel seperti itu jika dipanggil oleh pengguna super. Bentuk CLUSTER
ini tidak dapat dieksekusi di dalam blok transaksi.
Anda selalu dapat menjalankan CLUSTER
dengan indeks yang berbeda untuk mengubah urutan fisik baris sekali lagi.
CLUSTER
? Apakah saya perluCLUSTER
menggunakan PK sekarang?