понедельник, 15 июня 2015 г.

Узнать размеры таблиц 1С в базе MS SQL

Дано: База 1С SQL, надо разобраться, отчего она растет, как на дрожжах.
Поскольку это 1С - имеются сотни таблиц, перебирать которые вручную никакого желания нет.
 
Решение 1.
http://blog.imageofyou.ru/2011/11/09/all-tables-size/ 
Понадобилось мне тут давеча оценить размер таблиц в базе данных одного из наших клиентов. Еще со времен SQL Server 2000 я знаю про процедуру sp_spaceused, но она хороша только для случая, когда нужен размер лишь одного объекта – конкретной таблицы или же всей БД целиком. А для того, чтобы посмотреть размер каждого объекта (например, для того, чтобы найти аномально большие таблицы) приходилось извращаться с курсором и сохранением результата выполнения процедуры во временной таблице. Не самый изящный способ.
С появлением в SQL Server 2005 data management views эту задачу стало возможно решить с помощью всего одного запроса (без курсоров, временных таблиц и прочей “экзотики”).

 
select  t.name as TableName, Min(t.create_date) as CreateDate, ds.name as FileGroupName, SUM(u.total_pages) * 8 / 1024 as SizeMB 
from sys.tables as t
inner join sys.partitions as p on t.object_id = p.object_id
inner join sys.allocation_units as u on p.partition_id = u.container_id
inner join sys.data_spaces as ds on u.data_space_id = ds.data_space_id
group by t.name, ds.name
order by SizeMB desc
 

Решение 2
http://mainview.ru/raznoe/sql-mysql/kak-najti-samye-bolshie-tablicy-v-baze-dannyx-ms-sql 

USE [DatabaseName]
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))
SET NOCOUNT ON
INSERT #temp
EXEC sp_msforeachtable 'sp_spaceused ''?'''
SELECT a.table_name,
a.row_count,
COUNT(*) AS col_count,
a.data_size
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
 
Альтернативные варианты: искать обработки с инфостарта, писать самому, получить демонстрационный доступ на сервисе gilev.ru

2 комментария:

Unknown комментирует...

И эти два метода дают весьма различные результаты.

Коршунов Евгений комментирует...

У меня расхождение - пара десятков мегабайт, для поиска самых пухлых таблиц некритично.