Имя: Пароль:
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) Вы проверяли то что советуете? Ведь это прямо противоречит рекомендациям. Более того, соединение по неиндексированным полям - это вообще не дождаться результатов будет, не говоря про то, что памяти не хватит
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.