thay đổi kích thước cột mất nhiều thời gian?


7

Tôi có một bảng với 45M hàng (không gian dữ liệu 45 GB và không gian Chỉ mục 2 GB). Tôi đã thêm một cột mới và nó đã hoàn thành ngay lập tức.

alter table T add C char(25)

Sau đó, tôi thấy kích thước quá nhỏ nên tôi chạy truy vấn sau.

alter table T alter column C varchar(2500)

Và nó chạy một giờ và vẫn đang chạy. chương trình sp_whoisactive (hiện tại, vẫn đang chạy)

reads: 48,000,000
writes: 5,000,000
physical reads: 3,900,000

Nó có nên thực sự nhanh không?

Câu trả lời:


10

Giả sử tất cả các cột được tạo trước đó giống như chiều rộng cố định chardatetime, thêm cột Cở trên chỉ cần thêm nó vào cuối phần có chiều rộng cố định của bản ghi (thực tế là thay đổi chỉ meta). Tuy nhiên, gọi lại theo varcharyêu cầu, nó phải được chuyển đến phần có chiều rộng thay đổi của bản ghi, buộc phải xây dựng lại bảng ngầm định. Paul Randal giải thích nội bộ của các bản ghi rất chi tiết trong Inside the Storage Engine: Anatomy of a Data Record .


Cảm ơn, tôi đoán cái bàn đang được xây dựng lại. Tuy nhiên, tôi thấy số lần ghi 8K lớn hơn không gian dữ liệu + không gian chỉ mục và nó vẫn đang chạy?
u23432534

@ u23432534 Các bài viết cũng có thể bao gồm những thứ khác như log, worktable, workfile, v.v.
Aaron Bertrand

@AaronBertrand Quá tệ Tôi đã giết phiên sau khi tìm thấy ghi vượt quá số tính toán của tôi. Tuy nhiên, nó sẽ hiển thị trạng thái runnable. Tôi nghĩ rằng tôi sẽ thả cột và tạo lại nó và nó sẽ kết thúc ngay lập tức.
u23432534

7

Tôi đã thử nghiệm trường hợp. Bạn có thể làm điều đó nhanh hơn bằng các bước dưới đây:

  1. Tạo cấu trúc bảng giống nhau với một tên khác (gọi nó là Tbl2)
  2. Thay đổi cột trên Tbl2
  3. chèn dữ liệu từ Tbl1 vào Tbl2
  4. Thả Tbl1 (bảng cũ)
  5. Đổi tên Tbl2 (cái mới) thành Tbl1

Điều này sẽ cung cấp cho bạn hiệu suất tốt hơn nhiều.

Lý do là, việc thay đổi cột trên bảng chứa dữ liệu, sẽ mất rất nhiều chuyển dữ liệu và căn chỉnh trang dữ liệu. Sử dụng giải pháp của tôi, bạn chỉ cần chèn dữ liệu vào bất kỳ sắp xếp lại trang nào.

Chỉnh sửa:
Trong thử nghiệm của tôi, tôi đã sử dụng bảng với khoảng 40 M hàng, Kích thước bảng 7 GB và Kích thước chỉ mục 2,5 GB. Phương pháp được đề xuất là 1 phút VS 4 phút khi tôi sử dụng đổi tên trường trong bảng gốc

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.