Эти занимательные временные таблицы

Публикация № 1217577

Администрирование - Производительность и оптимизация (HighLoad)

временные таблицы СУБД внутренняя работа платформа интересное

Кое-что интересное о временных таблицах и работе платформы 1С с ними.

Мы все их используем

Не важно - новичок Вы или опытный разработчик. Если когда-либо в работе приходилось создавать запросы, то с высокой долей вероятности в них хотя бы раз были использованы временные таблицы. Тот же экзамен "1С:Специалист по платформе" фактически требует их использования при решении задач на экзамене. Сегодня речь будет идти, внезапно, как-раз о временных таблицах и работе платформы 1С с ними.

Мы начнем с простых примеров работы с временными таблицами и действиями платформы на стороне СУБД. А закончим чем-то очень странным и неожиданным.

Для всех примеров и экспериментов использовалась платформа 1С:Предприятие 8.3.16.1063 в клиент-серверном режиме работы. В качестве СУБД выступал SQL Server 2017. Для изучения действий платформы использовались следующие инструменты:

Интересно? Добро пожаловать!

Примитивный пример

Временные таблицы рекомендуется использовать для создания стабильных и производительных запросов. В тексте запросов их создание выполняется с помощью ключевого слова "ПОМЕСТИТЬ" для пакета запроса.

ВЫБРАТЬ ПЕРВЫЕ 100
	Номенклатура.Ссылка КАК Ссылка,
	Номенклатура.Наименование КАК Наименование
ПОМЕСТИТЬ ВТ_Номенклатура
ИЗ
	Справочник.Номенклатура КАК Номенклатура
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	ВТ_Номенклатура.Ссылка КАК Ссылка,
	ВТ_Номенклатура.Наименование КАК Наименование
ИЗ                              
	ВТ_Номенклатура КАК ВТ_Номенклатура

Здесь в первом пакете запросов мы выбрали первые 100 элементов справочника "Номенклатура" и поместили их во временную таблицу "ВТ_Номенклатура". После чего во втором пакете мы получили данные из ранее созданной временной таблицы и вернули их как результат выборки. Все просто, не так ли?

Если взглянуть на происходящее на стороне СУБД, то мы увидим следующую серию запросов.

-- Проверка существует ли временная таблица с указанным именем
SELECT 
    1 
WHERE OBJECT_ID('tempdb..#tt36') IS NOT NULL					

-- Создание временной таблицы с зарезервированным именем и необходимой структурой
CREATE TABLE #tt36 (
    _Q_000_F_000RRef BINARY(16), 
    _Q_000_F_001 NVARCHAR(100) COLLATE DATABASE_DEFAULT
)					

-- Выполнение 1 пакета запроса для заполнения временной таблицы
INSERT INTO #tt36 WITH(TABLOCK) (_Q_000_F_000RRef, _Q_000_F_001) SELECT TOP 100
    T1._IDRRef,
    T1._Description
FROM dbo._Reference85 T1
WHERE (T1._Fld774 = @P1) -- Неявный отбор по разделителю данных

-- Получение данных из временной таблицы для результата запроса
SELECT
    T1._Q_000_F_000RRef,
    T1._Q_000_F_001
FROM #tt36 T1 WITH(NOLOCK)					

-- Очистка временной таблицы
TRUNCATE TABLE #tt36					

Тоже все относительно просто. Платформа 1С выполняет ряд простых шагов:

  • Проверка наличия временной таблицы с зарезервированным именем. Если существует, то будет удалена.
  • Создание временной таблицы.
  • Далее выполняет запрос из первого пакета для наполнения данных ранее созданной временной таблицы.
  • Вторым запросом получает данные из временной таблицы для результата выборки.
  • Очищает данные временной таблицы.

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

;

////////////////////////////////////////////////////////////////////////////////
УНИЧТОЖИТЬ ВТ_Номенклатура

Всегда ли платформа действует по таким правилам? Нет. Например, если выполнить этот же запрос еще раз, то количество выполняемых SQL-запросов будет меньше.

-- Выполнение 1 пакета запроса для заполнения временной таблицы
INSERT INTO #tt36 WITH(TABLOCK) (_Q_000_F_000RRef, _Q_000_F_001) SELECT TOP 100
    T1._IDRRef,
    T1._Description
FROM dbo._Reference85 T1
WHERE (T1._Fld774 = @P1) -- Неявный отбор по разделителю данных				

-- Получение данных из временной таблицы для результата запроса
SELECT
    T1._Q_000_F_000RRef,
    T1._Q_000_F_001
FROM #tt36 T1 WITH(NOLOCK)					

-- Очистка временной таблицы
TRUNCATE TABLE #tt36

Платформа увидела, что пустая временная таблица с необходимой структурой уже есть на стороне базы данных для текущего соединения с СУБД и не стала создавать ее заново. Эта оптимизация позволяет работать с временными таблицами наиболее эффективно, не создавая каждый раз их заново.

Также обратите внимание на проверку существования временной таблицы выше. Ранее редко, но метко, можно было нарваться на ошибку уже существующей временной таблицы с именем "#ttN'. Помню такое еще со времен 8.3.6. Теперь это более редкая проблема и это поведение одна из причин изменения ситуации.

Итак, создание временных таблиц выполняется довольно просто. Это относится как в части использования конструкции "ПОМЕСТИТЬ" в запросе, так и в части SQL-запросов платформы 1С. Даже переиспользование ранее созданных временных таблиц не усложняет пример. Но все ли так просто на самом деле?

Серийное производство

Усложним пример и создадим намного больше временных таблиц в запросе. Вот как это выглядит в контексте 1С.

 
 Длинный, длинный запрос...

Длинный запрос. В этом примере мы создали 3 временных таблицы, соединили их и результат поместили в четвертую, а после удалили часть временных таблиц и вернули результат. При этом для первых трех таблиц мы добавили индексы. Вот что мы увидим на стороне SQL Server.

 
 Длинный, длинный SQL-запрос...

Главным отличием от предыдущего примера является большее количество временных таблиц и манипуляций с ними. При этом принципы работы те же самые. Из нового стоит выделить создание индекса для временных таблиц. Фактически, это всегда кластерный индекс по указанному набору полей. Стоит ли всегда создавать индексы на временную таблицу? Об этом уже упоминалось в статье "Самые распространенные заблуждения об индексах в мире 1С", но если кратко, то "НЕТ". Добавлять индексы во временную таблицу нужно только при большом объеме данных и только на те поля, которые используются в соединениях или условиях отборов. Вот официальные рекомендации. И если при подготовке к экзаменам Вам говорят, что для временных таблиц всегда нужно добавлять индексы, то скорее всего это только в контексте экзамена.

В этом примере мы также рассмотрели как работает конструкции "УНИЧТОЖИТЬ". Фактически она также очищает существующую временную таблицу как это делает платформа автоматически при завершении запроса. Давайте пройдем дальше.

Самый лучший менеджер

Настало время еще более сложных примеров. Ранее мы создавали 3 временных таблицы в одном пакетном запросе. Платформе 1С также позволяет использовать менеджер временных таблиц, тем самым сохраняя временную таблицу между вызовами запросов. Этот прием часто используется при наличии сложной логики запросов к базе данных. Как же платформа работает с этим механизмом?

// Подготовим текст запроса
ТекстЗапроса = 
	"ВЫБРАТЬ ПЕРВЫЕ 1
	|	Номенклатура.Ссылка КАК Ссылка,
	|	1 КАК НомерМенеджераВТ,
	|	""ПРОВЕРКА"" КАК ПроизвольныйТекст,
	|	""Тест"" КАК ДругоеЗначение
	|ПОМЕСТИТЬ ВТ_Номенклатура
	|ИЗ
	|	Справочник.Номенклатура КАК Номенклатура
	|
	|ИНДЕКСИРОВАТЬ ПО
	|	Ссылка";

// Выполним запрос и поместим результат во временную таблицу.
// Для сохранения временной таблицы используем менеджер временных таблиц.
МенеджерВТ = Новый МенеджерВременныхТаблиц;
Запрос = Новый Запрос;
Запрос.Текст = ТекстЗапроса; 
Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
Запрос.Выполнить();

// Прочитаем данные из временной таблицы в менеджере ВТ
Запрос = Новый Запрос;
Запрос.Текст = 
	"ВЫБРАТЬ * Из ВТ_Номенклатура КАК Т";
Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
Результат = Запрос.Выполнить();		
Выборка = Результат.Выбрать();
Выборка.Следующий();	
Сообщить(Выборка.НомерМенеджераВТ);

// Очищаем данные менеджера временных таблиц
МенеджерВТ.Закрыть();

Здесь мы создали менеджер временных таблиц и присвоили его первому объекту запроса. Текст первого запроса написан таким образом, чтобы результат поместить во временную таблицу "ВТ_Номенклатура". Затем мы создали новый экземпляр запроса и прочитали данные из временной таблицы "ВТ_Номенклатура", которую сформировали ранее. Обращение к существующей временной таблице как-раз и возможно благодаря менеджеру временных таблиц. В завершении мы очистили все сохраненные данные в контексте менеджера ВТ. На стороне SQL Server это выглядит так.


-- Проверка существует ли временная таблица с указанным именем
SELECT 1 WHERE OBJECT_ID('tempdb..#tt50') IS NOT NULL					

-- Создание временной таблицы с зарезервированным именем и необходимой структурой
CREATE TABLE #tt50 (
        _Q_000_F_000RRef BINARY(16), 
        _Q_000_F_001 NUMERIC(1, 0), 
        _Q_000_F_002 NVARCHAR(8) COLLATE DATABASE_DEFAULT,
        _Q_000_F_003 BINARY(1))					

-- Создание кластерного индекса для временной таблицы
CREATE CLUSTERED INDEX idx50 ON #tt50 (_Q_000_F_000RRef)					

-- Выполнение 1 запроса для заполнения временной таблицы
INSERT INTO #tt50 WITH(TABLOCK) (_Q_000_F_000RRef, _Q_000_F_001, _Q_000_F_002, _Q_000_F_003) 
SELECT TOP 1
    T1._IDRRef,
    @P1,
    @P2,
    0x01
FROM dbo._Reference85 T1
WHERE (T1._Fld774 = @P3)	

-- Выполнение 2 запроса для чтения данных из временной таблицы
SELECT
    T1._Q_000_F_000RRef,
    T1._Q_000_F_001,
    T1._Q_000_F_002,
    T1._Q_000_F_003
FROM #tt50 T1 WITH(NOLOCK)					

-- Очистка данных в контексте менеджера временных таблиц
TRUNCATE TABLE #tt50	

Фактически, если выполнить все запросы без менеджера временных таблиц одним пакетом, то сформированные SQL-запросы будут те же самые.

ТекстЗапроса = 
	"ВЫБРАТЬ ПЕРВЫЕ 1
	|	Номенклатура.Ссылка КАК Ссылка,
	|	1 КАК НомерМенеджераВТ,
	|	""ПРОВЕРКА"" КАК ПроизвольныйТекст,
	|	""Тест"" КАК ДругоеЗначение
	|ПОМЕСТИТЬ ВТ_Номенклатура
	|ИЗ
	|	Справочник.Номенклатура КАК Номенклатура
	|
	|ИНДЕКСИРОВАТЬ ПО
	|	Ссылка
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ВТ_Номенклатура.Ссылка КАК Ссылка,
	|	ВТ_Номенклатура.НомерМенеджераВТ КАК НомерМенеджераВТ,
	|	ВТ_Номенклатура.ПроизвольныйТекст КАК ПроизвольныйТекст,
	|	ВТ_Номенклатура.ДругоеЗначение КАК ДругоеЗначение
	|ИЗ
	|	ВТ_Номенклатура КАК ВТ_Номенклатура";

Запрос = Новый Запрос;
Запрос.Текст = ТекстЗапроса;
Результат = Запрос.Выполнить();		
Выборка = Результат.Выбрать();
Выборка.Следующий();	
Сообщить(Выборка.НомерМенеджераВТ);

Таким образом, с помощью менеджера временных таблиц можно создать один раз временную таблицу и использовать ее в других запросах многократно. Удобно, эффективно, производительно. В типовых конфигурациях это используется повсеместно. Но есть интересные особенности как платформа 1С работает с временными таблицами при многопользовательской работе.

Срывая покровы

Еще несколько очевидных и не очень особенностей работы с временными таблицами.

Контекст и контроль доступности

Как известно, сервер 1С при работе с СУБД имеет пул соединений. Речь идет именно о пуле соединений с СУБД, а не кластером 1С. У Вас может быть 100 активных сеансов работы с информационной базой и 2 запущенных рабочих процесса (rphost'ы), но при этом соединений со SQL Server может быть 15. На каждый рабочий процесс свой пул соединений. Это все очень условно, но смысл должен быть понятен. То есть количество сеансов НЕ равно количеству соединений с базой данных. Использование пула соединений является очень эффективным и производительным подходом и тут все просто отлично.

Есть еще один нюанс. Создаваемые платформой 1С временные таблицы являются локальными. То есть они доступны только в рамках одного соединения с СУБД. Есть также и глобальные временные таблицы, но платформа их не использует. Таким образом, создание и использование временной таблицы происходит всегда в рамках одного соединения с СУБД.

Последнее еще интересней, если рассмотреть это в рамках использования менеджера временных таблиц. Если из кода встроенного языка создать менеджер временных таблиц и выполнять запросы с присвоением этого менеджера ВТ объекту запроса, то можно быть уверенным, что все они будут выполнены в рамках одного соединения с СУБД. Этот принцип как-раз и используется в рамках работы транслятора запросов из 1С в SQL.

Тут может показаться, что если в разных сеансах 1С создать менеджер временных таблиц, а в нем сохранить временную таблицу с одним названием, допустим, "ВТ_Номенклатура", то эта таблица будет доступна в разных сеансах, если они используют одно соединение с СУБД. На самом деле нет, т.к. платформа еще и сама контролирует доступность временных таблиц в разрезе сеансов и доступность в зависимости от контекста.

 
 Код в сеанса №1
 
 Код в сеанса №2

Во втором сеансе будет ошибка:

Таблица не найдена "ВТ_Номенклатура"
ВЫБРАТЬ * Из <<?>>ВТ_Номенклатура КАК Т

И это логично. Дело даже не в том, что это разные сеансы, а в том что это разные менеджеры временных таблиц. Использовать один менеджер временных таблиц в разных сеансах платформа не позволяет, а контроль доступности осуществляется именно в контексте менеджера ВТ.

Кэширование

Вы когда-нибудь кэшировали менеджер временных таблиц? В некоторых особых случаях Вы могли бы увидеть вот это.

 
 Текстовое содержимое ошибки

Как мы уже говорили выше, для работы менеджера временных таблиц резервируется конкретное соединение с СУБД. Пока менеджер временных таблиц существует, в переменной или в другом кэшированном виде, то для него зарезервировано соединение. Если по каким-либо причинам, например из-за циклических ссылок, платформа не сможет удалить менеджер ВТ и освободить соединение с базой данных, то появится именно такая ошибка. Вы можете воспроизвести ее самостоятельно вот таким образом.

&НаКлиенте
Процедура ОшибкаКэшированияВТ(Команда)
	
	ОшибкаКэшированияВТНаСервере();
	
КонецПроцедуры

&НаСервере
Процедура ОшибкаКэшированияВТНаСервере()
	
	// Инициализируем менеджер временных таблиц и выполняем запрос в его контексте
	МенеджерВТ = Новый МенеджерВременныхТаблиц;
	ТекстЗапроса = 
		"ВЫБРАТЬ ПЕРВЫЕ 1
		|	Номенклатура.Ссылка КАК Ссылка,
		|	1 КАК НомерМенеджераВТ,
		|	""ПРОВЕРКА"" КАК ПроизвольныйТекст,
		|	33 КАК ДругоеЗначение
		|ПОМЕСТИТЬ ВТ_Номенклатура
		|ИЗ
		|	Справочник.Номенклатура КАК Номенклатура
		|
		|ИНДЕКСИРОВАТЬ ПО
		|	Ссылка";	
	Запрос = Новый Запрос;
	Запрос.Текст = ТекстЗапроса; 
	Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
	Запрос.Выполнить();
	
	// Эмулируем появление циклической ссылки, чтобы после завершения серверного 
	// вызова платформа не смогла удалить менеджер ВТ
	Кэш1 = Новый Структура;
	Кэш1.Вставить("МенеджерВТ", МенеджерВТ);
	Кэш1.Вставить("СсылкаНаДругойКэш", Неопределено);	
	Кэш2 = Новый Структура;
	Кэш2.Вставить("МенеджерВТ", МенеджерВТ);
	Кэш2.Вставить("СсылкаНаДругойКэш", Неопределено);	
	Кэш1.СсылкаНаДругойКэш = Кэш2;
	Кэш2.СсылкаНаДругойКэш = Кэш1;
	
КонецПроцедуры

Как этого избежать? Нужно следовать простым правилам:

  1. НЕ кэшировать менеджер временных таблиц там, где кэш сохраняется между вызовами сервера.
  2. Быть осторожным с циклическими ссылками. В принципе, это относится не только к менеджеру ВТ, но и к любой разработке.
  3. Вместо кэширования менеджера ВТ подумать над архитектурой. Возможно кэшируемые в ВТ данные требуют особого хранения в базе для быстрого доступа.

Вот даже с таким можно встретиться.

Утопи меня в соединениях

И еще один эксперимент. Для каждого менеджера ВТ резервируются соединения с СУБД. Это мы уже говорили. Но это не значит, что на каждый созданный менеджер создается соединение с базой данных. Для эксперимента выполните в одном сеансе вот такой код.

	ТекстЗапроса = 
		"ВЫБРАТЬ ПЕРВЫЕ 1
		|	Номенклатура.Ссылка КАК Ссылка,
		|	1 КАК НомерМенеджераВТ,
		|	""ПРОВЕРКА"" КАК ПроизвольныйТекст,
		|	33 КАК ДругоеЗначение
		|ПОМЕСТИТЬ ВТ_Номенклатура
		|ИЗ
		|	Справочник.Номенклатура КАК Номенклатура
		|
		|ИНДЕКСИРОВАТЬ ПО
		|	Ссылка";
	
	КэшМенеджеровВТ = Новый Соответствие;	
	Для НомерМенеджера = 1 По 10000 Цикл
		
		МенеджерВТ = Новый МенеджерВременныхТаблиц;
		Запрос = Новый Запрос;
		Запрос.Текст = СтрЗаменить(ТекстЗапроса, 
			"1 КАК НомерМенеджераВТ", 
			XMLСтрока(НомерМенеджера) + " КАК НомерМенеджераВТ");
		Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
		Запрос.Выполнить();
		
		КэшМенеджеровВТ.Вставить(НомерМенеджера, МенеджерВТ);
		
	КонецЦикла;

Мы создали 10000 новых временных таблиц и менеджеров ВТ! Вы можете это проверить и на стороне СУБД с помощью скриптов, предложенных в конце статьи. Там же есть и скрипты для просмотра количества соединений с сервером баз данных. При этом новых соединений на каждый менеджер ВТ платформа не создала. Все потому что для обслуживания одного сеанса достаточно одного соединения с базой данных. Возможно, для этого правила есть исключения, но мы их сейчас рассматривать не будем.

Как сервер 1С заставить создать дополнительные соединения с БД? Откройте 10 сеансов 1С и запустите этот код в каждом сеансе. Барабанная дробь! Сервер 1С увеличит пул соединений с СУБД до 10 сеансов (может и больше, если ранее соединения уже были созданы). При этом стоит заметить, что пул соединений увеличивается не сразу после старта сеанса 1С, а именно во время создания менеджеров временных таблиц в каждом сеансе. Главное запустить этот код параллельно.

Таким образом, использование временных таблиц и менеджера ВТ может напрямую влиять на размер пула соединений сервера 1С с сервером баз данных.

Только не устраивайте этот спам временными таблицами на рабочем окружении. Поберегите сервер!

Другие заметки

Есть другие важные темы, связанные с использованием временных таблиц. Кратко упомяну о них, т.к. в статье рассматривать все темы просто невозможно:

В общем, TempDB и работа с ней требует внимания. И прежде чем упрекать платформу в медленной работе с базой данных - почитайте мануалы.

А теперь перейдем к чему-нибудь неожиданному.

Покажи мне свой товар

Как мы уже говорили ранее, локальная временная таблица (именно такие используются платформой 1С) на уровне СУБД доступны только тому соединению, в рамках которого она была создана. Мы никак не можем прочитать из одного соединения содержимое таблиц другого соединения. Например, Вы с помощью диагностических запросов нашли, что таблица "#tt555" участвует в подозрительном запросе и захотели посмотреть что в ней находится. Но SQL Server не позволит это сделать. Но, как говорится, если сильно хочется, то можно. И вот как!

Для наглядности мы будем немного изменять тексты запросов, которые генерирует платформа. Это только для наглядности. Все что Вы увидите ниже можно применять и на практике. И так, допустим платформа создала временную таблицу и наполнила ее данными во таким способом.

CREATE TABLE #ttTest (
    column1 BINARY(16), 
    column2 NVARCHAR(100) COLLATE DATABASE_DEFAULT
)

INSERT INTO #ttTest WITH(TABLOCK) (column1, column2) 
SELECT
    0x811FA45D36C581E411E8F9DCD58AB12F AS_IDRRef,
    'Этот текст должен видеть только администратор!' AS _Description

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

SELECT
    T.name,
    T.[object_id],
    AU.type_desc,
    AU.first_page,
    AU.data_pages,
    P.[rows]
FROM tempdb.sys.tables AS T
JOIN tempdb.sys.partitions AS P
    ON P.[object_id] = T.[object_id]
JOIN tempdb.sys.system_internals_allocation_units AS AU
ON  (
        AU.type_desc = N'IN_ROW_DATA'
        AND AU.container_id = P.partition_id
    )
    OR
    (
        AU.type_desc = N'ROW_OVERFLOW_DATA'
        AND AU.container_id = P.partition_id
    )
    OR
    (
        AU.type_desc = N'LOB_DATA' 
        AND AU.container_id = P.hobt_id
    )
WHERE T.name LIKE N'#ttTest%'; -- Здесь отбор по имени временной таблицы

Предположим, что результат мы получили следующий.

Имя временной таблицы Идентификатор объекта Тип данных Адрес первой страницы Количество страниц с данными Количество записей в таблице
#ttTest________00000000EAFD -1137577394 IN_ROW_DATA 0x481E01000800 1 1

Очень интересно :) Но что же это значит? Расшифруем.

  1. Имя временной таблицы (name) - это полное имя временной таблицы с учетом идентификатора соединения с базой данных. Именно благодаря такому формированию имени можно создавать временные таблицы с одинаковым именем в разных сессиях, т.к. по факту имена у них все же будут отличаться. Хоть последнее и не будет заметно при их использовании.
  2. Идентификатор объекта (object_id) - идентификатор объекта временной таблицы.
  3. Тип данных (type_desc) - какие данные хранятся в этом объекте. В нашем случае это таблица с записями.
  4. Адрес первой страницы (first_page) - адрес первой страницы. Это важная часть нашего эксперимента. В нашем случае это значение "0x481E01000800". Сохранен в виде 6 байтового значения, где каждый байт представлен двумя шестнадцатеричными символами. Для расшифровки нужно читать его справа на лево. Если его расшифровать, то получим следующее (для конвертации hex в число можно использовать этот сервис):
    • 00 08 - это идентификатор файла базы данных TempDB, где эта таблица сохранения. В нашем случае это 8.
    • 00 01 1E 48 - это идентификатор начальной страницы. В нашем случае это 73288.
  5. Количество страниц с данными (data_pages) - сколько страниц по 8 КБ занимает таблица.
  6. Количество записей в таблице (rows) - сколько записей во временной таблице.

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

DBCC TRACEON (3604); -- Вывод сообщений

-- Служебная процедура для работы со страницами
-- https://www.mssqltips.com/sqlservertip/1578/using-dbcc-page-to-examine-sql-server-table-and-index-data/
DBCC PAGE (
    tempdb, -- база данных
    8, -- Идентификатор файла
    73288, -- Идентификатор начальной страницы
    3) -- Как отобразить результат
WITH TABLERESULTS; -- Возвращаем результат в таблицу

В ответ мы получили большое количество записей. Вот последние 8. Остальные записи вида "BUFFER:" и "PAGE HEADER:" нас не интересуют, сразу перейдем к данным.

ParentObject Object Field VALUE
Slot 0 Offset 0x60 Length 119 Memory Dump @0x0000003EC487A060   0000000000000000:   30001400 811fa45d 36c581e4 11e8f9dc d58ab12f  0....¤]6Łä.èùÜÕŠ±/
Slot 0 Offset 0x60 Length 119 Memory Dump @0x0000003EC487A060   0000000000000014:   02000001 0077002d 0442043e 04420420 00420435  .....w.-.B.>.B. .B.5
Slot 0 Offset 0x60 Length 119 Memory Dump @0x0000003EC487A060   0000000000000028:   043a0441 04420420 0034043e 043b0436 0435043d  .:.A.B. .4.>.;.6.5.=
Slot 0 Offset 0x60 Length 119 Memory Dump @0x0000003EC487A060   000000000000003C:   04200032 04380434 04350442 044c0420 0042043e  . .2.8.4.5.B.L. .B.>
Slot 0 Offset 0x60 Length 119 Memory Dump @0x0000003EC487A060   0000000000000050:   043b044c 043a043e 04200030 0434043c 0438043d  .;.L.:.>. .0.4.<.8.=
Slot 0 Offset 0x60 Length 119 Memory Dump @0x0000003EC487A060   0000000000000064:   04380441 04420440 04300442 043e0440 042100    .8.A.B.@.0.B.>.@.!.
Slot 0 Offset 0x60 Length 119 column1 = [Binary data] Slot 0 Column 1 Offset 0x4 Length 16 Length (physical) 16   0000003EC487A064:   811fa45d 36c581e4 11e8f9dc d58ab12f           .¤]6Łä.èùÜÕŠ±/
Slot 0 Offset 0x60 Length 119 Slot 0 Column 2 Offset 0x1b Length 92 Length (physical) 92 column2 Этот текст должен видеть только администратор!

В предпоследней строке с описанием "column1 = [Binary data] Slot 0 Column 1 Offset 0x4 Length 16 Length (physical) 16" содержится значение идентификатора в первой колонке "811fa45d 36c581e4 11e8f9dc d58ab12f". В последней строке с описанием "Slot 0 Column 2 Offset 0x1b Length 92 Length (physical) 92" содержится значение второй колонки "Этот текст должен видеть только администратор!". 

Дело сделано! Мы прочитали содержимое временной таблицы другой сессии. Да, это не очень удобно в таком виде получать содержимое таблицы с большим количеством записей. Но здесь был продемонстрирован принцип, а инструменты для удобства можно создавать отдельно. Также есть и еще одно важное ограничение: использовать служебную процедуру "PAGE" можно только с правами "sysadmin". Это стоит учитывать в работе. То есть этот способ доступен только для администратора или разработчика с соответствующими правами.

А Вам слабо? :)

И немного диагностики

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

 
 Список всех временных таблиц
 
 Все соединения с СУБД
 
 Информация хранении временных таблиц
 
 Использующие TempDB сессии

Список не большой, но может пригодиться.

Будьте здоровы!

Временные таблицы - очень интересный объект и то как с ним работает платформа 1С. Конечно, мы не раскрыли тему полностью, но, надеюсь, что-нибудь интересное Вы нашли. Есть вопросы? Пишите в личные сообщения.

Спасибо за внимание и будьте здоровы!

Другие ссылки

Авторские разработки

 
 Другие разработки

Специальные предложения

Автор запретил комментарии

См. также

Исследование технологического журнала 1С при помощи регулярных выражений в блокноте Промо

Производительность и оптимизация (HighLoad) v8 Бесплатно (free)

Все из тех, кто пробовали сдать на сертификат "Эксперт по технологическим вопросам 1С", сталкивались с методикой ЦКТП - разбор файлов технологического журнала при помощи консоли bash. Я, в свою очередь,внёс изменения в данную методику. Мне хотелось достичь более понятного вида и сфокусироваться на Perl, в качестве предпочтительного средства обработки файлов ТЖ. Вот что из этого вышло:

30.10.2017    31645    MrWonder    42    

Parameter sniffing и генерация планов для разработчиков 1С

Производительность и оптимизация (HighLoad) v8 Бесплатно (free)

Особенности генерации планов запросов. Статья написана по мотивам вебинара Виктора Богачева.

01.06.2021    2666    vasilev2015    13    

Как подключиться к хранилищу конфигурации на сервере за NAT, если есть доступ по RDP?

Администрирование СУБД Хранилище v8 Бесплатно (free)

В статье находится инструкция по подключению базы 1С к хранилищу конфигурации, если хранилище не опубликовано в интернет, но опубликовано по TCP в локальной сети клиента.

01.06.2021    1137    Dipod    13    

Как добыть последнюю версию SQL Server 2012 Native Client

Администрирование СУБД Системное администрирование v8 Бесплатно (free)

Краткое руководство администраторам 1С по получению свежей версии SQL Server 2012 Native Client, необходимого для работы сервера 1С.

13.05.2021    621    tedkuban    3    

Долго открывается конфигуратор Промо

Производительность и оптимизация (HighLoad) v8 1cv8.cf Бесплатно (free)

В ОС Windows Server 2012 бывает полезно выключать службу Dynamic Fair Share Scheduling (DFSS позволяет балансировать и распределять ресурсы между пользователями), чтобы повысить производительность 1С:Предприятие 8 в ряде случаев.

22.04.2015    42782    Gilev.Vyacheslav    1    

Ускорение реструктуризации больших таблиц. Мой вариант

Производительность и оптимизация (HighLoad) Администрирование СУБД v8 1cv8.cf Бесплатно (free)

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

28.04.2021    925    buganov    0    

Поиск причин блокировок СУБД

Производительность и оптимизация (HighLoad) v8 v8::blocking 1cv8.cf Бесплатно (free)

Расследование блокировок СУБД. Статья написана по мотивам вебинара Виктора Богачева.

28.04.2021    3817    vasilev2015    12    

Тонкости эксплуатации, плюшки и особенности Postgres Pro Enterprise

Производительность и оптимизация (HighLoad) v8 1cv8.cf Россия Бесплатно (free)

В ходе онлайн-встречи INFOSTART MEETUP Novosibirsk Руководитель ИТ из компании ИнфоСофт Антон Дорошкевич поделился с коллегами тонкостями и опытом работы с Postgresql для 1С. 

22.04.2021    1444    a.doroshkevich    2    

Как можно "положить" SQL сервер с помощью обычной консоли запросов 1С Промо

Производительность и оптимизация (HighLoad) v8 1cv8.cf Бесплатно (free)

Описано как из 1С, с помощью безобидной на первый взгляд обработки, можно сделать неработоспособным SQL сервер. Предложены меры, позволяющие избежать этого.

22.01.2014    68528    yuraos    112    

Xubuntu 20.04 для бухгалтера 1С

Linux Администрирование СУБД v8 БП3.0 Россия Бесплатно (free)

В публикации представлен необходимый минимум для настройки Xubuntu 20.04 в качестве рабочего места бухгалтера, ведущего учёт в программе 1С: Бухгалтерия 3.0 файловый вариант. Кроме этого, настроено подключение и других сотрудников через тонкий клиент 1С к опубликованной на веб-сервере базе бухгалтерии.

12.04.2021    3207    compil7    25    

Режим совместимости конфигурации 1С

Администрирование СУБД v8 1cv8.cf Россия Бесплатно (free)

Приветствую, коллеги! В этой статье будет сделан обзор функции совместимости конфигурации 1С с другими версиями конфигураций 1С, а также рассмотрено, как выбрать и настроить режим совместимости конфигурации с версией 1С 8.3. Во-первых, разберём главное понятие в этой статье: режим совместимости в конфигурации – это устройство, благодаря которому выводится номер версии системы, под которую станет открыто приложение 1С:Предприятие. Данный режим существует на платформе 1С начиная с версий 8.2 и 8.3 (платформа версии 1С:Предприятие 8.3 совместима с платформой версии 1С:Предприятие 8.2).

31.03.2021    1852    Koder_Line    3    

Решение нестандартных проблем производительности на реальных примерах

Производительность и оптимизация (HighLoad) v8 Бесплатно (free)

На екатеринбургском Infostart Meetup выступил с докладом архитектор ИС центра разработки ФТО Александр Криулин. Он поделился с коллегами кейсами нестандартных проблем производительности и рассказал о способах их решения.

24.03.2021    3424    AlexKriulin    37    

Ускоряем списание партий УПП 1.2 / 1.3 / УТ 10.3 Промо

Производительность и оптимизация (HighLoad) v8 УТ10 УПП1 Бесплатно (free)

Не секрет, что многие пользователи, использующие партионный учет (а таких очень много, даже среди огромных холдингов, несмотря на пропаганду РАУЗ) при больших нагрузках сталкиваются с резким замедлением списания партий.

21.06.2013    58576    Антон Ширяев    117    

Соединение вложенными циклами

Производительность и оптимизация (HighLoad) v8 Бесплатно (free)

Nested loops и отсутствующие индексы. Статья написана по мотивам вебинара Виктора Богачева.

12.03.2021    2802    vasilev2015    21    

Долгое воспроизведение звука по RDP с удаленной машины

Производительность и оптимизация (HighLoad) v8 Бесплатно (free)

При воспроизведении короткого звука в 38 Кб, сигнализирующего об успешном сканировании, порою происходило подвисание примерно в 5 секунд.

09.02.2021    621    pashamak    2    

Highload-оптимизация 1С: теория и практика на примере консолидированной отчетности группы "Магнит" и розничной аптечной сети "Магнит"

Производительность и оптимизация (HighLoad) v8 Бесплатно (free)

Тема оптимизации 1С на больших данных бесконечная и всеобъемлющая, поскольку на производительность влияет целый ряд факторов – количество пользователей, данных, транзакций, неоптимальные запросы и т.д. Об инструментах для локализации проблем производительности и практических кейсах оптимизации рассказал Алексей Олейник, руководитель сектора автоматизации отчетности МСФО компании «Информационные технологии Магнит».

11.01.2021    24924    user662404_itlexusss    14    

Сравнение скорости работы 1C+MSSQL и файлового варианта Промо

Производительность и оптимизация (HighLoad) v8 1cv8.cf Россия Бесплатно (free)

На форумах постоянно задается один и тот же вопрос: почему 1C+MSSQL медленнее обрабатывает запросы чем файловая? Затем обычно идет «флуд» на несколько десятков страниц. Есть два популярных «течения» в таких форумах — одни говорят что для клиент-серверного варианта это нормально, файловый вариант всегда должен работать быстрее, другие говорят что 1С плохо работает с субд. В результате «баталий и выяснения отношений» на форумах люди расходятся при своих мнения.

19.02.2013    58656    Gilev.Vyacheslav    46    

Платформа 8.3.18 Обновление ИБ в пакетном режиме поломалось? Решено

Администрирование СУБД v8 Бесплатно (free)

Уже давно работаем с большим количеством ИБ и обновляем, естественно, в пакетном режиме, но с переходом на новую платформу 8.3.18.1208 этот пакетный режим поломался. Стало появляться окно конфигуратора и спрашивать вопросы, раньше такого не было. Решение найдено.

24.12.2020    5199    VPanin56    14    

Анализ блокировок СУБД: таблица изменений плана обмена 1С

Производительность и оптимизация (HighLoad) v8 Бесплатно (free)

Практический пример анализа типичной проблемы ожидания на блокировках СУБД, возникающих при использовании планов обмена 1С. Сервер СУБД: Microsoft SQL Server.

18.12.2020    2459    zhichkin    7    

Анализ проблем производительности по динамике мониторинга RAS 1C

Производительность и оптимизация (HighLoad) v8 1cv8.cf Бесплатно (free)

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

07.10.2020    4218    ivanov660    12    

Параллельные вычисления в 1С 8 Промо

Производительность и оптимизация (HighLoad) v8 1cv8.cf Бесплатно (free)

Решение позволяет ускорять выполнение запросов в 1С 8 в отчетах путем их параллельного выполнения в разных потоках.

11.02.2013    33540    gallam99    19    

Ускорение медленной работы строк в 1С на примере 1С:Документооборот КОРП

Производительность и оптимизация (HighLoad) v8 ДО Бесплатно (free)

Если у вас в 1С:Документооборот КОРП 2.1.11.5 (часть более старых и новых конфигураций): 1) Долго отправляется почта в формате HTML; 2) Медленно открывается документы внутренние / входящие / исходящие; 3) Тормозит область просмотра или открытие задач. Тогда вам сюда.

02.10.2020    4851    Nykyanen    16    

Тест скорости работы мобильной платформы 1С

Мобильная разработка Производительность и оптимизация (HighLoad) v8 1cv8.cf Бесплатно (free)

С помощью этого приложения вы можете измерить производительность своего устройства, используя для этого мобильную платформу 1С:Предприятие. Набор действий теста полностью повторяет аналогичный тест для стационарных ПК, поэтому результаты сравнимы.

14.09.2020    1645    capitan    25    

Описание почти всех событий технологического журнала

Технологический журнал v8 Бесплатно (free)

Краткое описание событий технологического журнала с примерами. Все для быстрого старта.

19.08.2020    19476    YPermitin    34    

Ubuntu vs CentOS vs Win2k8 vs Debian: производительность PostgreSQL Промо

Статистика базы данных Производительность и оптимизация (HighLoad) v8 Бесплатно (free)

Хотя интернет уже переполнен статьями о "правильной" настройке связки PostgreSQL и 1C 8.2, для подводных камней всегда остается место. При сравнении производительности СУБД PostgreSQL на разных ОС, показатели различаются в разы. Самую большую обиду принесла любимая Ubuntu (человечность). После долгих дней и ночей проведенных за консолью этой ОС, она разочаровала окончательно. Тормоза PostgreSQL в Ubuntu Server. Что с ними делать? Сколько раз можно наступать на грабли?

03.11.2012    45048    madmpro    32    

Адаптация автоматической классификации ошибок технологического журнала при появлении новых текстов и типов

Технологический журнал v8 1cv8.cf Бесплатно (free)

Корректируем классификацию ошибок ТЖ в процессе работы для конфигурации мониторинг производительности

17.08.2020    753    ivanov660    0    

SQL для 1С: пишем правильно, красиво, сложно

Производительность и оптимизация (HighLoad) v8 1cv8.cf Бесплатно (free)

Многие программисты боятся работать с Null, считая, что от этих данных в запросах нужно избавляться. О том, как с помощью Null-полей в запросе решать востребованные в учете задачи по выборке данных, на конференции Infostart Event 2019 Inception рассказал ведущий разработчик ГК WiseAdvice Дмитрий Дудин.

14.08.2020    12966    dmurk    33    

Восстановление полнотекстового поиска в базе данных. Клиент-серверный вариант. Моя практика.

Администрирование СУБД v8 Бесплатно (free)

Восстановление полнотекстового поиска в базе данных. Клиент-серверный вариант.

06.08.2020    886    premierex    3    

Администрирование списка баз Windows правами.

Администрирование СУБД v8 Бесплатно (free)

Все пользуются, а статьи по администрированию списка баз нет. Непорядок.

03.08.2020    1158    sergey279    0    

Нестандартные блокировки при работе с OLAP-нагрузкой

Производительность и оптимизация (HighLoad) v8 Бесплатно (free)

Если выполнение отчета мешает работе других пользователей и провоцирует блокировки, даже с учетом «грязного чтения» – ситуация кажется парадоксальной. О том, как расследовать такие проблемы, на конференции Infostart Event 2019 Inception рассказали ведущий программист торгового дома «Петрович» Станислав Щербаков и специалист по производительности компании «СофтПоинт» Александр Денисов.

20.07.2020    2448    Филин    7    

Автоматическая классификация ошибок технологического журнала

Технологический журнал v8 1cv8.cf Бесплатно (free)

В статье обсудим пример практической настройки конфигурации «Мониторинг производительности» для автоматической классификации ошибок по группам/кластерам на данных текстов описания ошибок. Используем механизм векторной модели текстов и косинусное сходство между ними.

25.06.2020    3561    ivanov660    13    

Выявляем и оптимизируем ресурсоемкие запросы 1С:Предприятия

Производительность и оптимизация (HighLoad) Администрирование СУБД Технологический журнал Структура метаданных v8::Запросы Бесплатно (free)

Обычно предметом оптимизации являются заранее определенные ключевые операции, т.е. действия, время выполнения которых значимо для пользователей. Причиной недостаточно быстрого выполнения ключевых операций может быть неоптимальный код, неоптимальные запросы либо же проблемы параллельности. Если выясняется, что основная доля времени выполнения ключевой операции приходится на запросы, то осуществляется оптимизация этих запросов. При высоких нагрузках на сервер СУБД в оптимизации нуждаются и те запросы, которые потребляют наибольшие ресурсы. Такие запросы не обязательно связаны с ключевыми операциями и заранее неизвестны. Но их также легко выявить и определить контекст их выполнения, чтобы оптимизировать стандартными методами.

24.05.2020    9900    DataReducer    22    

[SQL Server] Использование trace flag 9592 для сжатия траффика в кластере AlwaysOn

Производительность и оптимизация (HighLoad) v8 Бесплатно (free)

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

18.05.2020    2489    Aleksey.Bochkov    4    

Настоящий краудфандинг. Даешь сравнение двух СУБД!

Администрирование СУБД v8 Бесплатно (free)

Первый вариант сравнения двух СУБД. Каждый может внести правку и получить SM. Приветствуются конструктивные комментарии, начинающиеся словами "Автор ничего не понимает".

11.05.2020    2906    Mari_Kuznetzova    25    

Оптимизация запросов 1С посредством индексации временных таблиц. Миф? Тестируем, смотрим, считаем

Производительность и оптимизация (HighLoad) Практика программирования v8 Бесплатно (free)

Появилось свободное время, решил проверить на работе индексацию таблиц. Решил поделиться с Вами результатами исследования. Давайте порассуждаем на эту тему? Часто ли вы пользуетесь индексацией в запросах? Платформа 8.3.16.1224

03.04.2020    6968    feva    15    

Как я собрал для себя высокопроизводительный и бесплатный облачный бекенд для 1С на PosgreSQL + PostgREST

Производительность и оптимизация (HighLoad) WEB Интеграция Мобильная разработка Администрирование веб-серверов v8 Бесплатно (free)

В этой статье я расскажу о проблемах бека для мобильных приложений или другого фронта, который требует производительности, быстрой реакции и отказоустойчивости, и как я решил это благодаря opensource проекту PostgREST и СУБД Postgre SQL 12. Проведу простой тест производительности для сравнения 1С с данным решением. Это может быть полезно всем, кто разрабатывает мобильные приложения либо фронтсайд-приложения для 1С на чем угодно - на мобильной платформе или на нативном языке или на Simple UI. И также обзор новых функций SimpleUI для связи с этим бекендом.

31.03.2020    15039    informa1555    35    

Многострочный контекст событий

Производительность и оптимизация (HighLoad) Технологический журнал v8 Бесплатно (free)

Разбор технологического журнала с группировкой событий по первой или последней строке многострочного контекста.

31.03.2020    3582    vasilev2015    11    

Анализ взаимоблокировок

Производительность и оптимизация (HighLoad) Технологический журнал v8 v8::blocking Бесплатно (free)

Скрипт Bash, который выводит полную информацию взаимоблокировок по технологическому журналу. Не имеет аналогов в отечественных публикациях.

20.03.2020    6246    vasilev2015    27    

Многопоточность

Практика программирования Производительность и оптимизация (HighLoad) v8 Бесплатно (free)

Увеличиваем скорость загрузки данных в 20 раз. Как следует использовать многопоточность и готовый модуль для внедрения.

18.03.2020    8193    kaliuzhnyi    44    

1С + Apache + SSL: Перевод опубликованной базы на защищенное соединение https с сертификатом от Let's encrypt windows

Администрирование СУБД v8 1cv8.cf Бесплатно (free)

Есть куча инструкции про связку с ISS, решил добавить свои 5 копеек, как я это настраивал на Apache на Windows.

02.03.2020    4844    rst_filippov    5    

Ошибка при обновлении: Записи регистра сведений стали неуникальными: Двоичные данные файлов

Администрирование СУБД v8 Бесплатно (free)

Способ обойти ошибку обновления Записи регистра сведений стали неуникальными: ДвоичныеДанныеФайлов.

26.02.2020    9512    dubovenko_m    15    

Контроль места на дисках

Администрирование СУБД v8 1cv8.cf Бесплатно (free)

Один из последних случаев на работе. Диск, на котором хранились файлы базы, "развалился", база потеряна. Начали искать копию базы. Копии базы делались на другой диск, но оказалось, что на том диске нет места и копии не делались несколько дней. Так было потеряно несколько дней работы фирмы, кому-то выговор, кого-то уволили((.

20.02.2020    3774    wowik    21    

Нюансы лицензирования 1С

Администрирование СУБД v8 1cv8.cf Россия Бесплатно (free)

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

19.02.2020    13178    fixin    112    

Планы запросов - это просто! Разбор оптимизаций запросов PostgreSQL на живых примерах

Производительность и оптимизация (HighLoad) v8::Запросы Бесплатно (free)

Проблема быстродействия 1С напрямую зависит от производительности запросов. Но как понять механику работы СУБД с помощью плана запроса? Андрей Овсянкин и Никита Грызлов на конференции Infostart Event 2019 Inception подробно рассмотрели алгоритм работы с планом запроса СУБД PostgreSQL, полученным из технологического журнала, и рассказали, на что обратить внимание, чтобы оптимизировать работу системы.

17.02.2020    12720    Evil Beaver    13    

Как мы научились автоматически отслеживать ошибки в 1С

Администрирование СУБД v8 1cv8.cf Россия Бесплатно (free)

Друзья, сегодня я хочу рассказать вам об одной интересной технологии, которая точно поможет повысить качество ваших систем на базе 1С, да и не только 1С.

04.02.2020    14245    slozhenikin_com    27    

Оптимизатор запросов. Вторая часть

Производительность и оптимизация (HighLoad) v8 Бесплатно (free)

Продолжение статьи об оптимизаторе запросов. Во второй части мы попробуем создать свой оптимизатор и попутно разберемся с такими вопросами, как: хранение файлов; индексы; статистика.

23.01.2020    7136    darkdan77    59