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

Ядром динамического списка является объект СКД, в публикации продемонстрированы текущие проблемы динамического списка и возможность оптимизации сложных запросов.

Проверял на платоформах: 8.2.17.169, 8.2.18.109

1. Если через изменить форму отключить вывод поля в списке / удалить поле из списка, то платформа все равно будет получать данные по этим полям до тех пор пока вы не перезапустите форму.

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

Пример запроса из profiler:

FROM _Document128 T1 WITH(NOLOCK)

LEFT OUTER JOIN _Document128_VT1811 T3 WITH(NOLOCK)
ON ((T3._Document128_IDRRef = T1._IDRRef) AND (T3._Fld1813RRef = @P2))
LEFT OUTER JOIN _Document128_VT1811 T4 WITH(NOLOCK)
ON ((T4._Document128_IDRRef = T1._IDRRef) AND (T4._Fld1813RRef = @P3))
LEFT OUTER JOIN _Document128_VT1811 T5 WITH(NOLOCK)
ON ((T5._Document128_IDRRef = T1._IDRRef) AND (T5._Fld1813RRef = @P3))
LEFT OUTER JOIN _Document128_VT1811 T6 WITH(NOLOCK)
ON ((T6._Document128_IDRRef = T1._IDRRef) AND (T6._Fld1813RRef = @P2))
LEFT OUTER JOIN _Reference69_VT781 T7 WITH(NOLOCK)

 

3.1 При использовании языка расширения запросов СКД для указания необязательных таблиц платформа игнорирует эти указания.

ВЫБРАТЬ

               Док.Ссылка,

               ТЧ.Значение

ИЗ

               Документ.ЗаказКлиента КАК Док

                              {ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗаказКлиента.ДополнительныеРеквизиты КАК ТЧ

                              ПО (ТЧ.Ссылка = Док.Ссылка)

                                              И (ТЧ.Свойство = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения.ПустаяСсылка))}

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

3.2 Более того, поля добавленные в таблицу через конфигуратор и отключенные через команду «изменить форму» никогда не исключаются из результирующего запроса к базе данных (такие поля еще нельзя удалить из спика).

Из пункта 3.1 и 3.2 следует, что если вы захотите ускорить вывод данных в списке путем отключения ненужных полей, то по факту никакой оптимизации не произойдет. Пример: посмотрите запрос динамического списка в УТ 11 в форме ФормаСпискаДокументов докумена заказ клиента . При отключении вывода множества расчетных полей оптимизации не произойдет. 

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

ВЫБРАТЬ
Спр.Ссылка КАК Ссылка,
РН.ВНаличииОстаток,
РН.ВРезервеОстаток
ИЗ
Справочник.Номенклатура КАК Спр
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(, {(Номенклатура).* КАК Ссылка}) КАК РН
ПО (РН.Номенклатура = Спр.Ссылка)

 

запрос без псевдонима

SELECT TOP 22
T1._IDRRef,
T2.Fld4965Balance_,
T2.Fld4966Balance_,
T1._Marked,
T1._IsMetadata,
CASE WHEN (T1._Folder = 0x00) THEN 0x01 ELSE 0x00 END,
T1._Description,
T1._Code,
T1._Description
FROM _Reference63 T1 WITH(NOLOCK)
LEFT OUTER JOIN (SELECT
T3._Fld4961RRef AS Fld4961RRef,
CAST(SUM(T3._Fld4965) AS NUMERIC(32, 8)) AS Fld4965Balance_,
CAST(SUM(T3._Fld4966) AS NUMERIC(32, 8)) AS Fld4966Balance_
FROM _AccumRgT4967 T3 WITH(NOLOCK)
WHERE T3._Period = @P1
GROUP BY T3._Fld4961RRef
HAVING (CAST(SUM(T3._Fld4965) AS NUMERIC(32, 8))) <> @P2 OR (CAST(SUM(T3._Fld4966) AS NUMERIC(32, 8))) <> @P2) T2
ON (T2.Fld4961RRef = T1._IDRRef)

 

запрос с псевдонимом

SELECT TOP 22
T5._IDRRef,
T6.Fld4965Balance_,
T6.Fld4966Balance_,
T5._Marked,
T5._IsMetadata,
CASE WHEN (T5._Folder = 0x00) THEN 0x01 ELSE 0x00 END,
T5._Description,
T5._Code,
T5._Description
FROM _Reference63 T5 WITH(NOLOCK)
LEFT OUTER JOIN (SELECT
T7._Fld4961RRef AS Fld4961RRef,
CAST(SUM(T7._Fld4965) AS NUMERIC(32, 8)) AS Fld4965Balance_,
CAST(SUM(T7._Fld4966) AS NUMERIC(32, 8)) AS Fld4966Balance_
FROM _AccumRgT4967 T7 WITH(NOLOCK)
LEFT OUTER JOIN _Reference63 T8 WITH(NOLOCK)
ON T7._Fld4961RRef = T8._IDRRef
WHERE T7._Period = @P1 AND ((T8._Fld7329RRef = @P2))
GROUP BY T7._Fld4961RRef
HAVING (CAST(SUM(T7._Fld4965) AS NUMERIC(32, 8))) <> @P3 OR (CAST(SUM(T7._Fld4966) AS NUMERIC(32, 8))) <> @P3) T6
ON (T6.Fld4961RRef = T5._IDRRef)

При этом будет работать платформенный механизм поиска через «найти»,  но не будут работать платформенные отборы:

     — по родителю при иерархии

     — для выборки порции данных (кадр динамического списка)

 

5. Выводите реквизиты объекта в динамический список через поле ссылка, основной запрос пусть будет «ВЫБРАТЬ Ссылка ИЗ ТаблицаОбъекта».

   — Платформа понимает, что не нужно делать  соединение с основной таблицей, если идет конструкция вида Ссылка.Номер

   — рассказывать пользователю, что для того, чтобы сделать отбор по полю доп реквизита или новому полю, которого нет в списке нужно найти поле ссылка и уже из него вытаскивать подчиненный поля, намного сложнее, чем сказать раскройте список и выберите нужный реквизит (при это желательно переименовать ссылку во что-то более понятное пользователю).

    — Будет работать отбор в присоединяемых таблицах, если выполнить пункт 4.

При этом будет один баг платформы, при изменении запроса платформа будет сбрасывать у полей таблицы путь к данным, если путь данных идет через точку (Ссылка.Номер), придется снова их выставлять.

 

6. При пролистывании динамического списка с дополнительными реквизитами/свойствами платформа начинает ощутимо подтормаживать, при упорядочивании зависает. 

Здесь есть два решения,

I. отключить вывод дополнительных реквизитов/свойств

{ХАРАКТЕРИСТИКИ
ТИП(Документ.ЗаказКлиента)
ВИДЫХАРАКТЕРИСТИК (ВЫБРАТЬ ПЕРВЫЕ 0
NULL КАК Ключ,
NULL КАК Имя,
NULL КАК ТипЗначения)
ПОЛЕКЛЮЧА Ключ
ПОЛЕИМЕНИ Имя
ПОЛЕТИПАЗНАЧЕНИЯ ТипЗначения
ЗНАЧЕНИЯХАРАКТЕРИСТИК (ВЫБРАТЬ ПЕРВЫЕ 0
NULL КАК Объект,
NULL КАК Вид,
NULL КАК Значение)
ПОЛЕОБЪЕКТА Объект
ПОЛЕВИДА Вид
ПОЛЕЗНАЧЕНИЯ Значение }

II Описать для каждого свойства получение данных и в запросе на выборку данных реализовать получение свойства через ВЫРАЗИТЬ.

Пример:

{ХАРАКТЕРИСТИКИ
ТИП(Документ.ЗаказКлиента)
ВИДЫХАРАКТЕРИСТИК (ВЫБРАТЬ
ПВХ.Ссылка,
ПВХ.Наименование,
ПВХ.ТипЗначения
ИЗ
ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения КАК ПВХ
ГДЕ
ПВХ.Ссылка = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения.ОператорДоставки))
ПОЛЕКЛЮЧА Ссылка
ПОЛЕИМЕНИ Наименование
ПОЛЕТИПАЗНАЧЕНИЯ ТипЗначения
ЗНАЧЕНИЯХАРАКТЕРИСТИК (ВЫБРАТЬ
ТЧ.Ссылка,
ТЧ.Свойство,
ВЫРАЗИТЬ(ТЧ.Значение КАК Справочник.ОператорыДоставок) КАК Значение
ИЗ
Документ.ЗаказКлиента.ДополнительныеРеквизиты КАК ТЧ ГДЕ ТЧ.Значение ссылка Справочник.ОператорыДоставок)
ПОЛЕОБЪЕКТА Ссылка
ПОЛЕВИДА Свойство
ПОЛЕЗНАЧЕНИЯ Значение }

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

 

7 Comments

  1. frying

    1,3 — были признаны ошибками платформы и через некоторое время скорее всего уйдут.

    В пукте 6, в чем состоит смысл оператора ВЫРАЗИТЬ. Чем он облегчает запрос?

    Reply
  2. Danil.Potapov

    (1) frying, Да, пункты 1 — 3 будут исправлены, хорошо, если это будет в 8.2.

    по пункту 6 рекомендую:

    http://www.gilev.ru/optimquery/

    http://infostart.ru/public/184361/

    — просмотр profiler в момент получения данных, особенно интересно при упорядочивании по характеристике объекта.

    Reply
  3. frying

    (2) — просмотр profiler в момент получения данных, особенно интересно при упорядочивании по характеристике объекта.

    С какими-то операциями, сортировкой, получением от характеристик «вложенных» значений через точку действительно поможет. А просто при выводе на экран как поможет?

    Reply
  4. Danil.Potapov

    (3) frying, а подумать?

    Reply
  5. frying

    (4) Я считаю практически никак, разница в чтении одной или 6-ти колонок.

    Reply
  6. kirinalex

    по пункту 4

    1. что мы улучшаем таким способом? как меняются показатели при замере производительности?

    2. что за отбор показан в разделе «запрос с псевдонимом»?

    AND ((T8._Fld7329RRef = @P2))

    Reply
  7. Danil.Potapov

    (6) kirinalex, если пользователь устанавливает отбор по реквизитам объекта (через найти или через настройку отбора), то система установит отбор в параметрах виртуальных таблиц.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *