производительность запросов, сопоставляющая вызовы по временным меткам без идентификатора / ключа - PullRequest
0 голосов
/ 07 апреля 2019

Я написал этот запрос, который работает, но он просто медленный. У кого-нибудь есть какие-нибудь советы о том, как заставить его работать быстрее?

UCID - это CTE. Сама исходная таблица не имеет индексов, и администраторы баз данных не будут добавлять индексы.

select     /*+ PARALLEL(6) */  *
from ucid d
inner join ucid o on

--call started no more than 15 seconds after origin call
o.segstart between d.SEGSTART - interval '60' SECOND  and d.SEGSTART

-- origin segment stopped exactly when the the destination call stopped
-- OR
-- d segment stopped within 60 seconds of o segment && the o call started             
within 5 seconds before the destination segment
and(o.segstop = d.callstop

or (o.callstart between d.SEGSTART - interval '5' SECOND and d.SEGSTART
and d.segstop between o.segstop and o.segstop + interval '60' SECOND
))
-- the number dialed on the o (origin) call is 8 or less digits
and length(o.dialed_num) <= 8
-- the origin call is a dial out
and o.origlogin is not null    and o.anslogin is null
--the destination call is answered with an unknown origin 
and d.anslogin is not null and d.origlogin is null
-- the origin is a dial out
and o.split1 = -1
-- don't match the same record
and d.CALL_DTL_REC_ID <> o.CALL_DTL_REC_ID

1 Ответ

0 голосов
/ 07 апреля 2019

Вы можете попытаться получить доступ к обеим таблицам в режиме PARALLEL, а затем указать OPTIMIZER, чтобы использовать HASH (вам нужно использовать как можно больше степени распараллеливания):

select   /*+ PARALLEL(d 6)  PARALLEL(o 6) USE_HASH(d o)*/  *
from ucid d
inner join ucid o on

--call started no more than 15 seconds after origin call
o.segstart between d.SEGSTART - interval '60' SECOND  
and d.SEGSTART

-- origin segment stopped exactly when the the destination call stopped
-- OR
-- d segment stopped within 60 seconds of o segment && 
the o call started             
within 5 seconds before the destination segment
and(o.segstop = d.callstop

 or (o.callstart between d.SEGSTART - interval '5' SECOND 
 and d.SEGSTART
 and d.segstop between o.segstop and o.segstop + interval '60' SECOND))
-- the number dialed on the o (origin) call is 8 or less digits
and length(o.dialed_num) <= 8
-- the origin call is a dial out
and o.origlogin is not null    and o.anslogin is null
--the destination call is answered with an unknown origin 
and d.anslogin is not null and d.origlogin is null
-- the origin is a dial out
and o.split1 = -1
-- don't match the same record
and d.CALL_DTL_REC_ID <> o.CALL_DTL_REC_ID;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...