Büyük tablodaki hız değiştirme sütununu NON OLMAYAN olarak artırın


12

Son zamanlarda 500 milyona yakın satır içeren bir tabloya NULL özellikli bir bit sütunu ekledim. Sütunda bir varsayılan yoktur, ancak tüm ekler 0 veya 1 değerini belirtir ve varolan tüm satırlara 0 veya 1 atamak için bir kerelik bir rutin çalıştırdım (küçük gruplar halinde satırları güncelleyerek). Artık her satırın bu sütunda 0 veya 1 olması gerekir.

Bit sütununu nullable yapmak istiyorum ancak bunu denediğimde ALTER TABLE t1 ALTER COLUMN c1 bit not null, 3 dakika boyunca çalışmaya başladı ve tabloya tüm okumaları engellediği için durdurdum ve tamamlanması uzun zaman alacağından şüphelendim . Çok uzun sürmeyebilir ama çok fazla kullanılamazlık riskini alamadım. Geri alma işlemi 6 dakika sürdü.

Tamamlanması potansiyel saatler olmadan sütunu nasıl sıfırlanamaz hale getirebileceğime dair bir öneriniz var mı? Ayrıca, ALTER TABLE ALTER COLUMNbaşlayıp iptal ettiğim ifadenin ne kadar sürede tamamlanacağını tahmin etmenin herhangi bir yolu var mı?

SQL Server 2017 Web Edition kullanıyorum.

Yanıtlar:


12

Sütun tanımını değiştirmek yerine, CHECK CONSTRAINTbu sütun için NULL değerlerine izin vermeyen bir sütun ekleyebilirsiniz . Tablonun hala taranması gerekecek, ancak her bir veri sayfasını değiştirmesi gerekmeyeceğinden, çok daha hızlı bir işlem olmalıdır. Ne yazık ki, çalışma sırasında bir Sch-M kilidi tutulacaktır. Bir hile, kısıtlamayı eklemeye çalışmadan önce tablonun mümkün olduğunca tampon havuzuna girmeye çalışmaktır. Bu, Sch-M kilidinin tutulma süresini azaltabilir.

Daha sonra, bir sonraki bakım pencereniz sırasında kısıtlamayı kaldırabilir ve sütun tanımını değiştirebilirsiniz.


Fikir için teşekkürler Joe. Neredeyse bir kontrol kısıtlaması ekleyerek gitti ama hafta sonu boyunca bir bakım penceresi vardı ve nullable için sütun değiştirmeyi başardı. Eğer yardımcı olup olmadığından emin değilim, ama sütun verisi yapılamadan hemen önce tablo verisini tampon havuzuna almak için SELECT c1, count(*) FROM t1 GROUP BY c1, çalıştırmak için yaklaşık 9 dakika sürdü koştu . Bundan sonraki asıl ALTER TABLE ALTER COLUMNifadenin tamamlanması 25 dakika sürdü. Çok kötü değil.
Ben Amada

11

Enterprise Edition (EE) kullanıyorsanız NOT NULL, varsayılan olarak 0veya 1(hangisi en yaygın olanı) ile eklemek daha iyi bir strateji olabilir .

Bu enerji verimliliğinde sadece meta veri değişikliğidir . Ardından çevrilmesi gerekenleri güncelleyin. Bu, daha az güncelleme anlamına gelir ve bittiğinde sütun geçersizliğini değiştirmeye gerek yoktur. - martin-smith


İlginç bir şekilde, geçen hafta SQL geliştirici sürümünü çalıştıran yerel makinemde aynı büyük tabloya varsayılan değeri olan boş olmayan bir bit sütunu eklemeyi test ettiğimde bu özelliği fark ettim - sütun anında eklendi ve nedenini anlayamadım . Daha sonra onun geliştirici sürümü EE özelliklerini içerdiği için olmalı.
Ben Amada

-3

Verileri yeni bir tabloya kopyalamayı deneyin, ardından yeniden adlandırın. Herhangi bir kısıtlama ve indeksle ilgilenmelisiniz. Sütunları yeniden sıralamak istediğinizde SSMS tablo tasarımcısının yaptığı şey budur (örneğin), ancak doğru görünmeyen bir şey olup olmadığını görmek için komut dosyasını kontrol etmelisiniz.

Kopyalama sırasında, kaynak tabloya okuma erişimi bir sorun oluşturmaz, ancak herhangi bir yazma varsa, yalıtım düzeyine bağlı olarak engellenebilir veya kopyalanmayabilir.

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.