SELECT * neden tüm sütunları (farklı bir sütun düzeninde) ada göre seçmekten daha hızlı?


12

A, b, c, d, e, f, g, h, i, j, k sütunlarına sahip bir tabloda şunu elde ederim:

select * from misty order by a limit 25;
Time: 302.068 ms

Ve:

select c,b,j,k,a,d,i,g,f,e,h from misty order by a limit 25;
Time: 1258.451 ms

Seçme sütununu hızlı yapmanın bir yolu var mı?

Güncelleme:

Tabloda dizin yok, yeni oluşturulan bir dizin

İşte EXPLAIN ANALYZE, çok yararlı görünmüyor:

explain analyze select * from misty order by a limit 25;

Limit  (cost=43994.40..43994.46 rows=25 width=190) (actual time=404.958..404.971 rows=25 loops=1)
->  Sort  (cost=43994.40..45731.11 rows=694686 width=190) (actual time=404.957..404.963 rows=25 loops=1)
     Sort Key: a
     Sort Method: top-N heapsort  Memory: 28kB
     ->  Seq Scan on misty  (cost=0.00..24390.86 rows=694686 width=190) (actual time=0.013..170.945 rows=694686 loops=1)
Total runtime: 405.019 ms
(6 rows)

Ve:

explain analyze select c,b,j,k,a,d,i,g,f,e,h from misty order by a limit 25;

Limit  (cost=43994.40..43994.46 rows=25 width=190) (actual time=1371.735..1371.745 rows=25 loops=1)
->  Sort  (cost=43994.40..45731.11 rows=694686 width=190) (actual time=1371.733..1371.736 rows=25 loops=1)
     Sort Key: a
     Sort Method: top-N heapsort  Memory: 28kB
     ->  Seq Scan on misty  (cost=0.00..24390.86 rows=694686 width=190) (actual time=0.015..516.355 rows=694686 loops=1)
Total runtime: 1371.797 ms
(6 rows)

Sütun dizine alınmış mı? Açıklayıcı analiz gönderebilir misiniz?
user_0

1
Arka arkaya iki seçim yaparken ve zamanları karşılaştırırken dikkatli olmalısınız. İkinci sorgudaki önbellekteki veriler, zamanlardaki farkı açıklayabilir.
Walter Mitty

1
Belirgin olmasa da farklılıkları da görüyorum. Masamın satırları = 514431 genişlik = 215, ve kasa için select *yaklaşık 1,5 sn ve sütunlar farklı bir sırada listelenen seçim için yaklaşık 2,2 sn alıyorum .
Colin 't Hart

Tüm sütunları tabloda tanımlandığı sırayla listelersem, yaklaşık olarak aynı zamanları alırım select *.
Colin 't Hart

2
Başlık yanıltıcı. Asıl soru, bir sıralama süresinin neden çıktı sütunlarının sırasına bağlı olduğudur.
Daniel Vérité

Yanıtlar:


12

Bu pgsql-hackerlar posta listesine gönderildi ve ben orada kısaca cevap çalıştı . Hedef listesi (belirtilen sütunlar) ilişkinin tuple tanımlayıcısıyla tam olarak eşleşiyorsa, yani hem sütun hem de sırayla eşleşiyorsa, temeldeki tarama, ekteki Sıralama düğümü tarafından doğrudan sarf edilebilir bir tuple döndürebilir. Öte yandan, hedef listesi eşleşmezse (sırayla veya belirtilen sütunların sayısı), tarama, fazladan iş yapmak için Sort'un veri hazırlama adımını gerektiren tuples formunu döndürür (dahili bir tuple biçiminden sıralama kodu tarafından doğrudan sarf edilen biçim).

Bu arada, '*' dahili olarak ilişkinin grup tanımlayıcısına (sezgisel olarak) uyan bir listeye dönüştürülür.

DÜZENLEME: İkincisi EXPLAIN ANALYZE'nin Seq Scan'in gerçek zamanlarına bakarsanız, eskisinden daha fazlasını görebilirsiniz. Bunun nedeni, taramanın ek bir projeksiyon adımı gerçekleştirmesi (yani, yığın demetini bir iç değerlere dönüştürmek [], nulls] biçiminde). Ve bu olduğu için, üst Sıralama düğümü veri başlatma işleminde, gerçek sıralama adımının anladığı demet formatına geri dönüştürmek için fazladan iş yapmak zorundaydı. Bu Sort'un başlangıç ​​maliyetinden belirgindir. Önceki durumda bu gerçekleşmez. Yani, her iki tarama da tupleı olduğu gibi döndürür ve sort'in başlatma adımı basitçe kopyalar.


@ Colin'tHart, umarım mantıklıdır.
amitlan

Evet. Bazı "işaretçi karıştırma" kullanarak bu adımı atlamak veya kısaltmak mümkün olacağını umuyordum, ama bu pgsql-hackerlar için bir tartışma.
Colin 't Hart

Son zamanlarda mantıksal sütun sıralama çalışmasının yeniden canlandırılmasıyla ufukta bazı iyileştirmeler olabilir .
amitlan

Bunu zaten düşünüyordum ve umuyordum!
Colin 't Hart

sevgili efendim, sadece yerine bazı sütunlara ihtiyacım olursa, hangisi daha hızlı olur? veya * sütunlarını seçin? Çok teşekkürler.
sgon00
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.