SELECT, VACUUM gibi ölü satırları kaldırır mı?


9

Ben bir tablodan satırları ing iş daha sonra yapmak zorunda azaltmak gibi görünüyor VACUUMbeklenmedik bazı davranışlar ile uğraşmış ve fark ettim .SELECTVACUUM

Test verisi

Not: otomatik vakum devre dışı

CREATE TABLE numbers (num bigint);
ALTER TABLE numbers SET (
  autovacuum_enabled = 'f',
  toast.autovacuum_enabled = 'f'
);

INSERT INTO numbers SELECT generate_series(1, 5000);

Deneme 1

Şimdi tüm satırlarda bir güncelleme gerçekleştiriyoruz,

UPDATE numbers SET num = 0;

Ve VACUUM (VERBOSE) numbers;koştuğumuzda,

INFO:  vacuuming "public.numbers"
INFO:  "numbers": removed 5000 row versions in 23 pages
INFO:  "numbers": found 5000 removable, 5000 nonremovable row versions in 45 out of 45 pages
DETAIL:  0 dead row versions cannot be removed yet, oldest xmin: 6585
There were 0 unused item pointers.

Deneme 2

Şimdi başka UPDATEbir tane SELECTdaha yayınlıyoruz, ancak bu sefer bir sonrakini ekliyoruz ,

UPDATE numbers SET num = 1;
SELECT * FROM numbers;

Ve VACUUM (VERBOSE) numbers;koştuğumuzda,

INFO:  vacuuming "public.numbers"
INFO:  "numbers": removed 56 row versions in 22 pages
INFO:  "numbers": found 56 removable, 5000 nonremovable row versions in 45 out of 45 pages
DETAIL:  0 dead row versions cannot be removed yet, oldest xmin: 6586
There were 56 unused item pointers.

Burada tam olarak ne oluyor? SELECTZiyaret ettiğim sayfalardaki ölü kaplumbağaları kaldırdıktan sonra neden çalıştığım ikinci sürümde olduğu gibi VACUUM?

MacOS 10.14.5 sürümünde Postgres 11.3 kullanıyorum.


2
Komutlarınızı çalıştırmak için hangi istemciyi kullanıyorsunuz? Otomatik taahhüt etkin mi?
mustaccio

2
Ben soruyu silmek için gidiyorum "VAKUM tablosu temel olarak başlık altında SELECT * FROM tablo var mı?" (bu değil) Bence bu iyi bir takip, buradaki cevap, SELECT'in ölü satırları kaldırabileceği ve bunu VACUUM ile ortak paylaştığı. Nasıl farklı oldukları XID'nin rollover'ı ve bir sürü başka şey hakkında çok kapsamlı bir konuşma olacak. Bu soru temelde "Vakum ölü sıraları temizlemenin dışında başka ne yapar?" (Bu biraz belirsiz olurdu)
Evan Carroll

@mustaccio Bu testleri ActiveRecord kullanarak bir Ruby komut dosyası ile yaptım. BEGIN açıkça kullanılmadığı sürece herhangi bir COMMIT vermeniz gerekmediği için autocommit'in varsayılan olarak etkinleştirildiğine inanıyorum.
rafbm

Yanıtlar:


5

Gönderen / r / PostgreSQL bu mesaja bir etmek Laurenz Albe tarafından cevap o Öbek Tuples (HOT) güncellemeler sorumlu olabilir gibi görünüyor. HOT güncellemelerinin açıklamasındansrc/backend/access/heap/README.HOT

Etkili bir şekilde, alan geri kazanımı sırasında sayfa neredeyse doluyken (<% 10 boş) ve bir tampon temizleme kilidi alındığında gerçekleşir. Bu araçlar UPDATE, DELETEve SELECTteneke tetik uzay ıslahı, ama sık değil sırasında INSERT ... VALUESbir satır almak değil çünkü.

Alıntı orijinal cevapta değil, gerisi bir alıntı,

Bu teoriyi desteklemek veya çürütmek için aşağıdaki sorguyu çalıştırın:

SELECT n_tup_upd, n_tup_hot_upd
FROM pg_stat_user_tables
WHERE schemaname = 'public' AND relname = 'TABLE_NAME';

Eğer n_tup_hot_updsıfırdan büyük, ortada bir dava var.


Şimdi konuşuyoruz. +1
mustaccio

HOT iyi bir açıklama gibi görünüyor. I ise CREATE INDEX idx_numbers ON numbers USING btree (num), VACUUM çıkışı olarak değişir INFO: "numbers": removed 5000 row versions in 45 pages. Bununla birlikte, dizinsiz senaryoda n_tup_hot_upd, hem GÜNCELLEME ve SEÇ arasında hem de SEÇ ve VAKUM arasında her zaman 0 olduğunu unutmayın . Ben de SELECT pg_sleep(10)istatistiklerin güncel olması için her ifade arasında çalıştığından emin oldum (görüyorum seq_scan: 2, biri UPDATE ve diğeri SELECT için).
rafbm

Seçim bu durumda WAL üretir mi? Ben seçimler hiç WAL üretmez izlenimi altındaydı. Evet ise, bu, ölü sıraların kaldırılmasının herhangi bir köleye yayıldığı anlamına gelir. Hayır ise, bu köle üzerinde vakumlamanın hala gerekli olduğu anlamına gelir. Bu aynı zamanda ustaların ve kölelerin biraz özdeş olmadığı anlamına da gelir. Hmm, belki biraz araştırma yapmam ve bir soru ve / veya cevap ya da iki tane göndermem gerekiyor.
Colin 't Hart

1

Dizine eklenmemiş bir tablonun özel durumunda, evet, SELECT VACUUM ile aynı işi yapabilir (ölü satırları kaldırmak söz konusu olduğunda).


3
Bir açıklama ekleyebilir misiniz?
Laurenz Albe
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.