[Oracle] Ускорить выборку из 17 млн строк.
От: michael_isu Беларусь  
Дата: 14.02.12 12:26
Оценка:
Всем привет.

Есть таблица, в которой 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 секунд. Как можно ускорить его работу?
Re: [Oracle] Ускорить выборку из 17 млн строк.
От: av12  
Дата: 14.02.12 12:51
Оценка: 4 (1)
Здравствуйте, 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 секунд. Как можно ускорить его работу?


use partitions
Re: [Oracle] Ускорить выборку из 17 млн строк.
От: Centaur Россия  
Дата: 14.02.12 15:19
Оценка: 1 (1)
Здравствуйте, 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.
Re: [Oracle] Ускорить выборку из 17 млн строк.
От: batu Украина  
Дата: 14.02.12 15:43
Оценка:
Здравствуйте, 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 секунд. Как можно ускорить его работу?

Так не добавляй новые пока не выберешь, а храни их в отдельной таблице. В этой таблице и группируй, а потом уже добавляй или что там надо...
Re: [Oracle] Ускорить выборку из 17 млн строк.
От: pagrus  
Дата: 16.02.12 09:17
Оценка: +2
_>Запрос выполняется 160 секунд. Как можно ускорить его работу?

Можно план выполнения запроса и DDL таблицы с индексами в студию? А также как собирается статистика по таблице?

Если добавляется 150 строк в минуту, и вы хотите получить данные за последнюю минуту, то всё должно летать. 160 секунд — это скорей всего какая-нибудь очень простая ощибка, типа непопадания в индекс.

Первое, что вы хотите сделать с медленным запросом, это посмотреть план его исполнения. Без этого оптимизация — гадание на кофейной гуще.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.