gifts2017

Определение размера базы данных 1С с разбивкой по объектам метаданных

Опубликовал Евгений (Amedis) в раздел Администрирование - Статистика базы данных

Обработка позволяет определить размер каждого объекта 1С и показывает размеры реальных таблиц базы данных, его формирующих.

Не раз приходилось мне объясняться с нашим системным администратором по вопросу неожиданного роста базы данных. И вот наконец решил больше не гадать о причинах  и написал такой инструмент. 

Идея очень проста:

1. Вводим строку подключения к серверу баз данных. Нажимаем кнопку "Заполнить структуру БД".

1. Строится дерево метаданных и реальных таблиц в которых хранятся объекты.

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

3. Полученные данные о размере выводятся в дерево метаданных, суммируются итоги.

4. Изучаем, идем разговаривать с админом))))

Опробовано на MS SQL Server 2008.

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
РазмерТаблицБазыДанных.epf
.epf 12,96Kb
17.05.12
708
.epf 12,96Kb 708 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. cmd_vasec (cmd_vasec) 17.05.12 15:43
2. Оксана Андреянова (andreyanova) 17.05.12 16:21
Чего то не могу к базе данных на сервере подключится. Для входа на сервер какое имя и пароль использовать? С которыми входишь на sql-сервер?
3. Оксана Андреянова (andreyanova) 17.05.12 16:47
{Форма.Форма.Форма(120)}: Ошибка при вызове метода контекста (NextRecordset)
RS = RS.NextRecordset();
по причине:
Произошла исключительная ситуация (ADODB.Recordset): Текущий проводник не поддерживает возврат нескольких наборов записей в результате одной операции.
4. Andrey Dyak (electronik) 18.05.12 09:25
Ну ну интересно интересно. Обьработка судя по скринам мега полезная но нету денег как появятся обязательно скачаю
5. Сергей Силантьев (sils) 18.05.12 12:34
Дайте пример строки соединения с SQL-базой
6. Константин Урсалов (kursaloff) 18.05.12 13:22
Пример строки запроса

Тоже вылезала ошибка на RS = RS.NextRecordset(); пока не изменил поставщика на SQL Server Native Client 10.0 - с ней заработала.

Provider=SQLNCLI10.1;Integrated Security=SSPI;Persist Security Info=False;User ID="";Initial Catalog=database_name;Data Source=server-addres;Initial File Name="";Server SPN=""

спасибо за обработку давно искал (+)
7. Евгений (Amedis) 18.05.12 14:01
Я подключаюсь через MS OLE DB Provider for SQL Server.

Строка подключения выглядит так:
Provider=SQLOLEDB.1;Persist Security Info=False;User ID=username;Password=pass;Initial Catalog=databasename;Data Source= SERVER
Xershi; CratosX; sils; +3 Ответить 2
8. zero_nv (Zero_nv) 23.05.12 12:55
Спасибо, очень помогла. Размер базы удалось уменьшить с 7.1 Гб до 5.7 Гб (оказывается кадры загрузили весь кладр)
9. Евгений (Amedis) 23.05.12 13:56
Пожалуйста))) Рад что смог помочь!

У нас как-то при очередном обновлении УПП база выросла на 20 Гб.
Как потом разобрались причиной послужило автоматическое включение типового механизма версионирования.
FraerFFSG; Rustig; +2 Ответить
10. dka80 ~ (dka80) 23.05.12 14:22
{Форма.Форма.Форма(120)}: Ошибка при вызове метода контекста (NextRecordset)
RS = RS.NextRecordset();
по причине:
Произошла исключительная ситуация (ADODB.Recordset): Текущий поставщик не поддерживает возврат нескольких наборов записей в результате выполнения одной операции.

Строка подключения:
Provider=SQLOLEDB.1;Persist Security Info=False;User ID=user;Password=pass;Initial Catalog=cat;Data Source=server

Поставщика на SQL Server Native Client 10.0 в списке нет
11. Константин Урсалов (kursaloff) 01.06.12 11:34
(10) dka80, тоже бьюсь над этой проблеммой .
такая ошибка вылетает иногда причем я заметил только на больших таблицах. И выпадает она именно из за того, что когда выполняется sp_spaceused иногда происходит конфликт блокировок в итоге селект не возвращает ничего и 1С вылетет .

Пытаюсь бороться с этим уже недели и в транзакции запускал и время соединения (таймаут) увеличивал, все равно иногда вылетает.:( :(
Очень обидно так как эту замечательную обработку настроил так чтобы она выгружала информацию о статистике в отдельно стоящую базу, в которой накапливаются данных о наших 15 информационных базах. В итоге наконец то получил общую статистику по размерам. Теперь бы сделать так чтобы сбор статистики работал стабильно, чтобы можно было ее запускать регулярно.

Вопрос к автору. Во первых огромное спасибо за обработку и во вторы можно ли с Вами как то связаться е-майл, телефон, скайп? Может постараемся как то совместно решить данную проблему? Я очень заинтересован в развитии данной обработке и думаю что сделаю следующие дополнительные опции:
1) Выгрузка данных в отдельно стоящее хранилище - простенькая БД с табличками Сервер, БазаДанных, Таблица1С_СКЭЛЬ, ЛогРазмеров на каждую дату.
2) Дополнительно хочу сделать выгрузку по каждой таблице размера индекса и статистике их использования, по аналогии с таблицами получать данные по DM_DB_INDEX_OPERATIONAL_STATS,DM_DB_INDEX_USAGE_STATS, sp_MSindexspace
3) накапливание статистики по рекомендуемым индексам в БД
12. Игор Мудрицкий (Zas1402) 05.06.12 14:45
{Форма.Форма.Форма(120)}: Ошибка при вызове метода контекста (NextRecordset)
RS = RS.NextRecordset();
по причине:
Произошла исключительная ситуация (ADODB.Recordset): Текущий проводник не поддерживает возврат нескольких наборов записей в результате одной операции.


аналогичная ситуация
13. Константин Урсалов (kursaloff) 05.06.12 14:45
Урааа!!!!!!! Две недели бился :)
кажется решил проблему с таймаутом и ошибкой Текущий поставщик не поддерживает возврат нескольких наборов записей в результате

попробуйте изменить следующее:
RS = Новый COMОбъект("ADODB.Recordset");
cmd = Новый COMОбъект("ADODB.Command");
cmd.ActiveConnection = Connect;
cmd.CommandText = СтрЗаменить(ШаблонЗапроса,"%ИмяТаблицы%",Строка.ТаблицаSQL);

//Добавляем информацию о тамймауте.
cmd.CommandTimeout=360;

Попытка

//при вызове рекодсета так - он не использует настройки таймаута.
//RS.Open(СтрЗаменить(ШаблонЗапроса,"%ИмяТаблицы%",Строка.ТаблицаSQL), Connect);

//Вызываем рекордсет через RS=cmd.Execute(); RS=cmd.Execute();
Исключение
Сообщить(ОписаниеОшибки());
Сообщить("------------------");
сообщить(СтрЗаменить(ШаблонЗапроса,"%ИмяТаблицы%",Строка.ТаблицаSQL));
КонецПопытки;
jk107; ivanleb; CratosX; AnderWonder; гвость; +5 Ответить
14. Константин Урсалов (kursaloff) 05.06.12 14:50
Для информации - мой вариант запроса по размерам таблицы.
1) Была проблема когда параллельно выгружаешь данные из нескольких баз а временная таблица одна. Для каждой базы нужно создавать таблицу со своим имененм. Переменная должна быть инициализирована выше.
2) Добавил перед началом удаление таблицы если она существует.
3) Если по каким то причинам запрос вылетает (у меня иногда бывает, когда запускаешь в консоли - конфликты блокировок, сделал так чтобы команда выполнялась 30 раз в цикле, если возникает какая то проблема.


	ШаблонЗапросаУдаления="if exists (select * from tempdb.dbo.sysobjects where id = object_id('tempdb..[#t_"+ИмяБазыДанных+"]') ) drop table #t_"+ИмяБазыДанных+";";    
	ШаблонЗапроса =   "
	|SET NOCOUNT ON;
	|declare @sucess int;
	|declare @count int;
	|set @sucess=0;
	|set @count=0;
	|WHILE @sucess = 0 and  @count<30 
	|BEGIN
	|	BEGIN TRY 	
	|		BEGIN TRANSACTION;
	|		"+ШаблонЗапросаУдаления+"
	|		CREATE TABLE #t_"+ИмяБазыДанных+"([Name] varchar(255), [TableRows] varchar(255), [SizeReserved] varchar(255), [DataSize] varchar(255), [IndexSize] varchar(255), [Unused] varchar(255));
	|		INSERT INTO #t_"+ИмяБазыДанных+"
	|		exec  sp_spaceused N'%ИмяТаблицы%','true';
	|		SELECT * FROM #t_"+ИмяБазыДанных+" ORDER BY CONVERT(bigint, REPLACE([SizeReserved], ' KB', '')) DESC;
	|		"+ШаблонЗапросаУдаления+"  
	|		set @sucess=1;
	|		COMMIT TRANSACTION;
	|	END TRY 
	|		BEGIN CATCH 
	|			set @count=@count+1;
	|			WAITFOR DELAY '00:00:05';
	|		END CATCH 
	|END ";

...Показать Скрыть
15. Алексей 1 (AlX0id) 19.06.12 11:17
Отличная весчь, спасибо :)
16. Алекс Ю (AlexO) 19.06.12 11:39
Вы получаете только таблицы с ссылками на объекты. Сколько реально данных и их объем по объектам метаданных (хоть документ, хоть - регистр), вы и близко не получаете.
реальных таблиц в которых хранятся объекты.

В 1с практически нет связей "один объект - одна таблица" (только для самых примитивных "объектов" - которые представлены примитивными типами данных). Это не реляционная система хранения данных. Чтобы получить объем данных по объекту - нужно по ссылкам найти все завязанные на этот объект данные по всем смежным таблицам.
А вы просто получате данные по списку объектов, который, собственно, вы можете получить любым списком в 1С, а не по самим объектам. И умножить на вес полей в таблице хранения - и получите тот же самый объем таблицы хранения ссылок.
17. Евгений (Amedis) 19.06.12 12:01
(16) AlexO, изучите обработку повнимательнее.
Для каждого объекта выводятся таблицы SQL в которых он хранится.
Регистр - Основная, Итоги.
Документ, Справочник - Основная, Табличные части.

Для каждой реальной таблицы определяется ее размер средством запроса к SQL серверу.

Не понятен крик Вашей души... Что не так?
18. Алекс Ю (AlexO) 19.06.12 12:04
(17) Amedis,
т.е. вы даже не занете, как ваша обработка работает?
и что даже на скриншоте у вас - одна таблица к каждому объекту и вес/количество записей в ней?
19. Евгений (Amedis) 19.06.12 12:16
(18) AlexO, вы даже скриншот внимательно не посмотрели))))
и вот что там нарисовано:

Регистр накопления "Денежные средства к списанию"
Таблицы: Итоги (_AccumRGT20896)
Основная (_AccumRG20889)
Регистрация изменений (_AccumRGChng20897)

Что вы имели ввиду?
и что даже на скриншоте у вас - одна таблица к каждому объекту и вес/количество записей в ней?
20. Andriy And1812 (and1812) 22.06.12 11:56
А как определить размер таблиц для файловой базы?
21. Вася Гнобин (testmode) 22.06.12 12:45
(10) dka80, SQL Server Native Client 10.0 может и отсутствовать на клиенте, если только вы не ставили его специально, по умолчанию он отсутствует, как выход - переделать на встроенный SQL Server, разницы не будет ни какой.
22. Евгений (Amedis) 22.06.12 13:37
(20) and1812, для файловых баз есть такая утилита
http://infostart.ru/public/82178/
mailrum2004; +1 Ответить
23. nanik nanik (nanik) 08.07.12 02:44
(7) Amedis, вырос объем базы, и были только несколько предположений, с помощь обработки все подтвердил. Есть один удаленный филиал, объем с которым осуществляется по электронной почте, в результате отсутствия связи файл обмена вырос и они хранились в самой БД.
24. Роман Гаманец (_Ramzes) 26.07.12 00:41
Интересная обработка
У меня при формировании выдала ошибку:

Не удалось соединиться с SQL - сервером
{Форма.Форма.Форма(93)}: Ошибка при вызове метода контекста (Open): Произошла исключительная ситуация (Microsoft OLE DB Provider for SQL Server): Ошибка входа пользователя "sa".

Ошибку удалось обойти выбрав сохранить пароль.
26. Борис Скворцов (gaglo) 03.09.12 10:37
Работает. Может пригодиться.
Безвариантное представление информации - только дерево, ни фильтров, ни смены сортировки, но это легко решаемо.
Надобность вручную вписать строку подключения напрягла, но не сильно, минут на 5.
А вот что хотелось бы сразу видеть в статье - что запускать обработку надо в той же базе, для которой берешь статистику... А то я было разогнался в другую базу, мол, всё равно строку подключения целиком пишу ;-]
27. Алекс Ю (AlexO) 04.12.12 13:18
(19) Amedis,
Что вы имели ввиду?

то, что у вас один объект - одна таблица, и подсчет только по этой таблице. А в 1С такого не бывает - чтобы объект занимал одну таблицу (документ там, или справочник; понятно, что можно получить "вес" всех записей регистра - но какое это имеет отношение к "весу", скажем, документов?).
В 1С данные по объектам "размазаны" по базе, а не в одной таблице находятся.
28. Алекс Ю (AlexO) 04.12.12 13:24
(19) Amedis,
вы одного не поймете - что чтобы получить объем, например, определенного вида документов, нужно оценить все таблицы как самих документов, так и их взаимодействие: проводки по регистрам (что вы и оцениваете как "вес объекта"), использование данных (и создание под это новых структур хранения в базе - т.е. увеличение занимаемого базой места) из них в других объектах и т.д.
29. Евгений (Amedis) 05.12.12 06:25
(28) AlexO,
Вы тестировали обработку ? Сравнивали полученный результат с размером файла базы данных?
Один в один они конечно не сойдутся, всегда будет отличие на объем служебных таблиц.

Скачайте, сравните, потом претензии....
Designer1C; +1 Ответить
30. Serg Kondrasgov (SergDi) 16.01.13 19:44
полезно будет узнать что базу занимает больше всего :)
31. Трактор Трактор (Трактор) 20.02.13 10:08
Грех не плюсануть наследника Базопузомера!
Однако воспользоваться обработкой не смогу. У меня нет MsSQL. Пользую PostgreSQL.
32. Сергей Зеленовский (zels) 19.07.13 13:31
33. Александр К. (AlexK_2012) 09.10.13 18:01
в базе из 122Gb из 153Gb занимает регистр сведений "Версии объектов"
О чем это может говорить и можно ли его урезать каким-то образом?
34. Сергей Галюк (dj_serega) 04.11.13 19:03
Большое спасибо.
Не один раз уже выручала после скачивания.
Правда на некоторые SQL не удалось подключиться.
35. Наталья (Natali_77) 24.02.14 16:51
А если база не SQL, как узнать размер таблиц?
36. Сергей Галюк (dj_serega) 14.04.14 11:40
Время от времени так и выручает.
37. Виктор Маркевич (warrior1985) 10.07.14 10:32
Напишите пожалуйста как подключиться. Не умею эту строку подключения создавать(
38. Василий Коровин (vasyak319) 11.03.15 18:54
Раз уж на форме есть кнопка справки, то неплохо бы засандалить в неё что-нибудь полезное. Например, образец строки соединения.
39. Xer shi (Xershi) 30.11.15 10:28
(7) Amedis, да заработало. Пытался ввести доменный логин и пароль, затем пароль пользователя базы 1С с полными правами. Выкидывало в ошибку. Затем поставил чекбокс в NT и все само заработало!
40. Xer shi (Xershi) 30.11.15 10:30
Вам на заметку!
Сейчас идет полное считывание данных, а мне нужно только по нескольким таблицам метаданных. Было бы удобно, если бы был фильтр на считывание только этих данных!
41. Xer shi (Xershi) 30.11.15 10:39
А затем к этому всему еще и отчет на СКД прикрутить было бы замечательно.
42. Artem Korolev (tempa85) 20.05.16 18:47
Отличная штука ;) Автору мега респект!!! Xershi поддержу, отчет на СКД не помешал бы.
43. Виктор Ким (victorkim64) 05.08.16 04:02
Работает, Автору спасибо!
44. Kostya Konstantin (MrKonstantin) 28.09.16 14:55
Обработка хорошая и актуальная. Вот ещё б на управляемых формах её...
Shurgent; +1 Ответить
45. Ruslan ww (sir) 24.10.16 17:28
А если база на Управляемых, я ведь смогу к ней подключиться и получить статистику ?
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа