Имя: Пароль:
1C
1С v8
Имеет ли права на жизнь такой запрос?
0 H A D G E H O G s
 
01.02.13
11:29
День добрый.

Собственно текст.

ВЫБРАТЬ
   ВложенныйЗапрос.Номенклатура
ИЗ
   (ВЫБРАТЬ
       ТоварыНаСкладах.Номенклатура КАК Номенклатура
   ИЗ
       РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах
   ГДЕ
       ТоварыНаСкладах.Регистратор = &Регистратор
   
   ОБЪЕДИНИТЬ ВСЕ
   
   ВЫБРАТЬ
       ТоварыОрганизаций.Номенклатура
   ИЗ
       РегистрНакопления.ТоварыОрганизаций КАК ТоварыОрганизаций
   ГДЕ
       ТоварыОрганизаций.Регистратор = &Регистратор) КАК ВложенныйЗапрос

СГРУППИРОВАТЬ ПО
   ВложенныйЗапрос.Номенклатура


На сами таблицы - не смотрите.

Вопрос в том - кошерно ли сворачивать номенклатуру таким образом, через вложенный подзапрос?
1 Лефмихалыч
 
01.02.13
11:31
(0) а профайлер с отладчиком чо говорят?
ЗЫ Лично я вложенные запросы ненавижу и стремлюсь уничтожить
2 Галахад
 
гуру
01.02.13
11:31
Я так делаю. Но я ламер.
3 Maxus43
 
01.02.13
11:31
зависит от плана запроса, Юзая вложенные - есть вероятность неправильного выбора плана скулем
4 МихаилМ
 
01.02.13
11:31
а зачем

СГРУППИРОВАТЬ ПО
   ВложенныйЗапрос.Номенклатура

"кошерно" тут причем?
5 НафНаф
 
01.02.13
11:31
я за временную таблицу и РАЗЛИЧНЫЕ вместо СГРУППИРОВАТЬ
6 scanduta
 
01.02.13
11:32
норма
7 Maxus43
 
01.02.13
11:32
(3) + щас юзаю ВТ. в 8.1 выбора не было, делал (0)
8 НЕА123
 
01.02.13
11:32
ВЫБРАТЬ РАЗЛИЧНЫЕ
   ВложенныйЗапрос.Номенклатура
ВЫБРАТЬ
       ТоварыНаСкладах.Номенклатура КАК Номенклатура
   ИЗ
       РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах
   ГДЕ
       ТоварыНаСкладах.Регистратор = &Регистратор
   
   ОБЪЕДИНИТЬ ВСЕ
   
   ВЫБРАТЬ
       ТоварыОрганизаций.Номенклатура
   ИЗ
       РегистрНакопления.ТоварыОрганизаций КАК ТоварыОрганизаций
   ГДЕ
       ТоварыОрганизаций.Регистратор = &Регистратор
9 Галахад
 
гуру
01.02.13
11:33
(7) Как это не было?
10 Maxus43
 
01.02.13
11:33
(9) в 8.1 не было ВТ всмысле
11 НЕА123
 
01.02.13
11:35
кстати,
ОБЪЕДИНИТЬ ВСЕ
в контексте (0) со ВСЕ быстрее или лучше без ВСЕ?
12 viktor_vv
 
01.02.13
11:35
(10) Там не было пакетных запросов, насколько я помню.
Приходилось через менеджерВТ мудохаться.
Я правда 8.1 не застал уже :).
13 Maxus43
 
01.02.13
11:35
(10) + совсем старый стал, вспомнил бородатые релизы в которых не было) ошибка
14 H A D G E H O G s
 
01.02.13
11:36
А какая разница то,
Различные
или
Сгруппировать

Смысл то один
15 НафНаф
 
01.02.13
11:36
(11) со все быстрее
16 НафНаф
 
01.02.13
11:36
(14) смысл один, но читабельность лучше, агрегации ведь нет
17 Maxus43
 
01.02.13
11:36
(14) запросы то разные на скуле будут
18 НЕА123
 
01.02.13
11:37
(10)
были пакетные. в первых релизах, правда, могло не быть.
19 H A D G E H O G s
 
01.02.13
11:37
(17) Нет
20 viktor_vv
 
01.02.13
11:37
(14) Подозреваю смысл-то один, только реализация разная.
21 H A D G E H O G s
 
01.02.13
11:38
(17) Ну в смысле результат одинаков и SQL будет теже действия выполнять, в "физическом смысле"
22 vvp91
 
01.02.13
11:38
Лучше РАЗЛИЧНЫЕ вместо СГРУППИРОВАТЬ.
Выборка из подзапроса в данном примере лучше, чем выгрузка во временную таблицу и дальнейшая выборка из временной таблицы.
23 Maxus43
 
01.02.13
11:39
(21) да это понятно, но действия скуля таки разные, это частный пример. Истина только на стороне субд, так точно не сказать имхо
24 acsent
 
01.02.13
11:39
на физическом уровне сгруппировать и различные одинаково
25 acsent
 
01.02.13
11:42
в (0) вполне нормальный запрос
26 H A D G E H O G s
 
01.02.13
11:45
Короче, вот сам запрос, так, как он есть

ВЫБРАТЬ
   ВложенныйЗапрос.Номенклатура
ПОМЕСТИТЬ ТаблицаНоменклатуры
ИЗ
   (ВЫБРАТЬ
       ТоварыОрганизацийОбороты.Номенклатура КАК Номенклатура
   ИЗ
       РегистрНакопления.ТоварыОрганизаций.Обороты(&НачПериода, &КонПериода, , ) КАК ТоварыОрганизацийОбороты
   
   ОБЪЕДИНИТЬ ВСЕ
   
   ВЫБРАТЬ
       ТоварыОрганизацийОстатки.Номенклатура
   ИЗ
       РегистрНакопления.ТоварыОрганизаций.Остатки(&КонПериода, ) КАК ТоварыОрганизацийОстатки) КАК ВложенныйЗапрос

СГРУППИРОВАТЬ ПО
   ВложенныйЗапрос.Номенклатура
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ТаблицаНоменклатуры.Номенклатура.Артикул
ИЗ
   ТаблицаНоменклатуры КАК ТаблицаНоменклатуры
ГДЕ
   ТаблицаНоменклатуры.Номенклатура.Артикул <> ""
;

////////////////////////////////////////////////////////////////////////////////
УНИЧТОЖИТЬ ТаблицаНоменклатуры
27 H A D G E H O G s
 
01.02.13
11:46
Смысл - выбрать все артикулы, которые есть на остатках и были в движениях за период.

Артикулы почти везде заполнены, поэтому предварительного фильтра - нет.
28 Maxus43
 
01.02.13
11:46
(26) зачем в ВТ то пихать его?
29 H A D G E H O G s
 
01.02.13
11:47
(28) Я боюсь, что 1С накуевертит адский запрос с учетом ВТ ОСТАТКИ, ОБОРОТЫ.
30 acsent
 
01.02.13
11:47
зачем все эти навороты?
31 H A D G E H O G s
 
01.02.13
11:48
(30) Какие?
32 НафНаф
 
01.02.13
11:48
(26) зачем тут подзапрос?
33 Maxus43
 
01.02.13
11:48
(29) для того и вложеный не юзай, а чисто ВТ
34 acsent
 
01.02.13
11:48
(29) ВТ имеет смысл когда соединения есть или подзапросы
35 НафНаф
 
01.02.13
11:49
(26) а почему не "остаткиИобороты"?
36 H A D G E H O G s
 
01.02.13
11:50
(33) Чисто ВТ - будет дубляж ID номенклатур, по которым потом пойдет соединение с таблицей Номеклатура, избыточное.
37 Irek-kazan
 
01.02.13
11:51
(0) может лучше озвучить конечнкую цель всех этих телодвижений?
38 H A D G E H O G s
 
01.02.13
11:52
(35) Я ей не доверяю, и мне не нужны лишние Остатки на начало периода.
39 Maxus43
 
01.02.13
11:52
(36) сгруппируй их во второй ВТ, первую удали, и потом проиндексируй уже сгруппированное
40 H A D G E H O G s
 
01.02.13
11:52
(39) Вооот. Лишняя временнаятаблица.
41 H A D G E H O G s
 
01.02.13
11:53
(37) см (27)
42 Maxus43
 
01.02.13
11:53
(40) думаешь помешает? не думаю что это избыточно
43 vvp91
 
01.02.13
11:54
(26) Охренеть!
(33) С временной таблицей будет лишний ввод-вывод на СУБД и вытеснение закешированных блоков данных дерьмом из временной таблицы.

Достаточно следующего кода:

ВЫБРАТЬ РАЗЛИЧНЫЕ
   Номенкл.Артикул КАК Артикул
ИЗ
   (ВЫБРАТЬ Обороты.Номенклатура КАК Номенклатура ИЗ РегистрНакопления.ТоварыОрганизаций.Обороты(&НачПериода, &КонПериода, , ) КАК Обороты
   ОБЪЕДИНИТЬ ВСЕ
   ВЫБРАТЬ Остатки.Номенклатура ИЗ РегистрНакопления.ТоварыОрганизаций.Остатки(&КонПериода, ) КАК Остатки) КАК Движения
   
   ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенкл
       ПО Номенкл.Ссылка = Движения.Номенклатура
44 el-gamberro
 
01.02.13
11:55
Я тоже понял накуй эти изращения. Если у тебя параметр КонДата попадет в таблицу итогов, можно вообще ьбез виртуальных таблиц обойтись
45 el-gamberro
 
01.02.13
11:55
(43) йопта еще один, че вас всех так тянет к ВТ Обороты???
46 Fragster
 
гуру
01.02.13
11:55
(0) норм, только группировать и различные - вот в чем вопрос?
47 Fragster
 
гуру
01.02.13
11:56
на формирование ВТ и выборку из нее уйдет в 100500 раз больше времени, чем как в (0)
48 el-gamberro
 
01.02.13
11:56
(46) разницы нет. И то и другое бцдет с одинаковой скоростью работать
49 Fragster
 
гуру
01.02.13
11:57
а по (26) - надо юзать ОтстаткиИОбороты
50 Fragster
 
гуру
01.02.13
11:58
(48) встречал иное
51 Classic
 
01.02.13
11:58
Зачем ВТ Обороті нужны?
52 Classic
 
01.02.13
11:58
(49)
Думаешь быстрее будет?
53 Irek-kazan
 
01.02.13
11:59
А чего не сразу ВложенныйЗапрос.Номенклатура.Артикул?
54 H A D G E H O G s
 
01.02.13
11:59
(45) Че не так с Оборотами?
55 H A D G E H O G s
 
01.02.13
12:00
(53) Вот, тоже интересно узнать, не родит ли 1С монстра при этом?
56 el-gamberro
 
01.02.13
12:00
ВЫБРАТЬ РАЗЛИЧНЫЕ
   ВложенныйЗапрос.Номенклатура.Артикул
ИЗ
   (ВЫБРАТЬ
       ТоварыНаСкладах.Номенклатура КАК Номенклатура
   ИЗ
       РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах
   ГДЕ
       ТоварыНаСкладах.Период Между Нач И Кон
   
   ОБЪЕДИНИТЬ ВСЕ
   
   ВЫБРАТЬ
       ТоварыНаСкладахОстатки.Номенклатура
   ИЗ
       РегистрНакопления.ТоварыНаСкладах.Остатки(КонДата) КАК ТоварыНаСкладахОстатки

) КАК ВложенныйЗапрос

Тут вся фишка в параметре КонДата, чтобы запрос быстро отработал, он должен был быть равен первому дню месяца, тогда никаой виртуальной хрени создаваться не будет
57 Classic
 
01.02.13
12:01
(54)
Обороты - фактически вложенный подзапрос с группировкой. ИМХО тебе достаточно просто обычной таблицы регистра
58 el-gamberro
 
01.02.13
12:02
(57) угумс, так и есть
59 el-gamberro
 
01.02.13
12:03
(50) че правда?
Для конкретного запроса можно использовать что-то одно либо РАЗЛИЧНЫЕ либо СГРУППИРОВАТЬ
60 Fragster
 
гуру
01.02.13
12:08
(52) запрос к виртуальной таблице - это на самом деле вложенный пакет запросов. в (26) их таких два, причем они еще и вложенные. если один раз заюзать остатки и обороты - да, запрос виртуальной таблицы чуть посложнее будет, но он будет один, и не надо будет вложенного запроса
61 Classic
 
01.02.13
12:10
(60)
Вот в том и вопрос, перекрывает ли тот плюс, что он один, тот минус, что он сложнее?
62 Fragster
 
гуру
01.02.13
12:12
(61) я ставлю на то, что 1 запрос к ВиртТ лучше, чем вложенный с двумя запросами к ВиртТ
63 vvp91
 
01.02.13
12:12
(56) Обороты драматически сокращают выборку данных ПЕРЕД внутренним соединением.
В твоем примере выборка исходных движений может быть просто немерянной, после чего пойдет неявное внутреннее соединение с таблицей справочника номенклатуры.
В результате ты запросто получишь full table scan для регистра, и clustered index scan для справочника.
А потом еще и по всему дублированному набору промежуточного результата ты получишь сортировку (distinct).
64 Irek-kazan
 
01.02.13
12:13
к вопросу о РАЗЛИЧНЫЕ либо СГРУППИРОВАТЬ v8: Что быстрее SELECT DISTINCT или GROUP BY
65 acsent
 
01.02.13
12:14
(64) там ничего не сказано кроме обычных домыслов
66 МихаилМ
 
01.02.13
12:14
DISTINCT не желательно использовать в postgresql
67 H A D G E H O G s
 
01.02.13
12:15
Оборотная таблица - она же отдельная физическая таблица на SQL - е, уже частично свернутая по номенклатуре.
68 Classic
 
01.02.13
12:16
(62)
Не забывай, что ОстаткиИОбороты два раза остатки расчитывает:)
Я ставлю на Остатки() + таблицу регистра :)
69 acsent
 
01.02.13
12:16
70 acsent
 
01.02.13
12:17
(67) только для оборотных регистров
71 H A D G E H O G s
 
01.02.13
12:17
(70) Блин, точно!
72 GANR
 
01.02.13
12:18
(0) ОБЪЕДИНИТЬ ВСЕ - правильно, тогда будут использоваться индексы и работать будет быстрее, чем через ИЛИ.
73 Fragster
 
гуру
01.02.13
12:22
кстати, если убрать ВСЕ из "объединить все", то сразу будет нужныый результат
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн