Neden COUNT(*)
çok küçük ve dizine alınmış bir birincil anahtar varken PostgreSQL tabloyu sorgu için sırayla tarar ?
Neden COUNT(*)
çok küçük ve dizine alınmış bir birincil anahtar varken PostgreSQL tabloyu sorgu için sırayla tarar ?
Yanıtlar:
Resmi wiki sayfaları buna bir cevap vermek:
[...] Bunun yavaş olmasının nedeni PostgreSQL'deki MVCC uygulaması ile ilgilidir. Birden fazla işlemin verilerin farklı durumlarını görebilmesi, "COUNT (*)" öğesinin tüm tablodaki verileri özetlemesinin kolay bir yolu olmadığı anlamına gelir; PostgreSQL, bir anlamda tüm satırlardan geçmelidir. Bu normalde tablodaki her satırla ilgili sıralı bir tarama okuma bilgisi ile sonuçlanır. [...]
Ayrıca, sorgu planlayıcısı için bilgileri yeniden oluşturmak için bir ANALYZE deneyebilirsiniz .
Kullanarak daha iyi bir performans elde etmelisiniz, COUNT(an uniquly indexed field)
ancak bu çok büyükse, bunu yapmanın tek yolu bir seq taramasıdır.
Çok hızlı numaralara ihtiyacınız varsa ve şemayı sorgulamaktan korkmuyorsanız, aşağıdakileri yapabilirsiniz
SELECT reltuples FROM pg_class WHERE oid = 'your_table'::regclass
Ancak bu değerlere güvenmeyin çünkü tablodaki "tahmini" (çoğu zaman tam olarak) tuple sayısıdır.
EXPLAIN SELECT * from your_table;
. Bu, sorguyu yürütmez. Çıktı rows=…
, tahmini satır sayısını içerir.
COUNT(pk)
Performansı artıracak hiçbir yerde hiçbir şey okumadım . Her zaman bir seq-tarama yapacağını düşünüyorum