Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Groub by жесток / 12 сообщений из 12, страница 1 из 1
24.12.2015, 17:29
    #39137424
Imperous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Groub by жесток
Всем привет!

Есть 3 захитрых запроса связанных через UNION ALL.
Каждый из них по отдельности отрабатывает мгновенно.
Все вместе через юнион - тоже мгновенно.
Но стоит это все завернуть так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select f1,f2,f3,sum(f4), sum(f5)
from (
  select ...
  union all
  select ...
  union all
  select ...
)
group by 1,2,3


И запрос отрабатывает целых 15!!!! сек.

Каждый отдельный запрос завернутый в такую обертку отрабатывает по 7 сек..

Чего можно сделать?
...
Рейтинг: 0 / 0
24.12.2015, 17:31
    #39137426
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Groub by жесток
ImperousЧего можно сделать?
Научиться жать кнопку "Execute and fetch all" вместо простого "Execute" чтобы не бредить
насчёт "отрабатывает мгновенно".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
24.12.2015, 17:34
    #39137433
Imperous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Groub by жесток
Dimitry SibiryakovImperousЧего можно сделать?
Научиться жать кнопку "Execute and fetch all" вместо простого "Execute" чтобы не бредить
насчёт "отрабатывает мгновенно".

красава! :)
...
Рейтинг: 0 / 0
24.12.2015, 17:50
    #39137453
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Groub by жесток
В качестве альтернативы можно обратиться к разработчику этой БД со словами "чо ты за фигню
тут напроектировал, она дохнет на сколь-либо заметных объёмах, переделай быстронах!"
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
24.12.2015, 18:00
    #39137464
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Groub by жесток
ImperousЧего можно сделать?
ничего. union all просто по очереди выбирает записи из запросов, а внешняя выборка с group by вынуждена все это сохранить в сорт-файле, отсортировать, и выдать обратно результат группировки.
Понимание механизма выполнения запросов дает ответ на вопрос "что делать". В данном случае - либо смириться, либо "не делать так".
...
Рейтинг: 0 / 0
24.12.2015, 18:15
    #39137483
Imperous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Groub by жесток
Все норм, я сразу въехал про fetch all :) и все стало на свои места
...
Рейтинг: 0 / 0
25.12.2015, 10:55
    #39137884
afgm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Groub by жесток
Imperous,

зависит от природы данных, но может работать шустрее если группировать уже сгруппированные, т.к. не будет большого выходного набора перед последней группировкой.
...
Рейтинг: 0 / 0
25.12.2015, 11:01
    #39137897
afgm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Groub by жесток
Imperous,

ну ещё не селектить лишних полей внутри, т.к. сервер это не оптимизирует.
...
Рейтинг: 0 / 0
25.12.2015, 13:26
    #39138098
Imperous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Groub by жесток
afgmImperous,

ну ещё не селектить лишних полей внутри, т.к. сервер это не оптимизирует.
чего-чего?
...
Рейтинг: 0 / 0
25.12.2015, 14:12
    #39138180
afgm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Groub by жесток
ImperousafgmImperous,

ну ещё не селектить лишних полей внутри, т.к. сервер это не оптимизирует.
чего-чего?
Тест
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
recreate table test_grouping (
  id integer,
  caption varchar(50),
  val double precision
)


execute block
as
declare variable i int;
begin
  i = 100000;
  while (i>0) do
  begin
   insert into TEST_GROUPING (ID, CAPTION, VAL)
      values (:i, 'VALUE FOR TEST'||:i, 1);
   insert into TEST_GROUPING (ID, CAPTION, VAL)
      values (:i, 'VALUE FOR TEST'||:i, 2);
   insert into TEST_GROUPING (ID, CAPTION, VAL)
      values (:i, 'VALUE FOR TEST'||:i, 3);
    i = i - 1;
  end
end


select val, sum(val), count(val) from
(
    select * from  test_grouping
    union all
    select * from  test_grouping
    union all
    select * from  test_grouping
)
group by val
-- Execute time = 1s 966ms
/*
Select Expression
    -> Aggregate
        -> Sort (record length: 116, key length: 12)
            -> Union
                -> Table "TEST_GROUPING" Full Scan
                -> Table "TEST_GROUPING" Full Scan
                -> Table "TEST_GROUPING" Full Scan
*/

select val, sum(val), count(val) from
(
    select val from  test_grouping
    union all
    select val from  test_grouping
    union all
    select val from  test_grouping
)
group by val
-- Execute time = 1s 513ms
/*
Select Expression
    -> Aggregate
        -> Sort (record length: 60, key length: 12)
            -> Union
                -> Table "TEST_GROUPING" Full Scan
                -> Table "TEST_GROUPING" Full Scan
                -> Table "TEST_GROUPING" Full Scan
*/

select val, sum(val), count(val) from
(
    select val, sum(val) as summa, count(*) as cnt from  test_grouping
    group by val
    union all
    select val, sum(val) as summa, count(*) as cnt from  test_grouping
    group by val
    union all
    select val, sum(val) as summa, count(*) as cnt from  test_grouping
    group by val
)
group by val
-- Execute time = 1s 170ms


Лишние поля:
Sort (record length: 116, key length: 12)
vs
Sort (record length: 60, key length: 12)
...
Рейтинг: 0 / 0
12.01.2016, 09:29
    #39145134
Cobalt747
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Groub by жесток
afgm
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
select val, sum(val), count(val) from
(
    select val from  test_grouping
    union all
    select val from  test_grouping
    union all
    select val from  test_grouping
)
group by val
-- Execute time = 1s 513ms
/*
Select Expression
    -> Aggregate
        -> Sort (record length: 60, key length: 12)
            -> Union
                -> Table "TEST_GROUPING" Full Scan
                -> Table "TEST_GROUPING" Full Scan
                -> Table "TEST_GROUPING" Full Scan
*/


А каким инструментом можно получить план в таком виде?
...
Рейтинг: 0 / 0
12.01.2016, 09:46
    #39145145
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Groub by жесток
Cobalt747,

это explain план из Firebird 3. Его isql и последние версии IBExpert дают такой план.
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Groub by жесток / 12 сообщений из 12, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]