tampilan yang terwujud adalah cara untuk pergi untuk apa yang Anda diuraikan. Membuat kueri data hanya-baca selama beberapa bulan terakhir berfungsi tanpa menyegarkannya. Anda mungkin ingin membuat kasus khusus bulan ini jika Anda perlu menutupinya juga.
Kueri yang mendasarinya masih dapat memanfaatkan indeks, dan ada dua arah yang dapat Anda ambil:
Pertama, indeks parsial seperti yang Anda miliki sekarang tidak akan membeli banyak dalam skenario Anda, tidak sepadan. Jika Anda mengumpulkan lebih banyak data bulan dan sebagian besar kueri berdasarkan bulan (dan menambahkan / menghapus baris berdasarkan bulan) partisi tabel mungkin sebuah ide, maka indeks Anda juga dipartisi secara otomatis. Saya akan mempertimbangkan Postgres 11 atau bahkan Postgres 12 yang akan datang untuk ini.)
Jika baris Anda lebar , buat indeks yang memungkinkan pemindaian hanya indeks . Seperti:
CREATE INDEX reportimpression_covering_idx ON reportimpression(datelocal, views, gender);
Terkait:
Atau INCLUDE
kolom tambahan di Postgres 11 atau yang lebih baru:
CREATE INDEX reportimpression_covering_idx ON reportimpression(datelocal) INCLUDE (views, gender);
Lainnya , jika baris Anda secara fisik diurutkan berdasarkan datelocal
, pertimbangkan indeks BRIN
. Ini sangat kecil dan mungkin secepat indeks B-tree untuk kasus Anda. (Tetapi karena ukurannya yang sangat kecil akan lebih mudah disimpan dalam cache dan tidak terlalu banyak mengeluarkan data lain.)
CREATE INDEX reportimpression_brin_idx ON reportimpression USING BRIN (datelocal);
Anda mungkin tertarik dengan CLUSTER
atau pg_repack
untuk mengurutkan baris tabel secara fisik. pg_repack
dapat melakukannya tanpa kunci eksklusif di atas meja dan bahkan tanpa indeks btree (diperlukan oleh CLUSTER
). Tapi ini adalah modul tambahan yang tidak disertakan dengan distribusi standar Postgres.
Terkait:
- Optimalkan penghapusan Postgres dari catatan yatim piatu
- Bagaimana cara mendapatkan kembali ruang disk setelah dihapus tanpa membuat ulang tabel?