|
Почему такая скорость запроса | ☑ | ||
---|---|---|---|---|
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)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |