Có cách nào đáng tin cậy để xác định khi nào bạn nên chạy DBCC CLEANTABLE để lấy lại không gian không?


11

Gần đây, thay vì chỉ phát triển các tệp khi chúng sử dụng gần 80% tệp, tôi đã chủ động hơn trong việc lấy lại không gian thông qua các thủ thuật thông thường như chống phân mảnh, thêm và xóa chỉ mục cụm, thực hiện nén hàng hoặc nén trang, v.v.

Tuy nhiên, có một vài trường hợp tôi đã có thể lấy lại nhiều không gian hơn bằng cách thực hiện DBCC CLEANTABLE . Với hàng trăm cơ sở dữ liệu trong môi trường của tôi, không thể biết người dùng làm gì trong từng cơ sở dữ liệu và hoàn toàn chấp nhận được rằng sẽ có những thay đổi liên quan đến việc thả các cột có chiều dài cố định. Tôi thường tìm thấy những cơ hội này bằng cách xem số lượng hàng so với số trang trong một số tập lệnh sử dụng không gian đối tượng tôi đã viết. Tôi muốn tiến thêm một bước này bằng cách cố gắng tự động hóa việc phát hiện các loại kịch bản này.

Những gì tôi muốn biết là nếu có ai đó đang tích cực theo dõi các loại cơ hội này và nếu vậy, bạn tìm kiếm gì cụ thể?

Suy nghĩ của tôi là viết một cái gì đó dọc theo dòng thu thập kích thước tối đa và tối thiểu của một hàng, số lượng hàng trong bảng, số trang được phân bổ và số trang được sử dụng, sau đó thực hiện một số phép toán cơ bản để ghi lại kết quả cũng ở bên ngoài những gì sẽ được "mong đợi".


Tôi thực sự khuyên bạn nên sử dụng tham số batch_size trên các bảng lớn. Điều này sẽ khiến lệnh chạy trong một loạt các giao dịch trái ngược với một giao dịch khổng lồ.
datagod

Câu trả lời:


11

Giải pháp tôi nghĩ đến cho vấn đề này là chạy hàng tuần một công việc sẽ chạy sp_spaceuse cho tất cả các bảng trong cơ sở dữ liệu và lưu dữ liệu này vào một bảng. Nếu có sự khác biệt về kích thước cho mỗi bảng lớn hơn..tất cả là 10%, tôi sẽ chạy dbcc clableable.

Mã của tôi để lặp qua các kích thước bảng trông như thế:

if OBJECT_ID ('tempdb.dbo.#temp') is not null
    drop table #temp;

if OBJECT_ID ('dbo.BigTables') is not null
    drop table dbo.BigTables;
go

CREATE TABLE [dbo].[BigTables] (
    [table_name] [sysname] NOT NULL,
    [row_count] [int] NULL,
    [col_count] [int] NULL,
    [data_size] [varchar](50) NULL,
    [Date] [datetime] NOT NULL,
    [DBName] [nvarchar](128) NULL
);
GO

CREATE TABLE #temp (
    table_name sysname ,
    row_count int,
    reserved_size varchar(50),
    data_size varchar(50),
    index_size varchar(50),
    unused_size varchar(50)
);
go

INSERT     #temp
EXEC       sp_msforeachtable 'sp_spaceused ''?'''

insert into dbo.BigTables
SELECT     a.table_name,
           a.row_count,
           count(*) as col_count,
           a.data_size,
           getdate() as [Date],
    'MY DB' as DBName
FROM       #temp a
INNER JOIN information_schema.columns b
           ON a.table_name collate database_default
                = b.table_name collate database_default
GROUP BY   a.table_name, a.row_count, a.data_size
ORDER BY   CAST(Replace(a.data_size, ' KB', '') as integer) desc

DROP TABLE #temp;

Select * from dbo.BigTables;

Bây giờ bạn chỉ cần xây dựng logic sẽ xác minh những gì sẽ thay đổi kích thước trong tuần và lên lịch cho nó.


Bây giờ, nếu có lý do để nghi ngờ sự không chính xác trong các báo cáo kích thước bảng, bạn nên truy cập DBCC UPDATEUSAGE (điều này sẽ khắc phục hàng và số trang). Vinh dự khi được giup bạn!
Mary
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.