PostgreSQL: COUNT (*) dizin değil sıralı bir tarama kullanıyor


12

Neden COUNT(*)çok küçük ve dizine alınmış bir birincil anahtar varken PostgreSQL tabloyu sorgu için sırayla tarar ?

Yanıtlar:


16

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.


Bunun doğru olduğunu düşünmüyorum. COUNT(pk)Performansı artıracak hiçbir yerde hiçbir şey okumadım . Her zaman bir seq-tarama yapacağını düşünüyorum
vol7ron

1
Nerede bir doğru cümlesi yoksa, bir seq taraması yapılacaktır. Postgresql yantümcesinin nerede bir dizin kullanabileceğini yeterince seçerek, raporladığı tuplelerin görünürlüğünü doğrulamak için tabloya geri döneceğini unutmayın.
Scott Marlowe

Hatırlanması kolay bulduğum tahmini satır sayısını elde etmenin bir başka yolu da EXPLAIN SELECT * from your_table;. Bu, sorguyu yürütmez. Çıktı rows=…, tahmini satır sayısını içerir.
Sven Marnach
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.