Saya sudah mencoba COUNT(*)
meja dengan 150.000 baris yang memiliki kunci Primer. Ini alat sekitar 5 menit, jadi saya tahu ini adalah masalah pengindeksan.
Mengutip manual PostgreSQL :
REINDEX mirip dengan setetes dan buat ulang indeks di mana isi indeks dibangun kembali dari awal. Namun, pertimbangan pengunciannya agak berbeda. REINDEX mengunci penulisan tetapi tidak membaca tabel induk indeks. Dibutuhkan juga kunci eksklusif pada indeks spesifik yang sedang diproses, yang akan memblokir bacaan yang mencoba menggunakan indeks itu (...) CREATE INDEX berikutnya mengunci penulisan tetapi tidak membaca; karena indeks tidak ada, tidak ada pembacaan akan mencoba untuk menggunakannya, yang berarti bahwa tidak akan ada pemblokiran tetapi pembacaan mungkin dipaksa menjadi pemindaian berurutan yang mahal.
Dari pengalaman Anda sendiri, dapatkah Anda memberi tahu:
- adalah
REINDEXING
berbahaya? Bisakah itu merusak konsistensi data? - Bisakah ini menghabiskan banyak waktu?
- Apakah ini solusi yang mungkin untuk skenario saya?
Memperbarui:
Solusi yang berhasil bagi kami adalah menciptakan kembali indeks yang sama dengan nama yang berbeda, kemudian menghapus indeks yang lama.
Pembuatan indeks sangat cepat, dan kami telah mengurangi ukuran indeks dari 650 MB menjadi 8 MB. Menggunakan COUNT(*)
dengan between
hanya membutuhkan 3 detik.
COUNT(*)
adalah pilihan terbaik:If you are using count(*), the database is free to use any column to count, which means it can pick the smallest covering index to scan (note that this is why count(*) is much better than count(some_field), as long as you don't care if null values of some_field are counted). Since indexes often fit entirely in memory, this means count(*) is often very fast.