Имя: Пароль:
1C
 
Почему такая скорость запроса
0 Dmitry_FFF
 
20.06.22
15:52
Есть РегистрСведений Регистр. Ресурсы Дата, Документ (Любой документ)
Есть Запрос
ВЫБРАТЬ Регистр.Документ, Максимум(Регистр.Дата) КАК Дата
ИЗ РегистрСведений.Регистр КАК Регистр
ГДЕ Регистр.Документ в (&Документ1)
Сгруппировать По Регистр.Документ
Индексировать по Документ;

Так вот если в параметре Документ, а это массив, все элементы одного типа, то запрос исполняется за 0,001 секунду, а если разного то 1 секунду. Почему? Как ускорить?
1 Ёпрст
 
20.06.22
16:00
(0) Выразить, чтоб не было со всеми таблицами доков из-за составного реквизита
2 Ёпрст
 
20.06.22
16:01
*соединения
3 arsik
 
гуру
20.06.22
16:02
(0) Объединением
В каждое объединение свой тип документа
4 Dmitry_FFF
 
20.06.22
16:09
Понял, спасибо
5 Конструктор1С
 
20.06.22
16:37
(0) платформа преобразует вот это условие

ГДЕ Регистр.Документ в (&Документ1)

когда передаешь один тип документа условие будет

where T1.<ПолеСсылки> in (<Ссылки>)
так индекс может использоваться


когда передаешь доки разного типа, платформа преобразует условие

where case
when T1.<ПолеТипа> = <Тип1> then T1.<ПолеСсылки> in (<Ссылки1>)
when T1.<ПолеТипа> = <Тип2> then T1.<ПолеСсылки> in (<Ссылки2>)
when T1.<ПолеТипа> = <Тип3> then T1.<ПолеСсылки> in (<Ссылки3>)
...
в индекс не попадает
6 H A D G E H O G s
 
20.06.22
17:24
Настало время офигительных историй
7 Конструктор1С
 
20.06.22
18:06
(6) ?
8 lodger
 
20.06.22
18:10
(7)
думаю там
а) не блоки "когда тип тогда", а левые джойны, причем со всеми сразу.
б) нет перебора in (<Ссылки>) в in (<Ссылки1>) (<Ссылки2>) (<Ссылки3>), а просто один и тот же массив втыкается в каждый seek.
9 lodger
 
20.06.22
18:11
единственная правда может быть в том, что оптимизатор запроса может понять монотип. это то и видно в (0)
10 lodger
 
20.06.22
18:15
(0) как ускорить - раздели массив на монотипы перед запросом. (получим 1-2-5-10 массивов).
сделать сборщик текста запроса от числа массивов. (выбрать а из б где в &п1 объединить все выбрать а из б где в &п2 ...)
выполнить запрос с 1-2-5-10 параметрами массивов.
11 youalex
 
20.06.22
19:02
По условию
ГДЕ  ВзаиморасчетыСКонтрагентами.Регистратор В (&Регистратор)

вот такое строится (&Регистратор - список из двух ссылок разного типа):
WHERE ((T1._RecorderTRef = 0x00000186 AND T1._RecorderRRef IN (?)) OR (T1._RecorderTRef = 0x00000187 AND T1._RecorderRRef IN (?)))

Можно попробовать  массив ссылок загнать в ТЗ, ТЗ - в вирт. таблицу (1с типы сама добавит), c вирт. таблицей - inner join
12 H A D G E H O G s
 
20.06.22
19:03
(7) см (11)
13 Immortal
 
20.06.22
19:40
Хоспади, в 3 правильный ответ
14 Конструктор1С
 
20.06.22
19:57
(11)(12) таки, не совсем

ВЫБРАТЬ
    РегистрСведений1.Измерение1 КАК Измерение1,
    РегистрСведений1.Измерение2 КАК Измерение2,
    РегистрСведений1.Измерение3 КАК Измерение3,
    РегистрСведений1.Реквизит1 КАК Ресурс1,
    РегистрСведений1.Реквизит1 КАК Реквизит1
ИЗ
    РегистрСведений.РегистрСведений1 КАК РегистрСведений1
ГДЕ
    РегистрСведений1.Измерение2 В(&Измерение2)

Измерение2 - составной тип

SELECT
T1._Fld99RRef,
T1._Fld100_TYPE,
T1._Fld100_RTRef,
T1._Fld100_RRRef,
T1._Fld101RRef,
T1._Fld108,
T1._Fld108
FROM dbo._InfoRg98 T1
WHERE EXISTS(SELECT
1
FROM #tt1 T2 WITH(NOLOCK)
WHERE (T2._INVALUELISTTRef IS NOT NULL AND T2._INVALUELISTRRef IS NOT NULL) AND ((T1._Fld100_TYPE = 0x08 AND T1._Fld100_RTRef = T2._INVALUELISTTRef AND T1._Fld100_RRRef = T2._INVALUELISTRRef)))

но это 21-я платформа, раньше иначе делала
15 timurhv
 
20.06.22
20:56
(11) на больших объемах 1С так и делает
16 youalex
 
20.06.22
21:00
(14) у меня 8.3.20.

В вашем варианте, кстати, должно нормально отрабатывать без изощрений с разбивкой на типы и пр.
емнип, по такому же принципу 1с строит "парные" условия, типа  ИЗ РегистрНакопления.Товары.Остатки(, (Склад, Номенклатура) В (ВЫБРАТЬ вт.Склад, вт.Номенклатура Из вт))
17 youalex
 
20.06.22
21:12
(15) да, с большим списком у меня построился запрос из (14)
AdBlock убивает бесплатный контент. 1Сергей