Thay đổi cột nhận dạng từ INT thành BIGINT


9

Tôi có một bảng với một cột danh tính cũng là một khóa chính. Hiện tại, nó có 50 triệu hàng, với giá trị cao nhất của cột định danh nằm ở 148.921.803. Bảng có rất nhiều DELETEs và được INSERTSthực hiện trên đó, do đó giá trị cao.

Chúng tôi muốn thay đổi kiểu dữ liệu từ INTđể BIGINTchuẩn bị cho việc bổ sung nhiều hàng. Lưu ý rằng, không có tham chiếu đến cột PK.

Cách tốt nhất để làm điều này, với thời gian chết tối thiểu là gì? Tôi có hai lựa chọn.

  1. Thả PK và thay đổi cột; hoặc là
  2. Phương thức sao chép thả xuống, như được mô tả ở đây :

Câu trả lời:


7

Vì có một khóa chính được xác định trên cột định danh, bạn sẽ không thể thay đổi trực tiếp cột này.

Cả hai cách tiếp cận mà bạn đã đề cập trong câu hỏi của bạn đều có thể được sử dụng và thời gian chết phụ thuộc vào cách máy chủ của bạn hoạt động và số lượng hàng nằm trong bảng đó.

  1. Thả PK và thay đổi cột; hoặc là

Đầu tiên thả PK

/****** Object: DROP Index [PK_DatabaseLog_DatabaseLogID]******/

ALTER TABLE [dbo].[TableName] DROP CONSTRAINT [PK_TableName_ID]
GO

Cột thay đổi

ALTER TABLE [dbo].[TableName] ALTER COLUMN [dbo.ID] BIGINT

Thêm khóa chính

/****** Object: ADD Index [PK_DatabaseLog_DatabaseLogID]******/
ALTER TABLE [dbo].[TableName] ADD  CONSTRAINT [PK_TableName_ID] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)

Cách tiếp cận này thường không mất nhiều thời gian. Trong môi trường của tôi, phải mất vài giây trên những chiếc bàn lớn có hơn 5 triệu hàng.

  1. Phương pháp sao chép thả-đổi tên, như được mô tả

Bạn có thể sử dụng phương pháp này là tốt. Tuy nhiên, đối với phương pháp này, bạn cần nhiều thời gian chết hơn Cách tiếp cận vì bạn phải đồng bộ hóa các bảng.


6

Aaron Bertrand có một loạt gồm 4 phần về chủ đề này, bắt đầu bằng:

Giảm thiểu tác động của việc mở rộng cột IDENTITY - phần 1

Nếu bạn thực sự cần phải chuyển đến bigint, phải giảm thiểu thời gian chết và có nhiều thời gian để lập kế hoạch, cách tiếp cận mà anh ấy ghi lại trong phần 4 là:

Ở mức rất cao, cách tiếp cận là tạo ra một tập hợp các bảng bóng, trong đó tất cả các phần chèn được hướng đến một bản sao mới của bảng (với kiểu dữ liệu lớn hơn) và sự tồn tại của hai bộ bảng là trong suốt càng tốt cho ứng dụng và người dùng của nó.

Chi tiết hơn, Aaron nói:

  1. Tạo bản sao bóng của các bảng, với các loại dữ liệu phù hợp.
  2. Thay đổi các thủ tục được lưu trữ (hoặc mã ad hoc) để sử dụng bigint cho các tham số. (Điều này có thể yêu cầu sửa đổi ngoài danh sách tham số, chẳng hạn như biến cục bộ, bảng tạm thời, v.v., nhưng đây không phải là trường hợp ở đây.)
  3. Đổi tên các bảng cũ và tạo các khung nhìn với các tên kết hợp các bảng cũ và mới.
    • Các khung nhìn đó sẽ có thay vì kích hoạt các hoạt động DML trực tiếp đến (các) bảng thích hợp, để dữ liệu vẫn có thể được sửa đổi trong quá trình di chuyển.
    • Điều này cũng yêu cầu SCHEMABINDING được loại bỏ khỏi mọi chế độ xem được lập chỉ mục, các chế độ xem hiện có để có sự kết hợp giữa các bảng mới và cũ và các quy trình dựa trên SCOPE_IDENTITY () để được sửa đổi.
  4. Di chuyển dữ liệu cũ sang các bảng mới theo từng khối.
  5. Dọn dẹp, bao gồm:
    • Bỏ các chế độ xem tạm thời (sẽ giảm các kích hoạt INSTEAD OF).
    • Đổi tên các bảng mới trở lại tên ban đầu.
    • Sửa các thủ tục được lưu trữ để trở lại SCOPE_IDENTITY ().
    • Đánh rơi những cái bàn cũ, giờ trống rỗng.
    • Đưa SCHEMABINDING trở lại các khung nhìn được lập chỉ mục và tạo lại các chỉ mục được nhóm.
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.