PostgreSQL, NULL olmayan VARSAYILAN sütun eklemeyi optimize eder mi?


10

Değerli NOT NULLsütunlar eklerken DEFAULT- PostgreSQL bu işlemi optimize ediyor mu?

Tablonun n satırı olması durumunda, optimize edilmemiş bir alter-table-add-column, varsayılan değerin n yazmalarını verir - ki bu çok acı verici olabilir. Optimizasyon ile DB anında yeni sütunu oluşturacak, uygun bir indeks veri yapısında bu sütun için varsayılan olmayan bir değer bulunmadığında döndürülecek varsayılan değerin sadece bir kopyasını saklayacaktır.

Örneğin Oracle 11g'nin böyle bir optimizasyonu var .

Yanıtlar:


16

PostgreSQL'de böyle bir mekanizma yoktur.

Bununla birlikte, böyle bir tablo değişikliğinin aşırı etkilerinden yine de kaçınabilirsiniz.

Aşağıdaki ifade , ifade / işlem süresince tabloda özel erişim kilidi alır:

ALTER TABLE your_table
    ADD COLUMN new_column integer NOT NULL DEFAULT 0;

Bu ifade kataloğu değiştirir, ardından yeni sütunun tüm satırlarda varsayılan değeri içermesi için tüm tabloyu yeniden yazar. Tablonun çok sayıda satırı varsa ve yeterince sık erişilirse, bu bazı geçici sorunlara neden olur.

Bundan kaçınmak için özel kilidi mümkün olduğunca kısa tutmaya çalışın:

ALTER TABLE your_table
    ADD COLUMN new_column integer;
ALTER TABLE your_table
    ALTER COLUMN new_column SET DEFAULT 0;

Bu temelde katalogda sadece (aslında iki) bir değişiklik olduğundan (veri değişikliği olmaz), oldukça hızlı bir şekilde tamamlanacaktır. Ardından ihtiyaçlarınıza ve tablo kullanımına bağlı olarak, yeni sütunu bir adımda veya toplu olarak varsayılan olarak güncelleyebilir ve bittiğinde sütunu olarak ayarlayabilirsiniz NOT NULL.

Gerçekleşen bir istek hakkında güncelleme: PostgreSQL 11 bu özelliğe sahip olacak. Daha fazla bilgi için bkz. Https://www.depesz.com/2018/04/04/waiting-for-postgresql-11-fast-alter-table-add-column-with-a-non-null-default/ .


4

Evet, PostgreSQL 11 ile

Bu özellik yeni ve Sürüm 11'de indirildi.

ALTER TABLE your_table
    ADD COLUMN new_column integer NOT NULL DEFAULT 0;

Yukarıda bu optimizasyondan etkilenecek böyle bir komut vardır; ama, o söyledi gerektiğini NOT NULLedilir değil gerekli. Boş olmayan bir varsayılanla eklenen tüm yeni sütunlar artık optimize edilmiştir. Bu komfesteki girişi bulabilirsiniz Ayrıca "Postgres 11'de Kayıp Bir Bağlantı: Varsayılanlarla Hızlı Sütun Oluşturma" başlıklı bu harika yazıyı da kontrol etmelisiniz .

PostgreSQL 11 Öncesi Geçici Çözüm

Masadaki özel masa kilidinden kaçınmaya çalışıyorsanız, Craig Ringer'ın tavsiyelerine uyun,

  • Olmadan sütun ekle DEFAULT
  • ALTERDEFAULTyeni eklenen satırlara uygulanacak şekilde daha sonra eklemek için
  • Sonra ilerici parti tarafından mevcut satırlarda yeni bir sütun doldurmak UPDATEs
  • Tüm satırlar değere sahip olduğunda, NOT NULLkısıtlamayı eklersiniz
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.