Cách hiệu quả nhất để thay đổi định nghĩa cột trong bảng có hàng triệu hàng


9

Tôi cần thay đổi một cột từ KHÔNG NULL thành NULL trong một bảng chứa hàng triệu hàng. Tôi đã thử một cách đơn giản

alter table Table1 ALTER COLUMN Column1 XML NULL

nhưng phải mất mãi mãi Vì vậy, đây là những câu hỏi của tôi:

  1. Tại sao phải mất quá nhiều thời gian để áp dụng thay đổi?
  2. Có cách nào tốt hơn để làm điều đó?

Câu trả lời:


3

1) Người ta sẽ cần thêm thông tin về cấu trúc hoàn chỉnh của bảng + các chỉ mục không được nhóm để tìm hiểu chính xác những gì đang xảy ra nhưng sự nghi ngờ của tôi là điều cần làm với bitmap NULL.

Vui lòng tham khảo để biết thêm chi tiết về chủ đề. http://www.sqlskills.com/BLOGS/PAUL/post/Misconceptions-around-null-bitmap-size.aspx

http://www.sqlskills.com/BLOGS/PAUL/post/A-Query-Server-DBA-myth-a-day-(630)-three-null-bitmap-myths.aspx

2) Có, miễn là bạn có không gian lưu trữ, tạo một bảng mới với tính vô hiệu chính xác và chuyển dữ liệu theo nhiều đợt để tránh tăng trưởng nhật ký quá mức và chuyển đổi bảng bằng cách sử dụng kỹ thuật được liệt kê bên dưới. Tôi đã làm điều này nhiều lần với ít hoặc không có thời gian chết.

http://jahaines.blogspot.com/2009/12/sql-server-2005-how-to-move-10-millions.html


6

Nó sẽ nhanh hơn để:

  1. Tạo một bảng mới với định nghĩa chính xác cho Column1
  2. INSERT INTO <NewTable> SELECT * FROM <OriginalTable>;
  3. Đổi tên OriginalTable thành OriginalTable_old; Đổi tên NewTable thành OriginalTable
  4. Xác thực và thả OriginalTable_old

Ưu điểm ở đây là bạn không giữ khóa trên bảng Ban đầu trong suốt thời gian hoạt động. Bảng chỉ nên được khóa trong giai đoạn đổi tên. (Nó giả định rằng SQL Server hỗ trợ đổi tên cấp đối tượng.)


Có, SQL Server hỗ trợ đổi tên mức đối tượng bằng cách sử dụng thủ tục lưu trữ hệ thống sp_rename.
gonsalu

Tôi đã có thể thay đổi một cột thông qua cách này với 3,5 triệu hàng trong vòng 1 phút.
Mohsen Afshin

2

Mỗi hàng cần được chạm khi thay đổi cột từ KHÔNG NULL thành NULL, đó là lý do tại sao phải mất quá nhiều thời gian để hoàn thành. Không có cách nào để làm cho nó mất ít thời gian hơn.


1

Một tùy chọn khác là tạo một cột mới với định nghĩa chính xác cho bảng đang đề cập, Cập nhật cột có dữ liệu từ cột cũ, sau đó thả cột cũ.

Hoặc Bạn có thể tham khảo một bài đăng cũ hơn từ SE xử lý một vấn đề tương tự trên cột INT.

/programming/4311559/sql-server-performance-for-alter-table-alter-column-change-data-type


Trong trường hợp của tôi, cột của tôi chỉ đơn giản là đầy NULL, vì vậy tôi nghĩ rằng đây sẽ là cách để đi, tạo một cột NULL hoàn toàn mới với tên đúng sẽ không mất thời gian ... sau đó xóa cột cũ, thay vì xử lý hàng triệu lần chèn ...
Zack

0

Nếu bạn mở trình giám sát hoạt động SQL trong khi lệnh đang chạy, bạn sẽ có thể biết liệu nó có thực sự xử lý hay không hoặc liệu nó có đang chờ một dạng khóa độc quyền nào đó của bảng không.

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.