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

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

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

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

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

ну ещё не селектить лишних полей внутри, т.к. сервер это не оптимизирует.
чего-чего?
...
Рейтинг: 0 / 0
Groub by жесток
    #39138180
afgm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Groub by жесток
    #39145134
Cobalt747
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Groub by жесток
    #39145145
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cobalt747,

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


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