|
|
|
ERP 2.5.22.114 Сервер слаб или запрос слишком ? H A D G E H O G s, PR, Timon1405, Tigrann, dadmitrii, Jackman, Мультук, calmius, Krendel, Mankubus, RoRu, Ильф, ansh15, ЕRPe, Затейник, formista2000, DiMel_77, Fragster, runuts, Террз, arsik, АНДР, nick86, Бычье сердце, X Leshiy, unenu, okmail, reutov, Serpuh, scanduta, СвинТуз, serg999, Михаил_, Буковка, Crusher, Sanchez_22, Доминошник, toypaul, vsy, denk32, d4rkmesa, lanmandragor, Hmster, RomanYS, maxar, p-soft, Chameleon1980, Homer, boozin, АгентБезопаснойНацио, Поток сознания, ptiz, PLUT, новичекВ1С, Guk, abfm, sergey198, DeeK, lubitelxml, KJlag, JohnGilbert, Hawk_1c, RVN, ALCAPONA, Волшебник
| ☑ | ||
|---|---|---|---|---|
|
0
Мультук
гуру
30.10.25
✎
17:14
|
Вопрос риторический: как это должно работать ?
Мопед не мой (с) Для тех кто читает темы по диагонали -- запрос из ДоходыИРасходыСервер.ТекстЗапросаТаблицаПоступленияТоваров() ВЫБРАТЬ УчетСебестоимости.АналитикаУчетаНоменклатуры.Номенклатура КАК Номенклатура, УчетСебестоимости.АналитикаУчетаНоменклатуры.СкладскаяТерритория КАК Склад, УчетСебестоимости.Период КАК Период, УчетСебестоимости.Регистратор КАК ДокументПоступления, ПриобретениеТоваровУслугТовары.ЗаказПоставщику КАК ЗаказПоставщику, СУММА(УчетСебестоимости.Количество) КАК Количество, СУММА(УчетСебестоимости.СтоимостьРегл) КАК Стоимость ИЗ РегистрНакопления.СебестоимостьТоваров КАК УчетСебестоимости ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ПриобретениеТоваровУслуг.Товары КАК ПриобретениеТоваровУслугТовары ПО УчетСебестоимости.Регистратор = ПриобретениеТоваровУслугТовары.Ссылка И УчетСебестоимости.ИдентификаторСтроки = ПриобретениеТоваровУслугТовары.ИдентификаторСтроки ГДЕ УчетСебестоимости.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход) И УчетСебестоимости.Активность И УчетСебестоимости.Организация = &Организация И УчетСебестоимости.РазделУчета В ( ЗНАЧЕНИЕ(Перечисление.РазделыУчетаСебестоимостиТоваров.ТоварыНаСкладах), ЗНАЧЕНИЕ(Перечисление.РазделыУчетаСебестоимостиТоваров.СобственныеТоварыВПути)) И ТИПЗНАЧЕНИЯ(УчетСебестоимости.Регистратор) = ТИП(Документ.ПриобретениеТоваровУслуг) СГРУППИРОВАТЬ ПО УчетСебестоимости.АналитикаУчетаНоменклатуры.Номенклатура, УчетСебестоимости.АналитикаУчетаНоменклатуры.СкладскаяТерритория, УчетСебестоимости.Период, УчетСебестоимости.Регистратор, ПриобретениеТоваровУслугТовары.ЗаказПоставщику ИМЕЮЩИЕ СУММА(УчетСебестоимости.Количество) > 0 И СУММА(УчетСебестоимости.СтоимостьРегл) > 0 |
|||
|
1
p-soft
30.10.25
✎
11:35
|
нормальный задел для будущих гениальных оптимизаций
|
|||
|
2
Бычье сердце
30.10.25
✎
11:37
|
(0)
Какие текущие показатели? |
|||
|
3
unenu
30.10.25
✎
11:38
|
(0) На демо-базе работать будет.
Для презентаций и успешных переговоров на внедрении норм. |
|||
|
4
RomanYS
30.10.25
✎
11:43
|
(0) откуда запрос?
"ГДЕ" можно/нужно заменить на "И" |
|||
|
5
Мультук
гуру
30.10.25
✎
11:48
|
(2)
Спасибо. Буду смотреть дальше. Строк вроде немного. Что же оно дохнет то на join ? ВЫБРАТЬ Количество(*) ИЗ РегистрНакопления.СебестоимостьТоваров КАК СебестоимостьТоваров ГДЕ ТИПЗНАЧЕНИЯ(СебестоимостьТоваров.Регистратор) = ТИП(Документ.ПриобретениеТоваровУслуг) = 1 млн строк "с копейками" Всего в ССТ 40 млн строк |
|||
|
6
scanduta
30.10.25
✎
11:55
|
(0) Ну я думаю просто 1с пытается экономить на разработчиках, скорее всего такой код пишут студентики
|
|||
|
7
Мультук
гуру
30.10.25
✎
12:04
|
(4)
1) ERP 2.5.22.114 Раньше запрос был проще, а) строился по РегистрНакопления.СебестоимостьТоваров.Обороты б) Сейчас его улучшили, чтобы достать "ЗаказПоставщику" "Стек" вызовов МенеджерОбменаЧерезУниверсальныйФормат.ПТиУ_РасширенныеДанныеИБ РасшифровкаДопРасходов = ДоходыИРасходыСервер.РаспределениеРасходовНаСебестоимостьТоваров(ДанныеИБ.Ссылка); ДоходыИРасходыСервер.ТекстЗапросаТаблицаПоступленияТоваров() 2) Про "ГДЕ" я не понял, прости. :-( 3) Я разберусь. Тема скорее "а вдруг я чудак, смотрю не туда, думаю не головой и не вижу внутренный красоты запроса" |
|||
|
8
H A D G E H O G s
30.10.25
✎
11:56
|
(5) план запроса надо смотреть. Вдруг он отсортировать во временной таблице твой регистр для мерджеджойна пытается...
|
|||
|
9
H A D G E H O G s
30.10.25
✎
12:03
|
Но план запроса вы так просто не соберете изза skip trace
|
|||
|
10
RomanYS
30.10.25
✎
12:07
|
(7) "2) Про "ГДЕ" я не понял..."
Соединение внутреннее -> все условия из ГДЕ можно перенести в условия соединения. |
|||
|
11
Мультук
гуру
30.10.25
✎
12:12
|
(10)
Всегда считал, что оптимизатору в случае "ВНУТРЕННЕЕ СОЕДИНЕНИЕ" должно быть совершенно всё-равно находятся условия в ПО или в ГДЕ |
|||
|
12
H A D G E H O G s
30.10.25
✎
12:16
|
(11) Кэш плана запроса поменяется, скомпилируется новый план, вдруг попадет в статистику - профит :-)
|
|||
|
13
H A D G E H O G s
30.10.25
✎
12:17
|
У меня mssqlprofiler болтается в панели задач по дефолту. Как вы без него живете ?
|
|||
|
14
Мультук
гуру
30.10.25
✎
12:25
|
(12)
Вдруг это хорошо. Но на следующую ночь белые уйдут, придут красные и всё с начала. (13) а) Не сыпь мне соль на рану :-( б) Я могу на всякие интимные вопросы отвечать, но не на все :-) |
|||
|
15
ЕRPe
30.10.25
✎
15:21
|
(0) ПО ВЫРАЗИТЬ(УчетСебестоимости.Регистратор КАК Документ.ПриобретениеТоваровУслуг) = ПриобретениеТоваровУслугТовары.Ссылка
Около х2 прироста на моей базенке |
|||
|
16
RomanYS
30.10.25
✎
15:37
|
(15) а теперь верни назад и сравни.
|
|||
|
17
unenu
30.10.25
✎
15:49
|
(15) ВЫРАЗИТЬ(...) в условиях даст оптимизацию при чтении реквизитов составного типа через точку, а не ссылки.
Например:ПО ВЫРАЗИТЬ(УчетСебестоимости.Регистратор КАК Документ.ПриобретениеТоваровУслуг).Склад = ПриобретениеТоваровУслугТовары.Склад Так будет быстрее. А первый вариант без разницы. Разве не так? |
|||
|
18
АНДР
30.10.25
✎
15:55
|
(15) +1
(16), (17) Тут читайте https://its.1c.ru/db/v8std/content/654/hdoc |
|||
|
19
АНДР
30.10.25
✎
16:02
|
(0) Мне неизвестно случая, когда SQL проверит условие из Имеющие до выполнения слияния таблиц и проверки всех условий.
Т.к. полей Количество и стоимостьРегл в точно индексах таблицы нет, то надо сначала строить ВТ с необходимыми данными по регистру и её уже джойнить с табличной частью поступления. |
|||
|
20
toypaul
гуру
30.10.25
✎
16:25
|
(3) главное вовремя сбежать. лучше в Британию :)
|
|||
|
21
toypaul
гуру
30.10.25
✎
16:27
|
(11) все правильно. просто кто-то один раз обжегся и все время на воду теперь дует.
|
|||
|
22
toypaul
гуру
30.10.25
✎
16:29
|
(5) индексы для начала посмотри на таблице. есть в таблице индекс где регистратор первым идет?
и что значит дохнет? выполняется 30 мин или 2 |
|||
|
23
Timon1405
30.10.25
✎
16:37
|
(16)(17) правы
(15)(18) вы, видимо, неправильно понимаете что написано в ИТС. перечитайте, про разыменование в условиях соединения там ничего нет. А нет потому что в общем случае "соединить ПО ЛЮБАЯ_ФУНКЦИЯ_ОТ_ПОЛЯ(ТАб1.полеХ)=Таб2.полеУ" не использует индекс |
|||
|
24
Мультук
гуру
30.10.25
✎
17:03
|
(22)
1) Запрос (был вызван из синхронизации данных) из (0) заблокировал 3 млн объектов за три часа, но так и не выполнился. Был снят "как не оправдавший надежд" Это в рабочей с живыми пользователями. 2) Спасибо, помогло На тестовой базе добавил фиктивное условие, чтобы заработал индекс "Период + Регистратор" УчетСебестоимости.Период >= '01.01.2020' Ибо раньше априори ничего нет. Запрос отработал за 2мин (в консоль я выводил только количество(*) из ВременнаяТ) 3) 2 мин это всё-равно печаль-печальная, ибо 1С выполняет этот запрос на каждый выгружаемый "Приобретение услуг и прочих активов" во время синхронизации данных. 4) Про индексы и статистику вероятно только к понедельнику получу ответ. Что с индексом "Регистратор + НомерСтроки" я также без идей, ибо доступа к SQL у меня, увы (а может к счастью) нет ИТС нам говорит: Регистр накопления Основная таблица Период + Регистратор + НомерСтроки Регистратор + НомерСтроки |
|||
|
25
СвинТуз
30.10.25
✎
17:07
|
"И ТИПЗНАЧЕНИЯ(УчетСебестоимости.Регистратор) = ТИП(Документ.ПриобретениеТоваровУслуг)"
НЕ плохо для гуру |
|||
|
26
СвинТуз
30.10.25
✎
17:08
|
Наверное работает так же как:
УчетСебестоимости.Регистратор Ссылка Документ.ПриобретениеТоваровУслуг |
|||
|
27
Мультук
гуру
30.10.25
✎
17:11
|
(25)
Согласен. Я тоже иногда очень люблю типовой код. |
|||
|
28
СвинТуз
30.10.25
✎
17:15
|
Ну так отберите в курсор
проиндексируйте если набор данных больше 1 000. Выразите тип поля связи в явном виде. Выразить(УчетСебестоимости.Регистратор КАК Документ.ПриобретениеТоваровУслуг) Я не спец большой. Просто вариант. |
|||
|
29
СвинТуз
30.10.25
✎
17:14
|
Большой шкаф громче падает.
Я не знаю. |
|||
|
30
АНДР
30.10.25
✎
17:15
|
(24) Чем поможет индекс по ссылке на таблице регистра, если её все равно сканировать из-за полей Количество и стоимостьРегл?
|
|||
|
31
СвинТуз
30.10.25
✎
17:17
|
Да и история какая то странно выглядящая.
Нужен набор данных за всю историю. |
|||
|
32
АНДР
30.10.25
✎
17:22
|
(30) + Точнее как с учётом
... ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ПриобретениеТоваровУслуг.Товары КАК ПриобретениеТоваровУслугТовары ... И ТИПЗНАЧЕНИЯ(УчетСебестоимости.Регистратор) = ТИП(Документ.ПриобретениеТоваровУслуг) ... может не выполниться ИМЕЮЩИЕ СУММА(УчетСебестоимости.Количество) > 0 И СУММА(УчетСебестоимости.СтоимостьРегл) > 0 |
|||
|
33
СвинТуз
30.10.25
✎
17:28
|
УчетСебестоимости.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
.... И ТИПЗНАЧЕНИЯ(УчетСебестоимости.Регистратор) = ТИП(Документ.ПриобретениеТоваровУслуг) Так задумано? ) Типа борьба с возвратами? |
|||
|
34
СвинТуз
30.10.25
✎
17:26
|
"УчетСебестоимости.Активность"
Для работы индексов не хватает только "Проведен" |
|||
|
35
СвинТуз
30.10.25
✎
17:28
|
Прилепили слева.
Получили перебор. Курсор + индекс. Так мидлы пишут наверное. Хотя и я тоже могу. Под настроение. |
|||
|
36
unenu
30.10.25
✎
17:33
|
(24) Верно. Еще пару лет назад(в расширении) поставили на подобный запрос условие на период.
В обмене с БП, на каждый приход, идет безусловное(криво-условное) формирование громадной ВТ. Жутко тормозило при объеме строк себеса с многими нулями. :( |
|||
|
37
СвинТуз
30.10.25
✎
17:37
|
(36)
Ну да. Условие на все время. + отбор по типу = индекс частично заработает. |
|||
|
38
ЕRPe
30.10.25
✎
21:32
|
Ужастики какие-то, на третьем пентиуме базу крутите?
(24) 22млн записей, очень средний серверок 0,6секунды на этот запрос. |
|||
|
39
PR
30.10.25
✎
22:25
|
(0) Вообще-то все условия из ГДЕ нужно продублировать в условия соединения
|
|||
|
40
PR
30.10.25
✎
22:31
|
(24) Если это вызывается для одного регистратора, то откуда тут всякие соединения с документами, а не выборка движений по одному регистратору?
|
|||
|
41
Мультук
гуру
30.10.25
✎
22:33
|
(38)
Спасибо. Посмотрел внимательно. Действительно, объемы детские. По идее join 1млн на 1млн строк. Ничего не размножается, дублей в ИдентификаторСтроки - нет. Что-то с индексами или статистикой или ... Но это уже точно не сегодня. |
|||
|
42
Мультук
гуру
30.10.25
✎
22:37
|
(40)
Номер релиза указан в теме, "почему 1С сделала именно так", мне сложно сказать, я буду разбираться и оптимизировать, если не смогут привести в чувство статистку индексов. Там не очень много кода, по идее ничего сложного быть не должно. В релизе 2.5.24.65 по этому поводу изменений нет. |
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |