Khi thay đổi kích thước của cột nvarchar, tôi có cần bỏ chỉ mục duy nhất không? Và bảng sẽ bị khóa khi tạo lại chỉ mục?


14

Trong cơ sở dữ liệu của chúng tôi, có một bảng lớn tồn tại ít nhiều trông như thế này:

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

nhưng bây giờ kích thước của trường nối tiếp đã trở nên thấp, vì vậy tôi muốn thay đổi nó thành 32. Công cụ so sánh lược đồ Visual Studio gợi ý thực hiện điều này bằng cách:

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

Đây có thực sự cần thiết? Hoặc giống như một cách cực kỳ tiết kiệm để làm điều này?

Ngoài ra khi tạo lại chỉ mục duy nhất, bảng của tôi có bị khóa không? Bởi vì đây sẽ là một vấn đề lớn (vì bảng có 30 triệu hàng và tôi đoán việc tạo lại chỉ mục sẽ mất khá nhiều thời gian), bởi vì cửa sổ bảo trì tiếp theo là một vài tháng trong tương lai. Lựa chọn thay thế của tôi là gì?

Câu trả lời:


24

Không cần phải thả và tạo lại chỉ mục.

Chỉ dùng

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

Đây là một siêu dữ liệu chỉ thay đổi.

Thay đổi một cột từ NVARCHAR(16)đến NVARCHAR(32)không ảnh hưởng đến việc lưu trữ.

Đi ngược lại (từ NVARCHAR(32)đến NVARCHAR(16)) sẽ cho bạn một lỗi về các đối tượng phụ thuộc vào cột mặc dù vậy có lẽ Visual Studio chỉ luôn tạo mã tấm nồi hơi đó thay vì kiểm tra xem nó có thực sự cần thiết hay không.


2
Tò mò tại sao Visual Studio kịch bản nó là DROP / CREATE INDEX. Có lẽ không cần thiết, CYA vô điều kiện.
Aaron Bertrand

2
@AaronBertrand - Tôi cho rằng đó chỉ là một sự tối ưu hóa còn thiếu cho các trường hợp không cần thiết. Sách trực tuyến chỉ ra rằng điều này là cần thiết trong một vài trường hợp sản phẩm không thực sự yêu cầu nó cho đến khi cập nhật này
Martin Smith
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.