Имя: Пароль:
1C
 
сгруппировать vs без повторяющихся
0 qeos
 
06.11.14
15:44
что быстрее?
как правильней?
1 vicof
 
06.11.14
15:45
для разных задач разные варианты
2 qeos
 
07.11.14
09:09
понял. нужен был пример. это я просто в попыхах тему создал.

Вобщем допустим есть две таблицы:
<table>
<tr><td>Строка А</td></tr>
<tr><td>Строка А</td></tr>
<tr><td>Строка Б</td></tr>
<tr><td>Строка В</td></tr>
</table>

<table>
<tr><td>Строка А</td></tr>
<tr><td>Строка Б</td></tr>
<tr><td>Строка Б</td></tr>
<tr><td>Строка Г</td></tr>
</table>

вот как правильней будет? ниже два варианта

<CODE>ВЫБРАТЬ РАЗЛИЧНЫЕ * ИЗ таблица1
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ * ИЗ таблица2
</CODE>

<CODE>ВЫБРАТЬ * ИЗ таблица1
ПОЛНОЕ СОЕДИНЕНИЕ таблица2
СГРУППИРОВАТЬ ПО поле1
</CODE>
3 qeos
 
07.11.14
09:09
мде.. где тут форматирование? какие теги-то?
4 Ненавижу 1С
 
гуру
07.11.14
09:10
(3) тегов нет
5 Necessitudo
 
07.11.14
09:11
Если в голом варианте- то различные быстрее.
6 AlexTim03
 
07.11.14
09:11
НА уровне SQL нет разницы, оба ззпроса будут преобразованы к виду "group by"
7 Necessitudo
 
07.11.14
09:12
(6) Не ври) DISTINCT
8 dk
 
07.11.14
09:27
(2) оба варианта неверные ))
достаточно просто
--
Выбрать * ИЗ Таб1
ОБЪЕДИНИТЬ
Выбрать * ИЗ Таб2
9 alle68
 
07.11.14
09:37
(8) Выбрать РАЗЛИЧНЫЕ * ИЗ Таб1
10 Necessitudo
 
07.11.14
09:37
(8) Когда-то слышал, что использовать "Объединить" вместо "Объединить Все" зло злостное.
11 dk
 
07.11.14
09:38
(9) а проверить?
12 alle68
 
07.11.14
09:44
(11) Действительно.
13 dmpl
 
07.11.14
09:46
(0) СГРУППИРОВАТЬ имеет смысл при использовании агрегатных функций. РАЗЛИЧНЫЕ - ручками писать быстрее.
14 МишельЛагранж
 
07.11.14
10:00
(13)>>ГРУППИРОВАТЬ имеет смысл при использовании агрегатных функций
- не "имеет смысл", а необходимо в этом случае.
(0) РАЗЛИЧНЫЕ и СГРУППИРОВАТЬ - совершенно разные команды 1С.
Кто вам посоветовал их сравнить?
15 Гёдза
 
07.11.14
10:14
distinct неявно вызывает group by
16 Гёдза
 
07.11.14
10:20
(15) вернее и то и другое делается через сортировку таблицы
17 Serginio1
 
07.11.14
10:35
(16) Может и Хэш таблицу применять

Используются разные алгоритмы sort unique/hash unique (distinct), sort group by/hash group by (group by).
Реализация алгоритмов может варьироваться от версии к версии.
http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1015215&msg=14140858

http://msdn.microsoft.com/ru-ru/library/ms181714.aspx

{ HASH |ORDER } GROUP
Указывает, что агрегаты, описываемые в предложениях GROUP BY или DISTINCT запроса, должны использовать хэширование или упорядочивание.
18 МишельЛагранж
 
07.11.14
11:32
(16)>>вернее и то и другое делается через сортировку таблицы
- варианты сортировки в SQL никакого прямого отношения не имеют к самим командам 1С.
Как и к их быстройдействию в запросах 1С.
Как правильно написал Serginio1 - если и есть минимальные отличия в способах сортировки SQRT в SQL, то они влияния такого не оказывают, как последующая обработка в самом 1С.
19 H A D G E H O G s
 
07.11.14
11:45
(17) Я правильно понимаю, что DISTINCT работает так:
Hash group by - это:

1) Сортировка по агрегатным полям
2) Построение хеша по агрегатным полям (возможно одновременно с сортировкой)
3) Проход по таблице по алгоритму:

Если хешПредыдущейстроки<>хешТекущейСтроки Тогда
хешПредыдущейстроки=хешТекущейСтроки;
РезультирующаяТаблица.Добавить(ТекущаяСтрока);
КонецЕсли;

Sort group by - это:

1) Сортировка по агрегатным полям
2) Проход по таблице по алгоритму:

Если ПредыдущееПоле1<>ТекущееПоле1 ИЛИ... ПредыдущееПолеn<>ТекущееПолеn Тогда
ПредыдущееПоле1=ТекущееПоле1;
ПредыдущееПолеn=ТекущееПолеn;
РезультирующаяТаблица.Добавить(ТекущаяСтрока);
КонецЕсли;
20 Serginio1
 
07.11.14
11:51
21 H A D G E H O G s
 
07.11.14
11:54
(20) Что это за куски кода?
22 H A D G E H O G s
 
07.11.14
11:57
(20) Ты делал универсальную Группировку для любых аггрегируемых типов штоле?
23 H A D G E H O G s
 
07.11.14
11:59
(20) Я понимаю, как группировать ТЗ программно, см. (19, вариант 2) я спрашиваю, так ли это делает SQL, ибо мне на ум приходит только такой алгоритм, но может кибернетики придумали что-то хитрее.
24 Serginio1
 
07.11.14
12:03
(20) Да и очень часто использую. Например для универсального списания по партиям

http://forum.infostart.ru/forum86/topic118274/?c=116&PAGEN_1=2

116 ответ

http://forum.infostart.ru/ajax/show_comment.php?t=118274&c=116
25 Serginio1
 
07.11.14
12:04
Хэш это берется хэштаблица которая и будет результатом. Ничего сортировать не надо
26 H A D G E H O G s
 
07.11.14
12:05
(25) Зачем нам в результате хеш таблица?
27 H A D G E H O G s
 
07.11.14
12:06
(25) sort group by работает по тому алгоритму, который я привел? Я был прав?
28 Serginio1
 
07.11.14
12:07
А нам нужны тоько неповторяющиеся значения
Например
Соответствие[Ключ]=1;

Для каждого стр из Соответствия Цикл
Вывод стр.Ключ
КонецЦикла
29 Serginio1
 
07.11.14
12:08
(27) Да.
30 H A D G E H O G s
 
07.11.14
12:09
(28) Вы очень тяжко выражаете свои мысли.
31 H A D G E H O G s
 
07.11.14
12:12
(28) Мы получили хеш таблицу, в ней есть повторяющиеся значения хеша, в случайном порядке. Мы должны:
1) Упорядочить таблицу по хешу и работать по алгоритму (19)
либо:
2) Обойти таблицу и собрать массив уникальных хешей, на каждом шаге проводя поиск в массиве.
32 Гёдза
 
07.11.14
12:12
(31) в хэш таблице не повторяющихся значений
33 Гёдза
 
07.11.14
12:13
хэш таблица автоматически упорядочена.
Для понимания рассматривай ее как соответствие
34 Serginio1
 
07.11.14
12:14
(30) А чего там тяжкого?
Для sort group by нужно предварительно отсортировать.
Для Хэш таблицы она стротися по ходу.
Кстати нашел мои изыскания по сортировке слиянием на Delphi
http://rsdn.ru/forum/alg/683492.1
http://rsdn.ru/forum/alg/683492.1
35 Serginio1
 
07.11.14
12:17
(31) Нет в Хэш таблице повторяющихся значений

Еще раз

Для каждого стр из Тз Цикл
Ключ=Стр[НаименованиеКлючевогоПоля];
Соответствие[Ключ]=1;
КонецЦикла

Для каждого стр из Соответствия Цикл
Вывод стр.Ключ
КонецЦикла
36 Serginio1
 
07.11.14
12:20
Смысл такой если процент уникальных значений мал, то применяем Хэш таблицу, так как затраты на сортировку будут больше чем построение Хэш таблицы

А вот если повторяющихся значений мало то тут рулит сортировка
37 H A D G E H O G s
 
07.11.14
12:21
(35) (36) Ясно
38 H A D G E H O G s
 
07.11.14
12:25
Еще раз, для закрепления.
Таблица:

НомерСтроки Номенклатура
1           Яблоки
2           Груши
3           Яблоки

В хештаблице будут2 записи:
1)первая запись - хеш от слова "Яблоки", ссылка на строку номер 3.
2)вторая запись - хеш от слова "Груши", ссылка на строку номер 2.

Так?
39 H A D G E H O G s
 
07.11.14
12:26
(38) Номер строки - это не аггрегирующее поле, это идентификатор строки, RID.
40 Serginio1
 
07.11.14
12:51
для Distinct вообще берется HashSet. Там только ключи
http://msdn.microsoft.com/ru-ru/library/bb359438(v=vs.110).aspx
41 Serginio1
 
07.11.14
12:52
Для соединений например можно сделать Хэш таблицу где значениями может быть массив дублей ключей. Но это другая задача
42 МишельЛагранж
 
07.11.14
14:13
(34)>>Для sort group by нужно предварительно отсортировать.
Для Хэш таблицы она стротися по ходу.
- так я и не уловил, в чем разница, если 98% сравниваемых таблиц - это случай из ( 36), когда уникальных значений основная масса.
И как тут выбрка по хэшу будет существенно быстрее?
43 SanGvin
 
07.11.14
14:16
Если нет агрегатов, DISTINCT, иначе GROUP BY
44 Serginio1
 
07.11.14
14:24
(42) Хэш будет быстрее когда уникальных значений существенно меньше исходных данных. То есть количество строк в результирующей таблице значительно меньше, чем в исходных данных. Мы экономим на сортировке исходных данных.

А вот когда количество строк в результирующей таблице составляет 98% то однозначно лучше сортировка.
А вот процент раздела какой алгоритм лучше использовать только экспериментально.
45 H A D G E H O G s
 
07.11.14
14:26
(44) SQL собирает статистику по уникальности аггрегирующих полей?
46 Serginio1
 
07.11.14
18:18
(45) Ну запрос кэшируется. Могут кэшироваться и результаты от параметров. Задача БД выбрать оптимальный алгоритм и многое можно сделать учитывая статистику
47 МихаилМ
 
07.11.14
19:03
для postgreSQL использовать Distinct - не рекомендуется