Alan kazanmak için DBCC CLEANTABLE'ı ne zaman çalıştırmanız gerektiğini belirlemenin güvenilir bir yolu var mı?


11

Son zamanlarda, sadece% 80'e yakın dosya kullanımında dosyaları büyütmek yerine, yığınları birleştirmek, kümelenmiş dizinler eklemek ve bırakmak, satır veya sayfa sıkıştırması uygulamak vb.

Ancak, DBCC CLEANTABLE'ı çalıştırarak daha fazla alan kazanabildiğim birkaç durum var . Ortamımdaki yüzlerce veritabanıyla, kullanıcıların her birinde ne yaptığını bilmek mümkün değildir ve sabit uzunluktaki sütunların bırakılmasıyla ilgili değişikliklerin olması tamamen kabul edilebilir. Bu fırsatları genellikle yazdığım bazı nesne alanı kullanım komut dosyalarında satır sayılarına ve sayfa sayılarına bakarak buldum. Bu tür senaryoların algılanmasını otomatikleştirmeye çalışarak bunu bir adım daha ileri taşımak istiyorum.

Bilmek istediğim şey, dışarıdaki biri bu tür fırsatları aktif olarak izliyorsa ve eğer öyleyse, özel olarak ne ararsınız?

Düşüncelerim, bir satırın maksimum ve minimum boyutunu toplama çizgileri, tablodaki satır sayısı, ayrılan sayfa sayısı ve kullanılan sayfa sayısı hakkında bir şeyler yazmak, ardından sonuçları kaydetmek için bazı temel matematik işlemleri yapmaktı. ne de "beklenen" dışında.


Büyük tablolarda batch_size parametresini kullanmanızı şiddetle tavsiye ederim. Bu, komutun bir dev işlem yerine bir dizi işlemde çalışmasına neden olur.
datagod

Yanıtlar:


11

Bu sorun için düşünürüm çözüm , bir veritabanındaki tüm tablolar için sp_spaceused çalışacak bir iş çalıştırmak ve bu verileri bir tabloya kaydetmektir. Her tablo için boyut farklılıkları varsa ... let's say..10%, ben dbcc cleantable çalıştırın.

Tablo boyutları arasında döngü kodum şöyle görünüyor:

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;

Şimdi sadece hafta boyunca boyut değişikliğinin ne olacağını doğrulayacak ve planlayacağınız mantığı oluşturmanız gerekir.


Şimdi, tablo boyutu raporlarındaki yanlışlıklardan şüphelenmek için nedenler varsa, DBCC GÜNCELLEME (bu satır ve sayfa sayılarını düzeltir) için gitmelisiniz. Yardım etmekten memnun oldum!
Marian
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.