Регистры сведений. За кулисами. Часть №2. Запросы платформы

01 июня 2015

Ранее

В предыдущей статье мы рассмотрели структуру хранения регистров сведений платформой 1С:Предприятие 8.x на стороне СУБД в зависимости от настроек регистра, а также некоторые изменения при выходе платформы 8.3.

Сегодня мы рассмотрим непосредственно SQL-запросы, которые формирует платформа при работе с регистрами сведений.

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

Пример непериодического регистраЗапросы

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

Непериодический регистр

В тестовой конфигурации у нас есть простой непериодический регистр "Настройки":

Если мы сделаем запрос к таблице регистра с отбором по полю "УчитыватьВДокументахПоступления", то получаем простейший SQL-запрос:

SELECT
T1._Fld33RRef,
T1._Fld34,
T1._Fld35,
T1._Fld36
FROM dbo._InfoRg32 T1
WHERE (T1._Fld34 = 0x00)

В запросе выбираются поля регистра, а в секции WHERE устанавливается отбор по полю. Рассмотрим примеры с периодическим регистром.

Периодический регистр

Тестовая база содержит периодический регистр:

КПример периодического регистраак было сказано в предыдущей статье, такие регистры могут иметь на стороне СУБД несколько таблиц:

  • Основная таблица регистра
  • Таблицы итогов (одна или две, в зависимости от настроек итогов для регистра: итоги для среза первых и итоги для среза последних).

SQL-запрос к основной таблице итогов ничем не будет отличаться от запроса к таблице непериодического регистра. Другое дело запрос для получения среза последних/первых записей периодического регистра. Вот так, например, выглядит SQL-запрос для получения среза последних записей без установки параметра "Период":

Запрос получения среза последних записей

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

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

Из-за того, что в запросе присутствует несколько подзапросов и соединение с ними, оптимизатор СУБД не всегда может подобрать оптимальный план запроса, поэтому гарантировать стабильность выполнения этого запроса нельзя.

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

Особенности платформы 8.3

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

Получение среза последних по данным таблицы итогов

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

В примере к подзапросу присоединяется левым соединением таблица справочника "Товары" для получения представления товара (Наименования).

Стоит заметить, что если срез последних получается в запросе без установки отбора по периоду (то есть текущий срез), то используется запрос выше. Если же поставить параметр "Период" для таблицы среза последних, то платформа будет использовать запрос аналогично запросы платформы 8.2. То есть таблица итогов не будет использоваться.

Далее

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


comments powered by Disqus