Bir nvarchar sütununun boyutunu değiştirirken, benzersiz dizini bırakmam gerekir mi? Dizini yeniden oluştururken tablo kilitlenecek mi?


14

Veritabanımızda az çok şuna benzeyen büyük bir tablo var:

CREATE TABLE dbo.production_data
(
    pd_id BIGINT PRIMARY KEY,
    serial NVARCHAR(16) NOT NULL UNIQUE,
    ...
);

ama şimdi seri alanın boyutu düştü, bu yüzden bunu 32 olarak değiştirmek istiyorum. Visual Studio şema karşılaştırma aracı bunu yapmanızı önerir:

DROP INDEX ux_production_data_serial ON dbo.production_data;
GO
ALTER TABLE dbo.production_data ALTER COLUMN serial NVARCHAR(32) NOT NULL;
GO
CREATE INDEX ux_production_data_serial ON dbo.production_data(serial ASC);

Bu gerçekten gerekli mi? Ya da daha çok bunu yapmanın ultra tasarruflu bir yolu gibi mi?

Ayrıca benzersiz dizini yeniden oluştururken masam kilitlenecek mi? Çünkü bu büyük bir sorun olurdu (tablo 30 milyon satır var ve sanırım endeksi yeniden oluşturmak biraz zaman alacaktır), çünkü bir sonraki bakım penceresi gelecekte birkaç aydır. Alternatiflerim neler?

Yanıtlar:


24

Dizini bırakıp yeniden oluşturmanıza gerek yoktur.

Sadece kullan

ALTER TABLE dbo.production_data
  ALTER COLUMN serial NVARCHAR(32) NOT NULL; 

Bu yalnızca meta veri değişikliğidir.

Bir sütunun 'den' NVARCHAR(16)e değiştirilmesi NVARCHAR(32), depolamayı hiç etkilemez.

(Diğer kuşatacak şekilde gidiyor NVARCHAR(32)için NVARCHAR(16)belki Visual Studio sadece her zaman olup olmadığını kontrol yerine kazan plaka kodunu üretir olsa da) size sütun üzerinde bağımlı olma nesneler hakkında bir hata verecekti aslında gerekli.


2
Visual Studio'nun neden DROP / CREATE INDEX olarak yazdığını merak ediyorum. Muhtemelen gereksiz, koşulsuz CYA.
Aaron Bertrand

2
@AaronBertrand - Sanırım bunun gerekli olmadığı durumlarda eksik bir optimizasyon. Çevrimiçi kitaplar, bu güncellemeye kadar
Martin Smith
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.