Я пытаюсь ускорить следующее
create table tab2 parallel 24 nologging compress for query high as
select /*+ parallel(24) index(a ix_1) index(b ix_2)*/
a.usr
,a.dtnum
,a.company
,count(distinct b.usr) as num
,count(distinct case when b.checked_1 = 1 then b.usr end) as num_che_1
,count(distinct case when b.checked_2 = 1 then b.usr end) as num_che_2
from tab a
join tab b on a.company = b.company
and b.dtnum between a.dtnum-1 and a.dtnum-0.0000000001
group by a.usr, a.dtnum, a.company;
с помощью индексов
create index ix_1 on tab(usr, dtnum, company);
create index ix_2 on tab(usr, company, dtnum, checked_1, checked_2);
но план выполнения говорит мне, что это будет полное сканирование обоих индексов, и вычисления очень долгие (1 день недостаточно).
О данных. Вкладка «Таблица» содержит более 3 млн записей. Ни один из отдельных столбцов не уникален. Уникальными значениями здесь являются пары (usr, dtnum), где dtnum — это дата со временем, записанная в виде числа в формате yyyy,mmddhh24miss. Столбцы checked_1, checked_2 имеют значения из набора (null, 0, 1, 2). Компания имеет идентификатор компании. Каждая пара может иметь только одно значение checked_1, checked_2 и company, так как она уникальна. Каждый пользователь может быть в нескольких парах с разными dtnum.
Изменить
@Roberto Hernandez: Я прикрепил картинку с планом казни. Что касается параллельного 24, в нашей компании нам говорят создавать таблицы с параметрами «параллельный [число] без логирования сжимать для запроса высокого». Я использую 24, но я не эксперт в этой области.
@Саян Малакшинов: http://sqlfiddle.com/#!4/40b6b/2 Здесь я упростил, указав данные с checked_1 = checked_2, но в реальной жизни это может быть не так.
@scaisEdge: для
create index my_id1 on tab (company, dtnum);
create index my_id2 on tab (company, dtnum, usr);