Имя: Пароль:
1C
1С v8
ВНУТРЕ-ВНУТРЕННЕЕ перевысоединение без ВТ - рабочий вариант?
0 bolobol
 
08.11.22
17:36
День добрый!

Надо отобрать из ВТ_Комплекты (спр.Комплект состоит из Номенклатур, хранящихся в спр.Комплект.ТЧ)
только те, что содержат Номенклатуру с нужными значениями свойства
У некоторой Номенклатуры есть в рсв.ЗначенияСвойств нужное Значение свойства, нужные значения перечислены в ВТ_Значения.

Рабочий ли вариант такого отбора (синтаксис упрощён):

ВЫБРАТЬ РАЗЛИЧНЫЕ // получаем составы комплектов, убирая дублирующуюся до семи раз Номенклатуру в Комплекте
Комплект,
Номенклатура
ПОМЕСТИТЬ ВТ_КомплектНоменклатура
ИЗ
ВТ_Комплекты ВНУТРЕННЕЕ спр.Комплекты.Номенклатура
  ПО ВТ_Комплекты.Комплект = спрКомплектыНоменклатура.Ссылка
ИНДЕКСИРОВАТЬ ПО
Комплект,
Номенклатура
;
ВЫБРАТЬ
ВТ_Комплект.*
ПОМЕСТИТЬ ВТ_КомплектыОтбор
ИЗ
ВТ_КомплектНоменклатура
  ВНУТРЕННЕЕ рсв.ЗначенияСвойств
   ПО Свойство = &НужноеСвойство
   И ВТ_КомплектНоменклатура.Номенклатура = рсвЗначенияСвойств.Номенклатура
  ВНУТРЕННЕЕ ВТ_Значения
   ПО рсвЗначенияСвойств.Значение = ВТ_ЗначенияЗначение
  ВНУТРЕННЕЕ ВТ_Комплекты
   ПО ВТ_КомплектНоменклатура.Комплект = ВТ_Комплекты.Комплект

Работает быстро, строк в таблицах от 250к до млн. Имеет ли смысл делать ВТ на каждый шаг, и выражать рсв.ЗначенияСвойств.Объект КАК Номенклатура, с индексированием каждой ВТ?
1 Сергиус
 
08.11.22
17:57
(0)А если проверить?)
2 дущ1
 
08.11.22
18:05
(0) честно говоря, лень вникать. Но если нужна скорость, то все по кускам в кучу ВТ с индексированием, а потом скрещивать, если приоритет на занимаемую оперативную память, то можно и так как сейчас. Хотя я бы даже просто для читаемости кода сделал все таки последовательно. Вначале собрал все в ВТ, а потом их скрещивал попарно.
3 nicxxx
 
08.11.22
22:57
работает быстро, потому что для современного железа это совсем не bigdata)) я бы так оставил. запрос и так не длинный и вполне читабельный. а на создание врем таблиц еще время будет тратиться и ресурс HDD/SSD
4 rudnitskij
 
09.11.22
00:15
(0) вы из ВТ_Комплекты получаете данные, помещаете их в таблицу, чтобы эту таблицу потом опять внутренне соединить с ВТ_Комплекты? Не понимаю нахрена это надо
ЗЫ. Не забывайте потом уничтожать временные таблицы
5 bolobol
 
09.11.22
13:26
(4) ВТ_Комплекты - большая, дублирование упоминаний комплектов помноженное на номенклатуру - там будут сотни миллионов записей, которые потом сворачивать, поэтому - краткая ВТ создаётся, а по ней отбор из ВТ_Комплекты в конце
6 rudnitskij
 
09.11.22
15:42
(5) если у вас "ВЫБРАТЬ РАЗЛИЧНЫЕ" - то всё уже там свернуто
7 bolobol
 
09.11.22
15:43
(6) Ага, конечно. Выборка сворачивает исходную таблицу?
8 rudnitskij
 
09.11.22
18:45
(7) если у вас нет числовых колонок - то слово РАЗЛИЧНЫЕ всё свернет. Если числовые есть - надо по ним делать суммирование и группировку по нечисловым, тогда РАЗЛИЧНЫЕ не надо.
А от того, что вы из большой таблицы выбрали данные в маленькую, а потом внутренним соединением соединяете опять с той же большой, никакого сворачивания не произойдет
9 bolobol
 
09.11.22
19:03
(8) какая дичь... Выборка на то и предназначена, чтобы выбрать только то что необходимо, как тут - из большого объёма сделать маленький, необходимый, а затем, когда данные стали ещё меньше - оставить в большой таблице искомый маленький набор
10 rudnitskij
 
09.11.22
22:44
(9) какая дичь... соединение с одной и той же таблицей никак отбор не уменьшает. А отборы из второго запроса можно сразу наложить на первый.
Хотя если у вас талант писателя - пишите конечно, кто ж запретит
11 bolobol
 
10.11.22
14:41
(10) Вы проверяли то что советуете? Ведь это прямо противоречит рекомендациям. Более того, соединение по неиндексированным полям - это вообще не дождаться результатов будет, не говоря про то, что памяти не хватит
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn