Чи є надійний спосіб визначити, коли слід запустити DBCC CLEANTABLE для відновлення місця?


11

Останнім часом, замість того, щоб просто нарощувати файли, коли вони майже на 80% використовують файли, я проявляю більшу активність у відновленні місця за допомогою звичайних хитрощів, таких як дефрагментація купи, додавання та випадання кластерних індексів, реалізація стискання рядків чи сторінок тощо.

Однак є кілька випадків, коли мені вдалося повернути ще більше місця, виконавши DBCC CLEANTABLE . Зі сотнями баз даних в моєму середовищі неможливо дізнатися, що роблять користувачі в кожному з них, і цілком прийнятно, що відбудуться зміни, пов’язані з випаданням стовпців фіксованої довжини. Я зазвичай знаходив ці можливості, переглядаючи кількість рядків та кількість сторінок у написаних сценаріями використання об'єктного простору. Я хотів би зробити цей крок далі, намагаючись автоматизувати виявлення подібних сценаріїв.

Що я хотів би знати, якщо хтось там активно відстежує такі можливості, і якщо так, то що саме ви шукаєте?

Мої думки полягали в тому, щоб написати щось уздовж рядків зібрання максимального та мінімального розміру рядка, кількості рядків у таблиці, кількості виділених сторінок та кількості використаних сторінок, а потім зробити деяку основну математику для реєстрації результатів, які знаходяться поза межами того, що було б "очікуваним".


Настійно рекомендую використовувати параметр batch_size у великих таблицях. Це призведе до запуску команди в серії транзакцій на відміну від однієї гігантської транзакції.
datagod

Відповіді:


11

Я вирішував би цю проблему - це щотижня виконувати завдання, яке запускатиме sp_spaceused для всіх таблиць у базі даних та зберігає ці дані в таблиці. Якщо є різниці в розмірах для кожної таблиці більше, ніж..let's..10%, я би запустив dbcc cleantable.

Мій код для перегляду розмірів таблиці виглядає так:

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;

Тепер вам потрібно лише побудувати логіку, яка перевірить, якою буде зміна розміру протягом тижня, і заплануйте його.


Тепер, якщо є причини підозрювати неточності у звітах про розмір таблиці, слід перейти до оновлення DBCC (це виправить кількість рядків і сторінок). Радий допомогти!
Маріан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.