Имя: Пароль:
1C
 
ERP 2.5.22.114 Сервер слаб или запрос слишком ?
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 по этому поводу изменений нет.
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.