|
Можно ли ускорить выполнение нескольких агрегатных функций в одном запросе?
|
|||
---|---|---|---|
#18+
Использую следующий запрос: 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), соответственно. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.04.2018, 23:24 |
|
Можно ли ускорить выполнение нескольких агрегатных функций в одном запросе?
|
|||
---|---|---|---|
#18+
вы показываете не весь запрос ? select min(callstart), max(callstart), count(all callid), count(distinct callid) from callrecord min(callstart), max(callstart) -- если есть индекс по callstart, то эти значения обычно можно найти из индекса за сотую долю секунды count(all callid) = это наверное count(*) тоже должно из индекса быстро извлекаться надо в общем план запроса смотреть ... |
|||
:
Нравится:
Не нравится:
|
|||
30.04.2018, 00:56 |
|
Можно ли ускорить выполнение нескольких агрегатных функций в одном запросе?
|
|||
---|---|---|---|
#18+
Денис, Вы абсолютно правы, я просто недостаточно тщательно провёл эксперимент: 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 сек ... |
|||
:
Нравится:
Не нравится:
|
|||
01.05.2018, 01:31 |
|
Можно ли ускорить выполнение нескольких агрегатных функций в одном запросе?
|
|||
---|---|---|---|
#18+
я догадываюсь почему такая разница, но мне лень разбираться. Я бы написал так: Код: sql 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
01.05.2018, 03:49 |
|
|
start [/forum/topic.php?fid=44&msg=39638220&tid=1606746]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
297ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
49ms |
get tp. blocked users: |
2ms |
others: | 261ms |
total: | 656ms |
0 / 0 |