|
Имеет ли права на жизнь такой запрос? | ☑ | ||
---|---|---|---|---|
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
|
http://blog.sqlauthority.com/2007/03/29/sql-server-difference-between-distinct-and-group-by-distinct-vs-group-by/
A DISTINCT and GROUP BY usually generate the same query plan |
|||
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
|
кстати, если убрать ВСЕ из "объединить все", то сразу будет нужныый результат
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |