Вход | Регистрация

  1  2   
1С:Предприятие :: 1С:Предприятие 8 общая

что быстрее - ОБЪЕДИНИТЬ или ОБЪЕДИНИТЬ ВСЕ во вложенном запросе и группировка сверху?

что быстрее - ОБЪЕДИНИТЬ или ОБЪЕДИНИТЬ ВСЕ во вложенном запросе и группировка сверху?
Я
   novichok79
 
29.11.18 - 11:22
доброго времени суток, уважаемые друзья.
есть несколько таблиц размером по 300-400 Гб в базе, из них мы делаем выборку с группировкой.

какой запрос отработает быстрее?

выбрать рег1.измерение1 из регистрсведений.рег1 как рег1
объединить
выбрать рег2.измерение1 из регистрсведений.рег2 как рег2

или

выбрать
выборка.измерение1
из
(выбрать рег1.измерение1 из регистрсведений.рег1 как рег1
объединить все
выбрать рег2.измерение1 из регистрсведений.рег2 как рег2) как выборка

сгруппировать по измерение1

аргументируйте ваш ответ, заранее благодарю за помощь.
 
 
   novichok79
 
1 - 29.11.18 - 11:23
я думаю, что первый вариант, без вложенного запроса.
   novichok79
 
2 - 29.11.18 - 11:24
ибо серверу не надо складывать результаты во вложенную таблицу, чтобы только потом группировать, вместо того, чтобы сгруппировать сразу
   rs_trade
 
3 - 29.11.18 - 11:26
(0) вместо того что-бы играть в угадайку, посмотри планы запросов. вопросы все отпадут.
   rs_trade
 
4 - 29.11.18 - 11:28
складывать результаты во вложенную таблицу, это ты смешно сказал. а вообще по моему план запроса одинаковый будет.
   1Сергей
 
5 - 29.11.18 - 11:28
(0) Результаты не будут идентичны
   Вафель
 
6 - 29.11.18 - 11:30
надо бы планы посмотреть
   Вафель
 
7 - 29.11.18 - 11:30
(5) почему не  будут?
   novichok79
 
8 - 29.11.18 - 11:34
(7) потому что во втором варианте отстуствует группировка по измерению в объединяемых запросах
   novichok79
 
9 - 29.11.18 - 11:35
то есть в первом
   1Сергей
 
10 - 29.11.18 - 11:38
(7) хотя, нет. Будут идентичны.

но, самый быстрый вариант ИМХО вот:

ВЫБРАТЬ
    Рег1.изм1
ИЗ
    Рег1 КАК Рег1
СГРУППИРОВАТЬ ПО
    Рег1.изм1

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    Рег2.изм1
ИЗ
    Рег2 КАК Рег2
СГРУППИРОВАТЬ ПО
    Рег2.изм1
 
 Рекламное место пустует
   Вафель
 
11 - 29.11.18 - 11:39
(8) а ты знаешь как Объединить работает на уровне SQL ?
   novichok79
 
12 - 29.11.18 - 11:42
(11) неа, технической реализации не знаю.
   novichok79
 
13 - 29.11.18 - 11:46
а вот xуюшки на SQL-2014

1)
выбрать рег1.измерение1 из регистрсведений.рег1 как рег1 
сгруппировать по измерение1
объединить 
выбрать рег2.измерение1 из регистрсведений.рег2 как рег2
сгруппировать по измерение1

2 845 080 за 19.428 сек

2)
выбрать рег1.измерение1 из регистрсведений.рег1 как рег1
объединить
выбрать рег2.измерение1 из регистрсведений.рег2 как рег2

2 845 080 за 19.160 сек

3) выбрать 
выборка.измерение1
из
(выбрать рег1.измерение1 из регистрсведений.рег1 как рег1
объединить все
выбрать рег2.измерение1 из регистрсведений.рег2 как рег2) как выборка

сгруппировать по измерение1

2 845 080 за 8.144 сек
   1Сергей
 
14 - 29.11.18 - 11:48
(13) не чистый эксперимент
   novichok79
 
15 - 29.11.18 - 11:48
это в тестовой базе, на реальной базе объем данных в 30 раз больше
   novichok79
 
16 - 29.11.18 - 11:48
(14) отчего ж, типа закешировались результаты уже, да?
   Вафель
 
17 - 29.11.18 - 11:50
(16) у тебя выделенный сервер без нагрузки для тестов? каждый раз перезапускал?
   1Сергей
 
18 - 29.11.18 - 11:52
(16) да
   novichok79
 
19 - 29.11.18 - 12:13
(17) да, сервер без нагрузки, фоновые отключены.
   novichok79
 
20 - 29.11.18 - 12:14
(18) перезапускал по 3 раза каждый запрос в рандомном порядке. разница в десятых долях секунд есть. но все равно 19 и 8 секунд по сути.
   palsergeich
 
21 - 29.11.18 - 12:17
(20) А никто не говорит что вложенный запрос - всегда плохо.
Да он часто ведет к проблемам, но на объединении как правило быстрее работае, потому что если данных много - не надо сохранять промежуточные данные
   novichok79
 
22 - 29.11.18 - 12:17
(17) сервак не перезапускал, геморно слишком.
   palsergeich
 
23 - 29.11.18 - 12:17
(20) Технически между 1 и 2 нет разницы
   palsergeich
 
24 - 29.11.18 - 12:18
Оператор Объединить работает как РАЗЛИЧНЫЕ.
Группировка на сколько мне известно часто показывает лучший результат
   palsergeich
 
25 - 29.11.18 - 12:23
В документации использование оператора Объединить - крайне нерекомендовано из-за особенности его выполнения.
   novichok79
 
26 - 29.11.18 - 12:28
(25) спасибо за ликбез. практика и выявила все.
   КонецЦикла
 
27 - 29.11.18 - 12:36
Смысл использовать вложение если без него можно обойтись
Надо исходить из задачи
   novichok79
 
28 - 29.11.18 - 12:40
(27) это кусок пользовательского интерфейса, на рабочей базе 62 127 012 записей выбираются за 127 секунд запросом с вложенной выборкой и 516 секунд с использованием ОБЪЕДИНИТЬ
пусть лучше выбирается за 127 секунд.
   Вафель
 
29 - 29.11.18 - 12:42
те какая то форма открывалась 10 мин, а теперь 2?
   Cyberhawk
 
30 - 29.11.18 - 12:45
(28) Т.е. у твоего запроса объединение в подчиненном (вложенном) запросе быстрее, чем объединение без подчиненного (вложенного) запроса, так?
   breezee
 
31 - 29.11.18 - 12:50
А почему запрос вложенный, а не временная таблица?
   novichok79
 
32 - 29.11.18 - 12:51
(31) тип со временной таблой будет еще быстрее?
   1Сергей
 
33 - 29.11.18 - 12:54
(32) её править легче. Правила хорошего тона для одинесников, так сказать
 
 
   breezee
 
34 - 29.11.18 - 12:54
(32) Если верить книжки и практике, то да. Я бы еще попробовал вариант:
выбрать рег1.измерение1 из регистрсведений.рег1 как рег1
объединить
выбрать рег2.измерение1 из регистрсведений.рег2 как рег2
поместить вт_измерений;
выбрать рег1.измерение1 сгруппировать по рег1.измерение1

синтаксис кривой, конечно, но идею, надеюсь донес)
   novichok79
 
35 - 29.11.18 - 13:18
(33) это понятно, просто потом все равно вложенный запрос убивается. зачем класть его во временную таблицу, если ей не пользоваться в других местах в итоге?
(34) понял, вынести вложенный запрос во временную таблицу.
   palsergeich
 
36 - 29.11.18 - 13:21
на 30+ миллионах записей я бы поосторожнее со временными таблицами был
   palsergeich
 
37 - 29.11.18 - 13:23
Запись во временную таблицу она ни разу не бесплатная
   rs_trade
 
38 - 29.11.18 - 13:23
(34) то есть выбрать 1000 записей, потом записать на диск их, потом снова выбрать, это будет быстрее чем просто выбрать 1000 записей?

вы с какой субд работаете где так все происходит?
   palsergeich
 
39 - 29.11.18 - 13:26
(38) ладно 1000 то еще скорее всего в память поместится, там разницы скорее всего не будет.
А вот 30M точно будут скидыватся на диск + сгруппировать скорее всего принесет сюрприз
   palsergeich
 
40 - 29.11.18 - 13:27
А еще доступ дать к этой обработке паре десяктов пользователей и можно outofmemory поймать
   rs_trade
 
41 - 29.11.18 - 13:29
(39) 1000 это просто пример. люди вообще не отдупляют как запросы к субд работают. на 40 постов гадание на кофейной гуще, вместо того что-бы уделить 4 минуты и сравнить 2 плана запроса.
   palsergeich
 
42 - 29.11.18 - 13:30
По крайней мере на 1С эксперт одна из главных рекомендаций не использовать ВТ, особенно на больших выборках без жизненной на это необходимости.
   palsergeich
 
43 - 29.11.18 - 13:31
(41) Угу
   novichok79
 
44 - 29.11.18 - 13:39
(41) план запроса и любой 1сер сможет глянуть, а вот теоретически доказать, тут нужны знания ))))
   rs_trade
 
45 - 29.11.18 - 13:41
(44) теоретически доказать - это пофлудить на форуме. посмотреть планы и сравнить cost, тут нужны знания
   rs_trade
 
46 - 29.11.18 - 13:45
(44) оптимальность выполнения запросов и оценивают по плану запроса, по его стоимости, а не рассуждая теоретически.
   DrWatson
 
47 - 29.11.18 - 13:55
А что за особенность у Объединить, что она работает дольше чем группировка?
   novichok79
 
48 - 29.11.18 - 13:58
(45) ок, убедил. присоединяюсь к (47).
   palsergeich
 
49 - 29.11.18 - 13:59
 
 Рекламное место пустует
   palsergeich
 
50 - 29.11.18 - 14:01
(47) Объединить - в тексте запроса приводит к появлению ключевого слова district
Ну а группировка это группировка, будут совершенно разные планы запросов
   rs_trade
 
51 - 29.11.18 - 14:03
(50) с чего бы это? откуда там дистинкт? да и дистинкт, это обычно хорошо, потому что быстрее. ни с чем не путаешь?
   palsergeich
 
52 - 29.11.18 - 14:05
(51) Вот смотрю длительные запросы и в половине
UNION ALL SELECT DISTINCT
после переписывания этот запрос из длительных пропадает
   rs_trade
 
53 - 29.11.18 - 14:07
(52) а длительность то на каких операциях плана запроса? у тебя мож тупо в индекс не попадает.
   rs_trade
 
54 - 29.11.18 - 14:08
(52) UNION никак не связан с DISTINCT
   palsergeich
 
55 - 29.11.18 - 14:11
(53)
'SELECT DISTINCT
Q_001_T_002.Q_001_F_000 Q_001_F_000,
CASE  WHEN (Q_001_T_001.Q_001_F_003 = DATETIME(2100,1,1)) THEN DATETIME(1,1,1) ELSE Q_001_T_001.Q_001_F_003 END  Q_001_F_001,
Q_001_T_001.Q_001_F_004 Q_001_F_002
INTO #Tfc2cfeef303e4d67bf9f9b290bbd740b
FROM
#T579b40d3cf1a40318f9d0b41de3c9556 Q_001_T_001 INNER JOIN #Tc13767f46d0645fba30154096d051a66 Q_001_T_002 ON (((Q_001_T_001.Q_001_F_000_00 = Q_001_T_002.Q_001_F_002_00) AND (Q_001_T_001.Q_001_F_001 = Q_001_T_002.Q_001_F_001)) AND (Q_001_T_001.Q_001_F_002 = Q_001_T_002.Q_001_F_003))
UNION ALL
SELECT DISTINCT
Q_002_T_002.Q_001_F_000,
CASE  WHEN (Q_002_T_001.Q_001_F_004 = DATETIME(2100,1,1)) THEN DATETIME(1,1,1) ELSE Q_002_T_001.Q_001_F_004 END ,
Q_002_T_001.Q_001_F_005
FROM
#T4fe24e94d41c4cfda8bcd0b9cd905e37 Q_002_T_001 INNER JOIN #T1441c665115e4cb69588f2f73dc180a5 Q_002_T_002 ON ((((Q_002_T_001.Q_001_F_000 = Q_002_T_002.Q_001_F_001) AND (Q_002_T_001.Q_001_F_001 = Q_002_T_002.Q_001_F_003)) AND (Q_002_T_001.Q_001_F_002 = Q_002_T_002.Q_001_F_004)) AND (Q_002_T_001.Q_001_F_003 = Q_002_T_002.Q_001_F_002))

Вот простой запрос, полное попадание в индекс. Время выполнения 8с
Если объединить заменить на Объединить Все с последующей групировкой - менее 1с
   palsergeich
 
56 - 29.11.18 - 14:12
Прямо из ТЖ достал
   palsergeich
 
57 - 29.11.18 - 14:13
Я бы фото самого запроса дал, но у меня больше нет доступа к той базе
   rs_trade
 
58 - 29.11.18 - 14:16
(57) нужен план из консоли в формате .sqlplan. или в xml
   palsergeich
 
59 - 29.11.18 - 14:18
(58) Доступа к профайлеру нет.
Исправлял прям так.
Было плохо стало хорошо.
Возможно можно и лучше, но заказчик доволен
   palsergeich
 
60 - 29.11.18 - 14:18
Ну и естественно доступ сейчас туда у меня уже закрыт...
   DrWatson
 
61 - 29.11.18 - 14:20
А это не тот SELECT DISTINCT, который генерируется при ВЫБРАТЬ РАЗЛИЧНЫЕ?
   rs_trade
 
62 - 29.11.18 - 14:21
(61) конечно тот. и тот UNION  который ОБЪЕДИНИТЬ
   palsergeich
 
63 - 29.11.18 - 14:21
(61) нет, ключевого слова РАЗЛИЧНЫЕ в тексте запроса 1с не было.
   DrWatson
 
64 - 29.11.18 - 14:27
(63) Хочешь сказать, что это ОБЪЕДИНИТЬ так развернулось в UNION ALL SELECT DISTINCT?
Какое-то удивительное решение.
   palsergeich
 
65 - 29.11.18 - 14:33
Странно
Сейчас на демо базе попробовал - там
INSERT INTO ВременнаяТаблица1 WITH(TABLOCK) (_Q_000_F_000RRef) SELECT
T1.Ссылка
FROM Справочник._ДемоНоменклатура T1
WHERE (T1.ОбластьДанныхОсновныеДанные = ?)
UNION SELECT
T2.Ссылка
FROM Справочник._ДемоНоменклатура T2
WHERE (T2.ОбластьДанныхОсновныеДанные = ?)
p_0: 0N
p_1: 0N
Но я точно помню что в том случае не было слова РАЗЛИЧНЫЕ.
Может я уже того?(
   rs_trade
 
66 - 29.11.18 - 14:37
(65) в общем случае DISTINCT как правило прибавляет производительности из-за того что обрабатывается меньшее кол-во строк.
   nicxxx
 
67 - 29.11.18 - 14:56
(66) Подсказка DISTINCT это операция "Distinct sort", которая, как-бы, тоже имеет свою стоимость. И надо смотреть на то, на каком шаге запроса это используется. Если в конце -  то производительности это не добавляет, а убавляет. Если где-то в начале, а затем над полученной выборкой еще выполняются действия, тогда может и прибавит скорости запросу. А может и нет.
   rs_trade
 
68 - 29.11.18 - 15:12
(67) откуда теперь уже sort прилип к distinct?
   xXeNoNx
 
69 - 29.11.18 - 15:13
(66) а шо там с затратами на сортировку при использовании DISTINCT&
   xXeNoNx
 
70 - 29.11.18 - 15:17
(68) а как оно выбирает различные?
   rs_trade
 
71 - 29.11.18 - 15:23
(70) внутреннего алгоритма я не знаю. типа кроме как сортировкой уникальные записи не отобрать? нет больше алгоритмов, да?
   xXeNoNx
 
72 - 29.11.18 - 15:23
(68) Какбэ намекну..., для того что бы выбрать различные, данные нужно отсортировать или нет?
   rs_trade
 
73 - 29.11.18 - 15:23
да и вообще. причем тут сортировка, когда речь идет о уникальности
   rs_trade
 
74 - 29.11.18 - 15:29
(72) от алгоритма зависит
   rs_trade
 
75 - 29.11.18 - 15:33
глянул простой случай, distinct использует Stream Aggregate. Сортировка есть, да. Но если выходной набор гораздо меньше, вполне оправдано.
   xXeNoNx
 
76 - 29.11.18 - 15:33
(71) Для того выбрать уникальные значения их необходимо отсортировать, затем сравниваются соседние на уникальность.

ЗадачаОтвет: Есть 2 списка значений, нужно оптимально сформировать 3-й список уникальных значений.

Можно перебирать все во вложенных циклах, например сваливаем все в один список, затем добавляем элемент в другой список, в цикле проверяя нет ли такого элемента уже в списке

А Можно отсортировать итоговый список и в один цикл(без вложенных) добавить уникальные значения в список #3
   rs_trade
 
77 - 29.11.18 - 15:34
данные сортируются в момент чтения из памяти
   xXeNoNx
 
78 - 29.11.18 - 15:35
(74) как скуль это делает?
   rs_trade
 
79 - 29.11.18 - 15:36
(78) в (75) написал. https://docs.microsoft.com/ru-ru/previous-versions/sql/sql-server-2008/ms189907(v%3dsql.100)

при чтении сразу сортирует
   Вафель
 
80 - 29.11.18 - 15:50
(75) Stream Aggregate вроде только на сортированных таблицах
http://www.sql.ru/articles/mssql/2007/070602streamaggregate.shtml
   xXeNoNx
 
81 - 29.11.18 - 15:56
(79) неохота самому замеры делать
вот по ссылочке 3-й пост
https://community.oracle.com/thread/2547409
   dezss
 
82 - 29.11.18 - 15:57
(76) ок...а как тогда делается группировка и почему она быстрей отрабатывает?
   Buster007
 
83 - 29.11.18 - 15:59
после заявлений некоторых персонажей в теме, решил проверить а есть ли там дистинкт или нет, а уж про сортировку, о которой я знал, начал сомневаться, но нет

простой запрос:
ВЫБРАТЬ
1 п1,
2 п2,
3 п3
Поместить Т1
Объединить все

Выбрать
1,
2,
3
;
Выбрать
п1,
п2,
п3
Из
Т1

Объединить

Выбрать
1,
2,
3

результат
1, 2, 3

план запроса
Sort(DISTINCT ORDER BY:([Union1008] ASC, [Union1009] ASC, [Union1010] ASC))
Concatenation
Compute Scalar
    Table Scan
Constant Scan
   Buster007
 
84 - 29.11.18 - 16:00
+(83) duration 17
вес сорт дистинкт 78%
   dezss
 
85 - 29.11.18 - 16:02
(76) Все зависит от набора данных...к тому же, можно добавлять в хэш-таблицу, тогда поиск по ней будет быстрей и не факт, что сортировка исходной будет эффективней.
   Buster007
 
86 - 29.11.18 - 16:12
Запросы
ВЫБРАТЬ
п1,
п2,
п3
Из
(Выбрать
п1,
п2,
п3
Из
Т1

Объединить все

Выбрать
1,
2,
3) КАК Т
СГРУППИРОВАТЬ ПО
п1, п2, п3

и

ВЫБРАТЬ РАЗЛИЧНЫЕ
п1,
п2,
п3
Из
(Выбрать
п1,
п2,
п3
Из
Т1

Объединить все

Выбрать
1,
2,
3) КАК Т

один и тот же план время выполнения
   xXeNoNx
 
87 - 29.11.18 - 16:13
(82) Группировка тоже имеет SORT!
   Buster007
 
88 - 29.11.18 - 16:16
сейчас что-нибудь посложнее возьму
   xXeNoNx
 
89 - 29.11.18 - 16:18
(85) хм.., а сколько времени уйдет на формирование хэшей в этой таблице?
   rs_trade
 
90 - 29.11.18 - 16:19
(87) да много чего имеет. Джойны некоторые. Мердж джойн по моему точно.
   Вафель
 
91 - 29.11.18 - 16:20
(90) мердж джой делается только по отсортированным (индексирвоанным) таблицам. иначе хэш джойн
   rs_trade
 
92 - 29.11.18 - 16:20
Но когда это по полю с упорядоченным индексом, вроде как не страшно
   Buster007
 
93 - 29.11.18 - 17:04
как не напиши запрос - всегда один план получается
   dezss
 
94 - 29.11.18 - 17:22
(89) Я и говорю, что все зависит от данных. Если часто повторяются и нужно будет больше читать, чем писать, то эффективней будет хэш-таблица, если нет, то, скорей всего, сортировка.
   dezss
 
95 - 29.11.18 - 17:22
(87) а почему она тогда быстрей?
   Buster007
 
96 - 29.11.18 - 17:25
у кого есть постгри, попробуйте там
   xXeNoNx
 
97 - 29.11.18 - 17:37
(95) Быстрее чего?
И почему быстрее?
   xXeNoNx
 
98 - 29.11.18 - 17:43
(94) Можно конкретные примеры этих волшебных данных?
   novichok79
 
99 - 29.11.18 - 18:09
(96) есть постгри на домашнем серваке, но базы на нем мелкие.
   novichok79
 
100 - 29.11.18 - 18:09
сотенко
  1  2   

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует