Thêm cột vào bảng sản xuất


28

Cách tốt nhất để thêm các cột vào các bảng sản xuất lớn trên SQL Server 2008 R2 là gì? Theo sách trực tuyến của Microsoft:

Những thay đổi được chỉ định trong ALTER TABLE được triển khai ngay lập tức. Nếu các thay đổi yêu cầu sửa đổi các hàng trong bảng, ALTER TABLE cập nhật các hàng. ALTER TABLE mua khóa sửa đổi lược đồ trên bảng để đảm bảo rằng không có kết nối nào khác tham chiếu ngay cả siêu dữ liệu cho bảng trong khi thay đổi, ngoại trừ các hoạt động chỉ mục trực tuyến yêu cầu khóa SCH-M rất ngắn ở cuối.

(http://msdn.microsoft.com/en-us/l Library / ms190273.aspx)

Trên một cái bàn lớn với hàng triệu hàng, việc này có thể mất một lúc. Là mất điện là lựa chọn duy nhất? Cách tốt nhất để xử lý loại tình huống này là gì?


1
Bài viết gần đây liên quan đến vấn đề này: sqlservercentral.com/articles/Change+Tracking/74397
8kb

Câu trả lời:


27

"Nó phụ thuộc"

Nếu bạn thêm một cột không yêu cầu thêm dữ liệu vào các hàng, thì nó có thể khá nhanh.

Ví dụ, thêm một int hoặc char yêu cầu chuyển động hàng vật lý. Việc thêm một varchar nullable không có mặc định không nên (trừ khi bitmap NULL cần mở rộng)

Bạn cần thử nó trên một bản sao sản xuất được khôi phục để có được ước tính

Tạo một bảng mới, sao chép, đổi tên có thể mất nhiều thời gian hơn nếu bạn phải thêm lại các chỉ mục và khóa trên một bảng hàng tỷ.

Tôi đã thay đổi hàng tỷ bảng hàng mất vài giây để thêm một cột không thể.

Tôi đã nói để có một bản sao lưu đầu tiên?


2
+1 trên bản sao lưu. và chắc chắn rằng bạn có đủ không gian đăng nhập.
SqlACID

Bạn có thể làm rõ tại sao thêm một int hoặc char yêu cầu chuyển động hàng vật lý?
sh-beta

5
Ý bạn là "không" yêu cầu thêm dữ liệu vào các hàng trong dòng thứ hai của bạn?
Ben Brocka

21

Nếu cột là NULLable, tác động sẽ không đáng kể. Nếu cột không thể là NULL và giá trị phải được đặt, thì nó có thể hoàn toàn khác. Những gì tôi sẽ làm trong trường hợp này là, thay vì thêm một ràng buộc không null và mặc định trong một lần chụp, thêm dữ liệu vào mỗi hàng một cách hiệu quả:

  • thêm cột dưới dạng NULLable - nên nhanh chóng trong hầu hết các trường hợp
  • cập nhật các giá trị về mặc định
    • bạn có thể làm điều này theo đợt nếu cần thiết
    • bạn cũng có thể sử dụng điều này để áp dụng logic điều kiện trong đó một số hàng có thể không nhận được mặc định
  • thêm các ràng buộc không null / mặc định
    • việc này sẽ nhanh hơn khi không có dữ liệu nào là NULL, nhưng vẫn có thể đo được

Đồng ý với @gbn rằng bạn có thể kiểm tra điều này bằng cách khôi phục bản sao sản xuất và thử nó ở đó ... bạn sẽ có ý tưởng tốt về thời gian (giả sử phần cứng có phần giống nhau) và bạn cũng có thể thấy tác động lên nhật ký giao dịch.


Re bit cuối cùng: •add the not null/default constraintsTôi không chắc chắn không có vấn đề tiềm ẩn nào với điều này ... Khi MSSQL (thậm chí 2008R2) thay đổi một cột không null thành null, nếu bạn đặt dấu vết trên đó bạn có thể thấy nó thực sự dưới nắp thực hiện cập nhật đầy đủ tất cả các hàng của bảng, tức là update table1 set column1 = column1tôi cho rằng nó đang thực hiện xác minh không có giá trị theo cách hoàn toàn ngu ngốc. Giao dịch này có kích thước gấp đôi bảng (trước và sau trang), vì vậy đối với bảng DW có thể rất lớn. Trước đây chúng tôi đã phải bcp dữ liệu ra, cắt ngắn, thay đổi thành không thay đổi, sau đó bcp.

Nếu có ai biết cách này, tôi rất muốn biết ... Ngược lại, trong Oracle, việc thay đổi null thành không null sẽ khóa, sau đó chọn để xác minh không có null, sau đó cập nhật dữ liệu meta hoàn toàn tức thời.

Này @Mike, đây có vẻ là một câu hỏi tiềm năng tốt theo đúng nghĩa của nó.
Derek Downey

4

Bạn đã cân nhắc chưa:

  1. Tạo một bảng mới bao gồm các thay đổi đối với định nghĩa bảng.
  2. Chèn vào định nghĩa bảng mới chọn từ bảng gốc.
  3. Đổi tên bảng gốc thành _orig và sau đó đổi tên bảng mới thành tên bảng gốc.

Nhược điểm ở đây là bạn phải có đủ không gian trong cơ sở dữ liệu để thực hiện thay đổi này. Bạn vẫn có thể yêu cầu khóa đọc trên bàn để ngăn chặn mọi lần đọc bẩn.

Tuy nhiên, bạn giảm thiểu tác động đến người dùng cuối nếu có cơ hội hoặc nhu cầu cho bảng gốc được truy cập đồng thời. Nó cũng nên giảm thiểu thời lượng khóa.


Bạn sẽ không cần một khóa viết , thay vì đọc? Người dùng thấy dữ liệu trong bảng cũ là tốt, bạn chỉ không muốn họ thực hiện bất kỳ thay đổi nào sẽ bị ghi đè khi bạn hoàn thành việc hoán đổi bộ đệm.
Jon của tất cả các giao dịch

Đó là suy nghĩ của tôi với chiếc mũ kho dữ liệu của tôi về nơi các thay đổi có thể được kiểm soát dễ dàng hơn một chút. Trong trường hợp OLTP bạn đúng, khóa ghi sẽ là cần thiết để tránh những thay đổi được thực hiện đối với bảng.
RobPaller
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.