COUNT(*)Birincil anahtarı olan 150.000 satır içeren bir tabloya çalışıyorum . Bu araç yaklaşık 5 dakika, bu yüzden bu bir indeksleme sorunu olduğunu anladım.
PostgreSQL kılavuzuna atıf :
REINDEX, dizinin içeriğinin sıfırdan yeniden oluşturulması nedeniyle dizinin düşmesine ve yeniden oluşturulmasına benzer. Bununla birlikte, kilitleme hususları oldukça farklıdır. REINDEX, dizinin üst tablosundaki yazma işlemlerini kilitler, ancak okumaları engellemez. Ayrıca, işlenmekte olan belirli bir dizin üzerinde özel bir kilit alır ve bu dizini kullanmaya çalışan okumaları engeller (...) Sonraki CREATE INDEX yazma işlemlerini kilitler, ancak okumaları kilitler; indeks orada olmadığından, hiçbir okuma onu kullanmaya çalışmaz, yani engelleme olmaz, ancak okumalar pahalı sıralı taramalara zorlanabilir.
Kendi deneyiminizden şunu söyleyebilir misiniz?
- olan
REINDEXINGtehlikeli? Veri tutarlılığına zarar verebilir mi? - Çok zaman alabilir mi?
- Senaryom için olası bir çözüm mü?
Güncelleme:
Bizim için çalışan çözüm, aynı dizini farklı bir adla yeniden oluşturmak ve ardından eski dizini silmekti.
Dizin oluşturma çok hızlı ve dizin boyutunu 650 MB'dan 8 MB'a düşürdük. Bir kullanma COUNT(*)ile betweensadece 3 saniye sürer.
COUNT(*), en iyi seçimdir: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.