powered by simpleCommunicator - 2.0.28     © 2024 Programmizd 02
Map
Форумы / Informix [игнор отключен] [закрыт для гостей] / Можно ли ускорить выполнение нескольких агрегатных функций в одном запросе?
5 сообщений из 5, страница 1 из 1
Можно ли ускорить выполнение нескольких агрегатных функций в одном запросе?
    #39638220
Vodnik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Использую следующий запрос:
select min(callstart), max(callstart), count(all callid), count(distinct callid) from callrecord
чтобы получить минимальную и максимальную даты начала вызова,
а также число записей - общее и уникальных.
Сравнивая время выполнения этого запроса и каждой его части в отдельности, я пришёл к выводу, что для получения результата Informix пробегает по всей таблице четыре раза.
Нельзя ли как-то заставить Informix вычислить все 4 значения за один проход?
Колонки callstart и callid индексированы, типы DATETIME YEAR TO FRACTION (3) и CHAR(30), соответственно.
...
Рейтинг: 0 / 0
Можно ли ускорить выполнение нескольких агрегатных функций в одном запросе?
    #39638413
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вы показываете не весь запрос ?

select min(callstart), max(callstart), count(all callid), count(distinct callid) from callrecord

min(callstart), max(callstart) -- если есть индекс по callstart, то эти значения обычно можно найти из индекса за сотую долю секунды
count(all callid) = это наверное count(*) тоже должно из индекса быстро извлекаться

надо в общем план запроса смотреть
...
Рейтинг: 0 / 0
Можно ли ускорить выполнение нескольких агрегатных функций в одном запросе?
    #39638608
Vodnik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Денис, Вы абсолютно правы, я просто недостаточно тщательно провёл эксперимент:

select count(all callid) from callrecord
1199265
4 сек

select count(*) from callrecord
1199265
0 сек

select count(distinct callid) from callrecord
1091011
1 мин 00 сек

select min(callstart) from callrecord
2017-05-01 02:11:40.479
0 сек

select max(callstart) from callrecord
2018-04-30 18:27:32.231
0 сек

Казалось бы, всю малину портит select count(distinct callid) from callrecord, но:

select count(*), count(distinct callid), min(callstart), max(callstart) from callrecord
(count(*)) 1199265
(count) 1091011
(min) 2017-05-01 02:11:40.479
(max) 2018-04-30 18:27:32.231
3 мин 20 сек

Почему так? Пробую:

select count(distinct callid) from callrecord;
select count(*) from callrecord;
select min(callstart) from callrecord;
select max(callstart) from callrecord;
1 мин 2 сек
...
Рейтинг: 0 / 0
Можно ли ускорить выполнение нескольких агрегатных функций в одном запросе?
    #39638612
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я догадываюсь почему такая разница, но мне лень разбираться.

Я бы написал так:

Код: sql
1.
2.
3.
4.
5.
6.
select  
   (select count(distinct callid) from callrecord) distinct_callid_cnt,
   (select count(*) from callrecord) count_all,
   (select min(callstart) from callrecord) min_callstart,
   (select max(callstart) from callrecord) max_callstart
FROM table(set{1})
...
Рейтинг: 0 / 0
Можно ли ускорить выполнение нескольких агрегатных функций в одном запросе?
    #39638628
Vodnik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot Журавлев Денис]я догадываюсь почему такая разница, но мне лень разбираться.quot]
Хоть идею подкиньте...

Спасибо за пример!
Он выполнился за 1 минуту.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Informix [игнор отключен] [закрыт для гостей] / Можно ли ускорить выполнение нескольких агрегатных функций в одном запросе?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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