Dampak CLUSTER pada kinerja

8

Saya mencoba untuk mengoptimalkan database Postgres 9.2 saya untuk mempercepat permintaan dengan batasan tanggal.

Saya memiliki timestampkolom, tetapi sebagian besar saya meminta beberapa hari, jadi saya telah membuat indeks timestampuntuk datemenguraikan:

CREATE INDEX foo_my_timestamp_idx
ON foo
USING btree
((my_timestamp::date) DESC);

Sekarang, untuk meningkatkan CLUSTER footabel kinerja I menggunakan indeks di atas:

CLUSTER foo USING foo_my_timestamp_idx;

Menurut manual tentang SQL-CLUSTER , tabel

secara fisik disusun berdasarkan informasi indeks

Saya bertanya-tanya apakah ada dampak pada kinerja untuk kueri lain menggunakan PK tabel (misalkan id_foo). Apakah ada kerugian?

ilovkatie
sumber

Jawaban:

10

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 CLUSTERmenulis ulang tabel dalam kondisi murni seperti VACUUM FULLtidak (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 VACUUMdi atas meja untuk memperbarui peta visibilitas juga - yang memungkinkan pemindaian hanya indeks.

Semua manfaat CLUSTERmenyusut dengan frekuensi tulis.

Juga, jika Anda memiliki banyak pembaruan pada tabel, CLUSTERsebenarnya dapat merusak kinerja penulisan dengan menghapus "ruang gerak" untuk pembaruan HOT pada halaman data yang sama. Anda mungkin dapat mengatasi efek itu dengan FILLFACTORpengaturan 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_timestamplangsung. 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 datemenempati hanya 4 byte pada disk dan timestampmenempati 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 DESCkata 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?

CLUSTERpada satu tabel dapat digulirkan kembali dengan ROLLBACKseperti perintah biasa lainnya selama transaksi belum dilakukan.

Namun, saya mengutip manualnya :

CLUSTERtanpa 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 CLUSTERini tidak dapat dieksekusi di dalam blok transaksi.

Anda selalu dapat menjalankan CLUSTERdengan indeks yang berbeda untuk mengubah urutan fisik baris sekali lagi.

Erwin Brandstetter
sumber
Jawaban awsome, saya perlu bertanya, bagaimana cara 'kembalikan' CLUSTER? Apakah saya perlu CLUSTERmenggunakan PK sekarang?
ilovkatie
@ilovkatie: Saya menambahkan sedikit cara memutar kembali.
Erwin Brandstetter