При работе в консоли запросов или при проектировании схемы компоновки данных разработчики часто замечают странное поведение: для периодического регистра сведений в списке доступных таблиц всегда присутствуют виртуальные таблицы СрезПоследних и СрезПервых. Это происходит даже в тех случаях, когда в конфигураторе для данного регистра сняты флаги «Разрешить итоги: срез последних» и «Разрешить итоги: срез первых».
В этой статье мы подробно разберем, как устроен этот механизм изнутри, почему платформа ведет себя именно так, в чем разница между логическим и физическим уровнями хранения данных, а также выясним, когда действительно необходимо задействовать физические таблицы итогов срезов.
Главная причина, по которой мы всегда видим виртуальные таблицы срезов в консоли запросов, заключается в разделении архитектуры платформы «1С:Предприятие» на два независимых слоя:
Давайте проанализируем, как именно меняется физическая структура базы данных в зависимости от этого флага.
Если флаг «Разрешить итоги» в свойствах регистра сведений снят, то в базе данных под данный регистр создается всего одна основная таблица:
_InfoRg<ID> — физическая таблица, где хранятся все записи регистра (период, измерения, ресурсы и реквизиты).Когда мы пишем логический запрос к виртуальной таблице СрезПоследних без включенных итогов, платформа 1С вынуждена эмулировать этот срез «на лету». Она транслирует наш запрос в сложную SQL-конструкцию со вложенными подзапросами. На стороне СУБД это выглядит примерно так:
SELECT
T1._Fld100_IDRRef AS Currency,
T1._Fld101 AS Rate
FROM
_InfoRg100 T1
WHERE
T1._Period = (
SELECT MAX(T2._Period)
FROM _InfoRg100 T2
WHERE T2._Fld100_IDRRef = T1._Fld100_IDRRef
AND T2._Period <= @P1
)
СУБД приходится выполнять сканирование или поиск по индексам основной таблицы, вычислять максимальную дату для каждой уникальной комбинации измерений, а затем соединять этот результат с исходной таблицей для получения значений ресурсов. На больших объемах данных (сотни тысяч и миллионы строк) такой запрос может выполняться крайне медленно.
При установке флага «Разрешить итоги» платформа создает в базе данных дополнительные физические таблицы:
_InfoRgSL<ID> — физическая таблица итогов для среза последних;_InfoRgSF<ID> — физическая таблица итогов для среза первых;_InfoRgOPT<ID> — служебная таблица настроек хранения итогов.В этих таблицах СУБД всегда хранит уже готовые, предрассчитанные актуальные записи на текущий момент времени. Теперь, когда мы обращаемся к СрезПоследних, платформе 1С больше не нужно строить тяжелые вложенные подзапросы с поиском максимума по дате. Она транслирует запрос в простейшее чтение напрямую из таблицы итогов:
SELECT
T1._Fld100_IDRRef AS Currency,
T1._Fld101 AS Rate
FROM
_InfoRgSL100 T1
Такой запрос выполняется практически мгновенно, так как база данных избавляется от необходимости производить группировки и вычисления в момент чтения.
Важно понимать, что простое включение итогов в конфигураторе не гарантирует автоматическое ускорение всех запросов. Платформа 1С — это интеллектуальный транслятор. Она обратится к физическим таблицам итогов _InfoRgSL или _InfoRgSF только при одновременном выполнении следующих условий:
_InfoRg через тяжелые подзапросы.
// Этот запрос проигнорирует таблицу итогов и будет выполняться медленно!
ВЫБРАТЬ
КурсыВалютСрезПоследних.Валюта,
КурсыВалютСрезПоследних.Курс
ИЗ
РегистрСведений.КурсыВалют.СрезПоследних(, Валюта.Код = "USD") КАК КурсыВалютСрезПоследних
// Этот запрос отработает быстро напрямую из таблицы итогов
ВЫБРАТЬ
КурсыВалютСрезПоследних.Валюта,
КурсыВалютСрезПоследних.Курс
ИЗ
РегистрСведений.КурсыВалют.СрезПоследних(, Валюта = &СсылкаНаВалюту) КАК КурсыВалютСрезПоследних
Если хотя бы одно из этих условий нарушается, платформа осуществляет «откат» к старому поведению и выполняет тяжелый SQL-запрос к основной таблице регистра.
Включение итогов — это всегда компромисс между скоростью чтения данных и скоростью их записи. Рассмотрим, что происходит при изменении данных в регистре с включенными итогами:
При записи набора данных платформа обязана поддерживать согласованность и актуальность таблиц срезов. Это означает, что в рамках одной транзакции СУБД должна не только записать новые строки в основную таблицу _InfoRg, но и пересчитать актуальные значения, после чего обновить соответствующие записи в таблицах _InfoRgSL и _InfoRgSF. При пакетной записи миллионов строк (например, при загрузке прайс-листов поставщиков или больших объемов тарифов) включенные итоги могут замедлить процесс записи в несколько раз.
Для того чтобы принимать взвешенные решения при проектировании конфигурации, рекомендуется придерживаться официальных стандартов разработки 1С:
nested loops там, где это неэффективно, из-за чего простейшие отчеты начинают зависать. На MS SQL Server данная проблема оптимизатора выражена значительно слабее. Поэтому для высоконагруженных систем на PostgreSQL своевременное включение итогов является критически важным фактором стабильности системы.Таким образом, убрать виртуальные таблицы срезов из консоли запросов невозможно — они являются неотъемлемой частью логической модели периодического регистра в 1С. Однако теперь мы точно знаем, как управлять их физическим поведением в СУБД для достижения максимальной производительности нашей системы.