Bir sütunu NOT NULL olarak değiştirdiğinizde , NULL değer olmasa bile , SQL Server her sayfaya dokunmak zorundadır . Doldurma faktörünüze bağlı olarak bu aslında çok fazla sayfa bölmesine yol açabilir. Dokunulan her sayfa elbette günlüğe kaydedilmek zorundadır ve birçok sayfa için iki değişikliğin günlüğe kaydedilmesi gerekeceğinden şüpheleniyorum. Her şey tek bir geçişte yapıldığı için, günlük, tüm değişiklikleri hesaba katmak zorundadır, böylece iptal düğmesine basarsanız, tam olarak ne geri alınacağını bilir.
Bir örnek. Basit masa:
DROP TABLE dbo.floob;
GO
CREATE TABLE dbo.floob
(
id INT IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED,
bar INT NULL
);
INSERT dbo.floob(bar) SELECT NULL UNION ALL SELECT 4 UNION ALL SELECT NULL;
ALTER TABLE dbo.floob ADD CONSTRAINT df DEFAULT(0) FOR bar
Şimdi sayfa detaylarına bakalım. Öncelikle hangi sayfa ve DB_ID ile uğraştığımızı bulmamız gerekiyor. Benim durumumda bir veritabanı oluşturdum foo
ve DB_ID 5 oldu.
DBCC TRACEON(3604, -1);
DBCC IND('foo', 'dbo.floob', 1);
SELECT DB_ID();
Çıktı, sayfa 159 ile ilgilendiğimi belirtti ( DBCC IND
çıktıdaki tek satır PageType = 1
).
Şimdi, OP senaryosunda ilerlerken bazı sayfa seçimlerini inceleyelim.
DBCC PAGE(5, 1, 159, 3);
UPDATE dbo.floob SET bar = 0 WHERE bar IS NULL;
DBCC PAGE(5, 1, 159, 3);
ALTER TABLE dbo.floob ALTER COLUMN bar INT NOT NULL;
DBCC PAGE(5, 1, 159, 3);
Şimdi, bu konuda tüm cevapları alamadım, çünkü derin bir iç adam değilim. Ancak, hem güncelleme işlemi hem de NOT NULL kısıtlamasının eklenmesinin sayfaya inkar edilemez bir şekilde yazdığı açıktır, ikincisi bunu tamamen farklı bir şekilde yapar. Aslında, bitlerle uğraşmak yerine kaydın yapısını değiştirmek yerine, kayıt edilemez bir sütun için boşaltılabilir sütunu değiştirerek değiştirmiş gibi görünüyor. Bunu yapmak zorunda, neden emin değilim - depolama motoru ekibi için iyi bir soru sanırım. SQL Server 2012'nin bu senaryoların bazılarını çok daha iyi ele aldığına inanıyorum, FWIW - ama henüz ayrıntılı testler yapmadım.
NOT NULL
varsayılan olarak bir meta veri işlemi olan bir sütun ekleme özelliğini ekler . Ayrıca belgelerde "Çevrimiçi İşlem Olarak NOT NULL Sütun Ekleme" konusuna bakın .