вторник, 7 февраля 2012 г.

SQL Server. Определение размера таблиц в БД

У меня иногда возникает необходимость найти наиболее "тяжелые" таблицы в той или иной базе данных, и их удалить. Нет, я не сошел с ума, просто иногда требуется создать "маленькую и шуструю" копию той или иной БД, в которой нет ничего лишнего. Можно, конечно, выбирать только нужные таблицы и переносить их в новую БД выборочно, но это получается дольше и требует больших усилий. Этот вариант я рассматривать не буду.
А вот для выбора тех таблиц, которые нужно удалить, есть чудо-процедура sp_spaceused, но этой заразе нужно передавать имя таблицы в качестве параметра. Можно, конечно, совместить ее с sp_msForEachTable и результат становится более или менее приемлимым, но остаются минусы - например, оно возвращает все "цифры" как varchar, из-за чего сортировка становится не очень удобной. В общем, я просто оставлю это здесь:

(раньше здесь была большая портянка, стыренная отсюда, но, благодаря Алексею Нестерову, всё стало намного лучше)

declare @t table (name varchar(255), row varchar(255), reserved varchar(255), data varchar(255), index_size varchar(255), unused varchar(255))

insert into @t
exec sp_msforeachtable N'exec sp_spaceused ''?'''

select * from @t
where CONVERT(bigint,REPLACE(data,' KB','')) > 10000
order by CONVERT(bigint,REPLACE(data,' KB','')) DESC