Ketika mengubah ukuran kolom nvarchar, apakah saya harus menjatuhkan indeks unik? Dan akankah tabel terkunci ketika membuat ulang indeks?


14

Dalam basis data kami ada tabel besar yang kurang lebih terlihat seperti ini:

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

tapi sekarang ukuran bidang serial menjadi rendah, jadi saya ingin mengubahnya menjadi 32. Alat perbandingan skema Visual Studio menyarankan melakukan ini dengan:

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);

Apakah ini benar-benar dibutuhkan? Atau lebih seperti cara sangat hemat untuk melakukan ini?

Juga saat membuat ulang indeks unik, apakah meja saya akan terkunci? Karena ini akan menjadi masalah besar (karena tabel memiliki 30 juta baris dan saya kira membuat ulang indeks akan memakan waktu cukup lama), karena jendela pemeliharaan berikutnya adalah beberapa bulan di masa depan. Apa alternatif saya?

Jawaban:


24

Tidak perlu menjatuhkan dan membuat ulang indeks.

Gunakan saja

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

Ini hanya perubahan metadata.

Mengubah kolom dari NVARCHAR(16)menjadi NVARCHAR(32)tidak memengaruhi penyimpanan sama sekali.

Sebaliknya, dari ( NVARCHAR(32)ke NVARCHAR(16)) akan memberi Anda kesalahan tentang objek yang bergantung pada kolom meskipun begitu mungkin Visual Studio hanya selalu menghasilkan kode pelat ketel itu sebagai pengganti memeriksa apakah itu benar - benar diperlukan.


2
Ingin tahu mengapa Visual Studio menuliskannya sebagai DROP / CREATE INDEX. Mungkin tidak perlu, CYA tanpa syarat.
Aaron Bertrand

2
@ AaronBertrand - Saya kira itu hanya optimasi yang hilang untuk kasus-kasus di mana tidak diperlukan. Buku daring menunjukkan bahwa ini diperlukan dalam beberapa kasus di mana produk tidak benar-benar memerlukannya hingga pembaruan ini
Martin Smith
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.