Yêu cầu không gian đĩa sau khi loại bỏ trường bảng


16

Tôi đang chạy sql 2008 r2 và db đã hoạt động tốt và nhanh trong 3 năm qua cho đến khoảng 3 tháng trước, chúng tôi đã thêm trường ntext trên bảng rất tích cực và được sử dụng. Bây giờ chúng tôi bắt đầu ra khỏi không gian máy chủ vì kích thước mở rộng rất lớn của bảng này.

Tôi đọc được sự thu hẹp đó, chúng tôi không muốn mất việc lập chỉ mục db vì nó hoạt động nhanh trong nhiều năm và chúng tôi không muốn bị phân mảnh.

Chúng tôi đã quyết định xóa trường đó và tất cả các giá trị của nó: Có cách nào để xóa trường ntext và tất cả các giá trị của nó và giải phóng không gian mà không xóa chỉ mục, không thu hẹp, không mất hiệu năng db?

Tôi đang đính kèm đầu ra truy vấn kích thước db để hiển thị cho bạn mở rộng kích thước trong 5 tháng qua.

nhập mô tả hình ảnh ở đây

Câu trả lời:


12

Chúng tôi đã quyết định xóa trường đó và tất cả các giá trị của nó: Có cách nào để xóa trường ntext và tất cả các giá trị của nó và giải phóng không gian mà không xóa chỉ mục, không thu hẹp, không mất hiệu năng db?

Tôi muốn giới thiệu để sử dụng (từ BOL :)

DBCC CLEANTABLE
(
    { database_name | database_id | 0 }
    , { table_name | table_id | view_name | view_id }
    [ , batch_size ]
)
[ WITH NO_INFOMSGS ]

DBCC R CLE RÀNG lấy lại không gian sau khi cột có độ dài thay đổi được loại bỏ. Cột có độ dài thay đổi có thể là một trong các loại dữ liệu sau: varchar, nvarchar, varchar (max), nvarchar (max), varbinary, varbinary (max), text, ntext, image, sql_variant và xml. Lệnh không lấy lại khoảng trống sau khi cột có độ dài cố định bị hủy.

!! THẬN TRỌNG !! ( sử dụng kích thước lô cẩn thận - nên sử dụng tham số này nếu bảng của bạn lớn) :

DBCC CLEANTABLE chạy dưới dạng một hoặc nhiều giao dịch. Nếu kích thước lô không được chỉ định, lệnh sẽ xử lý toàn bộ bảng trong một giao dịch và bảng bị khóa độc quyền trong quá trình hoạt động . Đối với một số bảng lớn, độ dài của giao dịch đơn và không gian nhật ký cần thiết có thể quá nhiều. Nếu một kích thước lô được chỉ định, lệnh sẽ chạy trong một loạt các giao dịch, mỗi giao dịch bao gồm số lượng hàng được chỉ định. DBCC CLEANTABLE không thể được chạy như một giao dịch bên trong một giao dịch khác.

Hoạt động này được ghi lại đầy đủ.

Một repro đơn giản sẽ chứng minh rằng DBCC CLEANTABLEnó tốt hơn SHRINKING (và không phải lo lắng về sự phân mảnh :-)

-- clean up
drop table dbo.Test

-- create test table with ntext column that we will drop later
create table dbo.Test (
    col1 int
    ,col2 char(25)
    ,col3 ntext
    );

-- insert  1000 rows of test data
declare @cnt int;

set @cnt = 0;

while @cnt < 1000
begin
    select @cnt = @cnt + 1;

    insert dbo.Test (
        col1
        ,col2
        ,col3
        )
    values (
        @cnt
        ,'This is a test row # ' + CAST(@cnt as varchar(10)) + 'A'
        ,REPLICATE('KIN', ROUND(RAND() * @cnt, 0))
        );
end

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

--drop the ntext column
ALTER TABLE dbo.Test DROP COLUMN col3 ;

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

--reclaim the space from the table
-- Note that my table is only having 1000 records, so I have not used a batch size
-- YMMV .. so find a maintenance window and you an appropriate batch size 
-- TEST TEST and TEST before implementing in PROD.. so you know the outcome !!
DBCC CLEANTABLE('tempdb', 'dbo.Test') ;

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây


Sau khi bạn đã thực hiện lệnh DBCC CLEANTABLE, bạn cần phải TẠO lại chỉ mục được nhóm của mình trong trường hợp bảng có một, để lấy lại khoảng trống. ALTER INDEX IndexName TRÊN REBUILD của bạn;
Ông TA

6

Đối với hầu hết các phần tôi đang tham khảo Paul Randall's Inside loạt blog về công cụ lưu trữ .

Cách duy nhất để lấy lại không gian chưa sử dụng từ các tệp cơ sở dữ liệu trong SQLServer là sử dụng lệnh DBCC SHRINK để phân bổ lại dữ liệu trong các tệp cơ sở dữ liệu và sau khi xóa chúng khỏi bản đồ Allcation toàn cầu sẽ xóa chúng khỏi tệp cơ sở dữ liệu. Hoạt động này chậm, tạo ra sự phân mảnh trong cơ sở dữ liệu và thậm chí còn chậm hơn khi xử lý các trang LOB vì chúng được lưu trữ dưới dạng danh sách được liên kết trong các tệp cơ sở dữ liệu.

Vì bạn đang thả cột NTEXT, bạn sẽ phải chờ quá trình dọn dẹp ma để xóa dữ liệu trước khi thu nhỏ.

Bây giờ có nhiều không gian trống trong các tệp cơ sở dữ liệu sẽ thực sự không gây hại cho bạn, nếu bạn có dung lượng đĩa, nén sao lưu sẽ chăm sóc không gian trống trong các tệp.

Nếu bạn hoàn toàn muốn làm cho các tệp nhỏ hơn, bạn có thể tạo một nhóm tệp mới với cơ sở dữ liệu và đặt nó làm mặc định và sau đó di chuyển các bảng vào nhóm tệp mới nhưng điều này có thể mất thời gian và gây ra thời gian chết. Tôi đã sử dụng kỹ thuật được giải thích ở đây bởi Bob Pusateri với kết quả tốt.


quá trình dọn dẹp ma sẽ giảm không gian hoặc thu nhỏ cũng sẽ được yêu cầu?
dùng1021182

bạn sẽ luôn phải thu nhỏ, Quá trình dọn dẹp chỉ làm trống các trang được phân bổ nhưng không xóa chúng khỏi các tệp cơ sở dữ liệu
Sporri

1
@ Sporri Since you are dropping the NTEXT column you will have to wait for the ghost cleanup process to drop the data before shrinking.Xin vui lòng xem câu trả lời của tôi . Bạn có thể sử dụng DBCC CLEANTABLEđể giải phóng không gian.
Kin Shah

4

Bạn có muốn thu nhỏ các tệp cơ sở dữ liệu vì bạn cần không gian đó cho các cơ sở dữ liệu khác / các tệp không phải DB hoặc vì bạn đang gặp vấn đề với cơ sở dữ liệu này hết dung lượng?

Nếu đó là lần thứ hai thì bạn có thể không gặp vấn đề gì lớn như bạn nghĩ. Nếu tôi đúng vấn đề của bạn là khi cơ sở dữ liệu cần phát triển để có thêm không gian cho dữ liệu mới. Khi bạn xóa cột, tất cả không gian được chiếm bởi cột đó sẽ được giải phóng cho các hàng mới được thêm vào các bảng trong cơ sở dữ liệu. Điều này có nghĩa là nó sẽ dài hơn trước khi cơ sở dữ liệu của bạn cần phát triển. Trong lúc này tôi sẽ có thêm dung lượng cho ổ dữ liệu của bạn. Hầu hết các cơ sở dữ liệu đều phát triển theo thời gian và thật tuyệt khi có một khoảng trống trống trên ổ đĩa.


chúng tôi chỉ còn 10gb trên dung lượng đĩa và nó cũng sẽ hết trong vài ngày nữa. chúng tôi đã xóa tất cả những gì chúng tôi có thể xóa khỏi máy chủ và sử dụng dọn dẹp và dừng cập nhật windows và xóa tất cả chúng và dọn sạch winxs, bây giờ chúng tôi phải giảm kích thước của tệp db
user1021182

Một lần nữa, hãy nhớ rằng một khi bạn đã xóa cột thêm, sự tăng trưởng DB của bạn sẽ dừng lại trong một thời gian trong khi bạn lấp đầy không gian mới mà bạn đã giải phóng. Nếu DB của bạn vẫn phát triển sau thời điểm này thì bạn hoàn toàn sẽ cần thêm dung lượng đĩa cho cơ sở dữ liệu của mình. Có thể thêm một ổ đĩa mới vào máy chủ của bạn.
Kenneth Fisher

0

Tôi sẽ tạo một bảng nhân bản mà không có cột vi phạm, sao chép tất cả dữ liệu vào bảng này, thả bản gốc và sau đó đổi tên bảng nhân bản.


trong trường hợp đó, tất cả các chỉ mục cũng sẽ cần phải chuẩn bị
user1021182

vâng, bất kỳ chỉ mục nào ảnh hưởng đến bảng sẽ cần phải được loại bỏ & tái tạo lại .... cũng áp dụng cho các đối tượng khác tham chiếu bảng, ví dụ: trình kích hoạt
ardochhigh
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.