Làm cách nào tôi có thể thêm cột chuyển đổi vào bảng lớn với thời gian chết tối thiểu


21

Sử dụng SQL Server 2008 trở lên, tôi muốn thêm một cột chuyển đổi vào một bảng lớn, tuy nhiên khi tôi chỉ đơn giản là

ALTER TABLE [Tablename]
ADD Rowversion [Rowversion] NOT NULL

Sau đó, bảng không có sẵn để cập nhật quá lâu.

Những chiến lược nào tôi có thể sử dụng để giảm thời gian chết này? Tôi sẽ xem xét bất cứ điều gì. Tất nhiên càng đơn giản càng tốt, nhưng tôi sẽ xem xét bất kỳ chiến lược nào.

Suy nghĩ của tôi là như là phương sách cuối cùng, tôi có thể duy trì một bảng phân tầng sao chép được duy trì bởi các kích hoạt và sau đó sp_rename bảng phân tầng vào bảng gốc. Nhưng tôi hy vọng cho một cái gì đó đơn giản / dễ dàng hơn.

Câu trả lời:


26

Xem xét việc tạo một bảng mới với cùng một lược đồ cộng với cột đảo ngược và thêm một khung nhìn ở trên cả hai bảng có liên kết tất cả. Có người sử dụng chế độ xem và viết thay vì kích hoạt đối với các bảng & chế độ xem bên dưới.

Các phần chèn phải được gửi đến bảng mới, các bản cập nhật sẽ di chuyển dữ liệu sang bảng mới và việc xóa sẽ được áp dụng cho cả hai bảng.

Sau đó thực hiện di chuyển hàng loạt trong nền, di chuyển nhiều bản ghi cùng một lúc khi bạn có thể chuyển sang bảng mới. Bạn vẫn có thể gặp sự cố đồng thời trong khi điều này đang diễn ra và một số kế hoạch thực hiện điên rồ, nhưng nó cho phép bạn ở lại trực tuyến trong khi các động thái đang diễn ra.

Lý tưởng nhất là bạn bắt đầu quá trình vào chiều thứ Sáu để giảm thiểu ảnh hưởng đến người dùng cuối và cố gắng hoàn thành trước sáng thứ Hai. Khi đã có, bạn có thể thay đổi chế độ xem để chỉ sang bảng mới và các kế hoạch thực hiện điên rồ sẽ biến mất. Lý tưởng nhất.

Để tránh các kích hoạt kích hoạt khi dữ liệu đang được di chuyển theo lô, hãy xem số lượng hàng trong các bảng đã xóa / chèn trong trình kích hoạt và bỏ qua các hoạt động nếu chúng ở gần số lượng hàng trong lô của bạn.


Cuối cùng, Michael quyết định bỏ qua chế độ xem (và không xóa khỏi bảng gốc) để có được các kế hoạch ổn định hơn. Sự đánh đổi về cơ bản là giữ hai bản sao của bảng. Ông đã biến nó thành một loạt các bài đăng trên blog .


7

Nếu bạn có thời gian để lên kế hoạch trước, có một giải pháp dễ dàng hơn nhiều ... (thường)

Các khóa dài gần như chắc chắn gây ra bởi sự phân tách trang ở lớp lưu trữ. Vì vậy, buộc họ vào lịch trình của riêng bạn.

  1. Thêm một cột tạm thời có khả năng NULL với kiểu dữ liệu VARBINARY(8).
  2. Tìm thời gian chùng có sẵn trong cơ sở dữ liệu để cập nhật các lô của các bản ghi hiện có với giá trị hợp lệ cho trường. ( 0x0000000027F95A5Bví dụ)
  3. Các bản cập nhật sẽ buộc các phần tách trang cần thiết và phân bổ nhiều không gian hơn cho bảng.
  4. Khi bạn bị bắt kịp, hãy thả cột tạm thời (không chạm vào bộ nhớ được phân bổ) và thêm cột chuyển hàng.
  5. Không có phân chia trang và một khóa chỉ cần đủ lâu để đưa vào các giá trị.

Tôi đã sử dụng thành công điều này để thêm cột chuyển đổi vào bảng hàng 150M trong vòng dưới 10 phút.

Hãy cẩn thận ... nếu bạn có một bảng có các trường varchar lớn (đặc biệt varchar(max)) SQL Server quyết định xây dựng lại bảng thay vì sử dụng lại không gian mới có sẵn. Vẫn đang cố gắng tìm ra một cách xung quanh đó.


Thật thú vị, tôi đoán tôi đã không xác định "quá dài" nghĩa là gì trong câu hỏi của tôi. Nếu> 30 phút là quá dài cho kịch bản của bạn và 10 phút là chấp nhận được, giải pháp này sẽ hoạt động. Kịch bản của tôi liên quan đến việc cố gắng đạt được thời gian chết bằng không hoặc cụ thể hơn là <10 giây đạt được bằng câu trả lời của Brent.
Michael J Swart

1

Nếu TIMESTAMPbạn đang thêm là NULLABLE:

  1. Thêm một VARBINARY(8)cột
  2. Dân trí với dữ liệu.

Sau khi nó được phổ biến, ở phía sau để câu lệnh SQL trở lại, DROPcác VARBINARY(8)cột bạn vừa thêm và dân cư, và thêm các TIMESTAMP NULLcột.


Nếu TIMESTAMPbạn đang thêm là NOT NULLABLE:

  1. Thêm một BINARY(8)cột
  2. Dân trí với dữ liệu.

Sau khi nó được phổ biến, ở phía sau để câu lệnh SQL trở lại, DROPcác BINARY(8)cột bạn vừa thêm và dân cư và ADD THE TIMESTAMP NOT NULLcột.

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.