Apakah ada cara yang dapat diandalkan untuk menentukan kapan Anda harus menjalankan DBCC CLEANTABLE untuk mendapatkan kembali ruang?

11

Akhir-akhir ini, alih-alih hanya menumbuhkan file ketika mendekati utilisasi file 80%, saya lebih proaktif dalam merebut kembali ruang melalui trik biasa seperti defragmenting heaps, menambah & menjatuhkan indeks berkerumun, menerapkan kompresi baris atau halaman, dll.

Namun, ada beberapa kasus di mana saya bisa mendapatkan kembali lebih banyak ruang dengan mengeksekusi DBCC CLEANTABLE . Dengan ratusan basis data di lingkungan saya, tidak mungkin mengetahui apa yang dilakukan pengguna di masing-masing dan benar-benar dapat diterima bahwa akan ada perubahan yang melibatkan penurunan kolom dengan panjang tetap. Saya biasanya menemukan peluang ini dengan melihat jumlah baris vs jumlah halaman dalam beberapa skrip pemanfaatan ruang objek yang saya tulis. Saya ingin mengambil langkah ini lebih jauh dengan mencoba mengotomatiskan deteksi skenario semacam ini.

Yang ingin saya ketahui adalah apakah ada orang di luar sana yang secara aktif memantau peluang semacam ini dan jika demikian, apa yang Anda cari secara spesifik?

Pikiranku adalah untuk menulis sesuatu di sepanjang garis mengumpulkan ukuran max dan min dari satu baris, jumlah baris dalam tabel, jumlah halaman yang dialokasikan, dan jumlah halaman yang digunakan, kemudian melakukan beberapa matematika dasar untuk mencatat hasil yang berada di luar apa yang akan "diharapkan".

AndrewSQL
sumber
Saya sangat merekomendasikan menggunakan parameter batch_size pada tabel besar. Ini akan menyebabkan perintah dijalankan dalam serangkaian transaksi yang bertentangan dengan satu transaksi raksasa.
datagod

Jawaban:

11

Solusi yang saya pikirkan untuk masalah ini adalah menjalankan pekerjaan mingguan yang akan menjalankan sp_spaceused untuk semua tabel dalam database dan menyimpan data ini dalam sebuah tabel. Jika ada perbedaan ukuran untuk masing-masing tabel lebih besar dari .. biarkan saja katakanlah, 10%, saya akan menjalankan dbcc yang dapat dibersihkan.

Kode saya untuk mengulang ukuran tabel terlihat seperti itu:

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;

Sekarang Anda hanya perlu membangun logika yang akan memverifikasi apa yang akan berubah ukuran sepanjang minggu dan menjadwalkannya.

Marian
sumber
Sekarang, jika ada alasan untuk mencurigai ketidakakuratan dalam laporan ukuran tabel, Anda harus menggunakan DBCC UPDATEUSAGE (ini akan memperbaiki jumlah baris dan halaman). Senang bisa membantu!
Marian