Главная » 2016 » Апрель » 2 » Ускорение запросов к таблицам «СрезПервых» и «СрезПоследних»
17:00
Ускорение запросов к таблицам «СрезПервых» и «СрезПоследних»

В платформе 1С версии 8.3.1 добавлены новые свойства для периодических регистров сведений «РазрешитьИтогиСрезПервых» и «РазрешитьИтогиСрезПоследних». Обратимся в документации 1С по данным изменениям: 


Как стало: 

Для периодических регистров сведений реализованы итоги, которые используются для получения срезов первых/последних при выполнении всех следующих условий:

  • Разрешено использование итогов (в метаданных);
  • Установлено использование итогов (в режиме «1С:Предприятия»);
  • Срез получается без указания даты;
  • В условиях получения среза используются только измерения и разделители;
  • В ограничениях доступа к данным для регистра используются только измерения и разделители.

Для объекта конфигурации регистр сведений реализованы свойства РазрешитьИтогиСрезПервыхи РазрешитьИтогиСрезПоследних.

Для менеджера регистра сведений реализованы методы ПересчитатьИтоги(),УстановитьИспользованиеИтогов(),ПолучитьИспользованиеИтогов().

Для регистров сведений реализовано право доступа УправлениеИтогами.

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


Как было: 

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


Результат изменения: 

Повышена скорость получения срезов первых/последних на самый первый и самый последний (текущий) моменты времени.


Проанализируем тексты запросов на стороне СУБД  к виртуальной таблице «СрезПоследних» до установки признака «РазрешитьИтогиСрезПоследних».Из описания результатов изменения получаем «повышение скорости получения срезов первых/последних на самый первый и самый последний (текущий) моменты времени». Но за счет чего повышается скорость выполнения запросов?

Для тестов возьмем регистр «ЦеныНоменклатуры» из типовой конфигурации УПП редакции 1.3 для России и слегка упростим его до следующей структуры (периодичность в пределах дня):

Измерения:

  • ТипЦен;
  • Номенклатура;
  • ХарактеристикаНоменклатуры;

Ресурсы:

  • Цена;

Допустим, стоит задача получить актуальных цен по списку типов цен и списку номенклатуры. В 1С запрос имеет вид:

ВЫБРАТЬ

                ЦеныНоменклатурыСрезПоследних.ТипЦен КАК ТипЦен,

                ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура,

                ЦеныНоменклатурыСрезПоследних.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,

                ЦеныНоменклатурыСрезПоследних.Цена КАК Цена,

                ЦеныНоменклатурыСрезПоследних.Период КАК Период

ИЗ

                РегистрСведений.ЦеныНоменклатуры.СрезПоследних(

                                               ,

                                               ТипЦен В (&МассивТипЦен)

И Номенклатура В (&МассивНоменклатура)

) КАК ЦеныНоменклатурыСрезПоследних 

Теперь получим запрос, который передается в СУБД (с переводом имен таблиц и полей в термины 1С): 

SELECT

T1.Fld27RRef,

T1.Fld28RRef,

T1.Fld29RRef,

T1.Fld30_,

T1.Period_

FROM (SELECT

T4.ТипЦен AS Fld27RRef,

T4.Цена AS Fld30_,

T4.Номенклатура AS Fld28RRef,

T4.Период AS Period_,

T4.ХарактеристикаНоменклатуры AS Fld29RRef

FROM  (SELECT

T3.ТипЦен AS Fld27RRef,

T3.Номенклатура AS Fld28RRef,

T3.ХарактеристикаНоменклатуры AS Fld29RRef,

MAX(T3.Период) AS MAXPERIOD_

FROM РегистрСведений.ЦеныНоменклатуры T3

WHERE T3.Период <= ? AND T3.Активность = 0x01 AND (((T3.ТипЦен IN (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)) AND (T3.Номенклатура IN (?, ?, ?, ?, ?, ?, ?, ?, ?, ?))))

GROUP BY T3.ТипЦен,

T3.Номенклатура,

T3.ХарактеристикаНоменклатуры) T2

INNER JOIN РегистрСведений.ЦеныНоменклатуры T4

ON T2.Fld27RRef = T4.ТипЦен AND T2.Fld28RRef = T4.Номенклатура AND T2.Fld29RRef = T4.ХарактеристикаНоменклатуры AND T2.MAXPERIOD_ = T4.Период) T1

Видим, что запрос непростой и вычисление среза последних выполняется через подзапросы без использования временных таблиц. Кроме, того, в запросе присутствует соединение подзапроса (T2) в физической таблицей (T4), что уже само по себе может стать причиной выбора неоптимального плана СУБД. Поэтому в случае медленной работы запроса по получению среза последних (среза первых) следует переписать запрос с использованием временных таблиц.

Теперь установим признак «РазрешитьИтогиСрезПоследних» для нашего испытуемого регистра «ЦеныНоменклатуры» и проанализируем выполнение того же запроса на стороне СУБД: 

SELECT

T1.Fld56RRef,

T1.Fld57RRef,

T1.Fld58RRef,

T1.Fld59_,

T1.Period_

FROM (SELECT

T2.Номенклатура AS Fld57RRef,

T2.Цена AS Fld59_,

T2.ХарактеристикаНоменклатуры AS Fld58RRef,

T2.Период AS Period_,

T2.ТипЦен AS Fld56RRef

FROM РегистрСведений.ЦеныНоменклатуры.СрезПоследних T2

WHERE (((T2.ТипЦен IN (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)) AND (T2.Номенклатура IN (?, ?, ?, ?, ?, ?, ?, ?, ?, ?))))) T1

Запрос существенно упростился. Если обратиться к структуре хранения базы данных, заметим, что добавилась новая таблица итогов (на стороне СУБД она будет иметь префикс ««_InfoRgSL» для среза последних и ««_InfoRgSF» для среза первых).

Итоги:

  • Использование свойств "РазрешитьИтогиСрезПервых" и "РазрешитьИтогиСрезПоследних" для регистров сведений позволяет ускорить получение срезов первых и срезов последних при определенных параметрах запроса. Достигается ускорение добавлением новых таблиц итогов. Такое решение имеет и свои недостатки, которые перечислены ниже, поэтому принимать решение о включении признаков «РазрешитьИтогиСрезПоследних» и «РазрешитьИтогиСрезПервых» следует в рамках конкретной прикладной задачи.

Недостатки решения:

  • Снижается скорость записи в регистра сведений;
  • Увеличивается объем хранения базы данных;
Просмотров: 1612 | Добавил: Administrator | Теги: РазрешитьИтогиСрезПервых, РегистрыСведений, РазрешитьИтогиСрезПоследних, итоги, 1С8.3, Ускорение1С | Рейтинг: 5.0/7
Всего комментариев: 0
Имя *:
Email *:
Код *: