Есть таблица, в которой 17 млн. записей и туда же активно добавляются новые записи, ~120-150 новых строк в минуту. У каждой записи есть отдельными столбцами дата и время добавления записи — 6 цифр каждый столбец. Нужно выбрать последние добавленные строки за минуту и сгруппировать их.
Запрос такой:
select a_billingname_tr as billingname, count(*) as count from (
select
a_billingname_tr, a_date_exe, a_ltime_exe
from
r_payment
where
a_date_exe = to_char(sysdate, 'YYYYMMDD') and
a_ltime_exe between to_char(sysdate — interval '60' second, 'HH24MISS') and to_char(sysdate, 'HH24MISS')
) t2
group by a_billingname_tr;
Запрос выполняется 160 секунд. Как можно ускорить его работу?
Здравствуйте, michael_isu, Вы писали:
_>Всем привет.
_>Есть таблица, в которой 17 млн. записей и туда же активно добавляются новые записи, ~120-150 новых строк в минуту. У каждой записи есть отдельными столбцами дата и время добавления записи — 6 цифр каждый столбец. Нужно выбрать последние добавленные строки за минуту и сгруппировать их.
_>Запрос такой:
_>select a_billingname_tr as billingname, count(*) as count from ( _> select _> a_billingname_tr, a_date_exe, a_ltime_exe _> from _> r_payment _> where _> a_date_exe = to_char(sysdate, 'YYYYMMDD') and _> a_ltime_exe between to_char(sysdate — interval '60' second, 'HH24MISS') and to_char(sysdate, 'HH24MISS') _> ) t2 _> group by a_billingname_tr;
_>Запрос выполняется 160 секунд. Как можно ускорить его работу?
Здравствуйте, michael_isu, Вы писали:
_>Есть таблица, в которой 17 млн. записей и туда же активно добавляются новые записи, ~120-150 новых строк в минуту. У каждой записи есть отдельными столбцами дата и время добавления записи — 6 цифр каждый столбец. Нужно выбрать последние добавленные строки за минуту и сгруппировать их.
_> where
_> a_date_exe = to_char(sysdate, 'YYYYMMDD') and
_> a_ltime_exe between to_char(sysdate - interval '60' second, 'HH24MISS') and to_char(sysdate, 'HH24MISS')
_>Запрос выполняется 160 секунд. Как можно ускорить его работу?
Для начала убрать извраты с датой/временем и хранить их как стандартный тип datetime.
Здравствуйте, michael_isu, Вы писали:
_>Всем привет.
_>Есть таблица, в которой 17 млн. записей и туда же активно добавляются новые записи, ~120-150 новых строк в минуту. У каждой записи есть отдельными столбцами дата и время добавления записи — 6 цифр каждый столбец. Нужно выбрать последние добавленные строки за минуту и сгруппировать их.
_>Запрос такой:
_>select a_billingname_tr as billingname, count(*) as count from ( _> select _> a_billingname_tr, a_date_exe, a_ltime_exe _> from _> r_payment _> where _> a_date_exe = to_char(sysdate, 'YYYYMMDD') and _> a_ltime_exe between to_char(sysdate — interval '60' second, 'HH24MISS') and to_char(sysdate, 'HH24MISS') _> ) t2 _> group by a_billingname_tr;
_>Запрос выполняется 160 секунд. Как можно ускорить его работу?
Так не добавляй новые пока не выберешь, а храни их в отдельной таблице. В этой таблице и группируй, а потом уже добавляй или что там надо...
_>Запрос выполняется 160 секунд. Как можно ускорить его работу?
Можно план выполнения запроса и DDL таблицы с индексами в студию? А также как собирается статистика по таблице?
Если добавляется 150 строк в минуту, и вы хотите получить данные за последнюю минуту, то всё должно летать. 160 секунд — это скорей всего какая-нибудь очень простая ощибка, типа непопадания в индекс.
Первое, что вы хотите сделать с медленным запросом, это посмотреть план его исполнения. Без этого оптимизация — гадание на кофейной гуще.