gifts2017

Просмотр структуры БД, парсинг запросов SQL

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

Получение некоторых данных о БД и сеансе, просмотр внутренней структуры таблиц БД 1С в SQL, "перевод" запросов SQL в терминологию 1С. Чуть больше, чем "ПолучитьСтруктуруХраненияБазыДанных"; чуть удобнее, чем аналоги; чуть другая, чем КИП.

Обработка делалась "для себя" как инструмент, необходимый любому разработчику и внедренцу больших "тяжёлых" конфигураций и БД. Так, при написании конфы на 1000+ пользователей приходится уже думать об анализе узких мест по всей строгости теории тов. Филиппова, Богачёва и иже с ними. Не буду пересказывать приёмы работы, на то есть хорошие методические статьи (вроде http://infostart.ru/public/291874/). Речь о практике и особенностях предложенного инструмента.

Разумеется, есть Корпоративный инструментальный пакет, где ЦУП, и нагрузочное тестирование, и прочие плюшки, но его надо разворачивать и подключать, да и денежек он стоит. Если вдруг надо быстро "поймать" затруднение там, где КИПа нет и может вообще не быть, нужно что-то проще и мобильнее.

Конечно, есть внешние обработки, и таковых на ИС много, что пользуются системной функцией "ПолучитьСтруктуруХраненияБазыДанных" и всё красиво показывают. Но - эта функция не показывает всё "по правде". Что с включённой нотацией запросов, что без. Она не покажет SimpleKey регистра сведений, DataSeparationHash (общий разделитель учёта), некоторые другие служебные поля, которые очень даже могут играть роль. Кроме того, большинство обработок показывает все таблицы в одну кучу (не путать с понятием sql, хе-хе), и найти в списке таблиц некую Reference425 бывает трудновато, а если интересует конкретное поле, некое Fld666, так и вовсе сплошь неудобно. Хотя, не спорю, есть красивые решения.

Не удалось найти решение, которое бы показывало свойства индексов. Если плохо искал, киньте в меня тапочком.

Что сделал я? Слегка расширенный аналог. Он базируется как на получении структуры средствами 1С, так и на прямых запросах к представлениям системных данных, т.е., например, к sys.tables. Прикрутил, тоже запросом, получение некоторых общих сведений (от версии SQL до SPID, который лень лазить смотреть, или модели архивации БД). А потом сбылась заветная мечта: для текстов запросов, взятых, например, из профайлера, я сделал простенький интерпретатор, который парсит их и переводит большинство термов и названий в понятийную модель 1С и конкретные имена объектов конфигурации. И, ура, наконец-то можно видеть, где будет поиск по кластерному индексу, где по некластерному, а какие поля запроса ваще не индексированы. И щелчком по гиперссылке таблицы можно посмотреть её структуру. Парсинг, конечно, примитивный, ещё есть куда докручивать, но уже приятно. КИП, насколько знаю, именно такие вещи не переводит, ему XML Showplan подавать надо, хотя могу ошибаться.

Вдобавок, сделал именно поиск. Поиск по имени таблицы, по имени поля, по их сочетанию. В том числе нечёткий. После этого понять, что _Fld234 это ИНН контрагента, стало минутным делом. Формат запросов: *[ИмяТаблицы].[*ИмяПоля]. Историю запросов помнит и восстанавливает.

В планах: сделать автоматическую составлялку настроек для трассировки (докопаться до её xml-устройства и скармливать профайлеру), ну и возможно более красивый и полный разбор результатов трассировки. И ещё сделать показ значений параметров, что идут на вход нативным запросам, т.к. @P1 это совсем неинформативно.

Разрабатывалось на 1С 8.3.6 и SQL 2008.

Кому пригодится - будет хорошо.

P.S. Проблему, описанную тут https://habrahabr.ru/post/220863/ не забарывал, и думаю, что можно просто по Order'у попробовать состыковать с порядком в метаданных, да и взять как есть.

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

Наименование Файл Версия Размер
СтруктураБД 112
.epf 22,39Kb
26.02.16
112
.epf 22,39Kb Скачать

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Роман Осадченко (cleaner_it) 29.02.16 14:44
Хорошая задумка и реализация)
2. Яков Коган (Yashazz) 29.02.16 21:49
Слушайте, а правда, неужели нет аналогов на ИС, которые бы показывали, например, кластерный ли индекс, уникальный ли? Или я искал хреново?
3. Антон Стеклов (asved.ru) 01.03.16 07:02
TrustedConnection=Yes приводит к попытке windows-авторизации на SQL. Если логин USR1CV8 таким правом не обладает (а исходя из соображений безопасности - и не должен), то при попытке подключения вылезает исключение.
4. Антон Стеклов (asved.ru) 01.03.16 07:07
P.S. Проблему, описанную тут https://habrahabr.ru/post/220863/ не забарывал

Это не проблема, а закономерная трудность, возникающая у изобретателей велосипедов на квадратных колесах вроде автора статьи с хабра.

и думаю, что можно просто по Order'у попробовать состыковать с порядком в метаданных, да и взять как есть

Да.
5. Антон Стеклов (asved.ru) 01.03.16 07:10
PS а вот если оператор обладает правом windows-логина на SQL, то запросы в SQL приятнее будет делать с клиента.
6. Артур Аюханов (artbear) 01.03.16 12:10
И, ура, наконец-то можно видеть, где будет поиск по кластерному индексу, где по некластерному, а какие поля запроса ваще не индексированы.

На картинках не увидел эту фичу.
Расскажи про нее.
7. Яков Коган (Yashazz) 01.03.16 19:42
(3) asved.ru, да, есть такой момент. Собираюсь его допиливать.
(5) ага. Только мне потестить не на чем.
(6) цветовая разметка. Я смотрю, в каких индексных таблицах есть поле, и если это кластерный, то зелёный, иначе синий. Разумеется, это не полномасштабная схема плана, каковую анализирует КИП, но пока хоть так.
8. Serj (Serj1C) 02.03.16 10:17
Проблему с перечислениями я решил просто. Завел регистр сведений ЗначенияПеречислений (Измерения: ИмяПеречисления, Порядок, Ссылка; Ресурсы: Значение, Синоним)
Завел регламентное задание, которое это регистр заполняет/перезаполняет:

Процедура Заполнить() Экспорт
	
	Менеджер = РегистрыСведений.ЗначенияПеречислений.СоздатьНаборЗаписей();
	
	Для Каждого Эл Из Метаданные.Перечисления Цикл
		Для Каждого Зн Из Эл.ЗначенияПеречисления Цикл
			Стр = Менеджер.Добавить();
			Стр.ИмяПеречисления = Эл.Имя;
			Стр.Порядок = Эл.ЗначенияПеречисления.Индекс(Зн);
			Стр.Значение = Зн.Имя;
			Стр.Синоним = Зн.Синоним;
			Стр.Ссылка = Перечисления[Стр.ИмяПеречисления][Стр.Порядок];
		КонецЦикла;
	КонецЦикла;
	Менеджер.Записать();
	
КонецПроцедуры

Процедура Очистить() Экспорт
	
	Менеджер = РегистрыСведений.ЗначенияПеречислений.СоздатьНаборЗаписей();
	Менеджер.Записать();
	
КонецПроцедуры
...Показать Скрыть


И в прямых запросах могу спокойно делать соединения по ссылке и получать нормальные значения
9. Вячеслав (slawa) 02.03.16 12:45
Не смог подключиться
В чем может быть проблема? Спасибо.
Задал настройки получил ошибку (скриншот № 1) Причем тут USR1CV8 ?
Под sa подключаюсь нормально (№ 2)
Далее точка останова и строка подключения


Прикрепленные файлы:
10. Александр Полетаев (Alias) 02.03.16 13:21
(9) Да, такая же фигня. См (3) и (7). Нужно закомментировать "|Trusted_Connection=Yes;" несколькими строчками выше.