Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Нехватка ресурсов - оптимизация  [new]
Katsy
Member

Откуда:
Сообщений: 313
select distinct q.short_name,
       q.parent_contract,
       q.contract_level,
       q.contract_name,
       q.contr_number,
       q.expire_date,
       q.phone_notify1,
       q.phone_notify2,
       q.phone_active,
       q.product,
       q.add_sp_name,
       trunc(q.usage_date) usage_date
from (
select c.short_name short_name,
       cards_reports.main_main(ac.id) parent_contract,
       ac.contract_level contract_level,
       ac.contract_name contract_name,
       ac.contract_number contr_number,
       to_date(ac.card_expire,'YYMM') expire_date,
       ( select ca.address_zip||' - '||decode(ca.is_active,'Y','Active','InActive') 
         from client_address ca
         where ca.acnt_contract__oid = ac.id
           and ca.amnd_state = 'A'
           and ca.address_type = 83
       ) phone_notify1,
       ( select ca.address_zip||' - '||decode(ca.is_active,'Y','Active','InActive')
         from client_address ca
         where ca.acnt_contract__oid = ac.id
           and ca.amnd_state = 'A'
           and ca.address_type = 123
       ) phone_notify2,
       ( select ca.address_zip||' - '||decode(ca.is_active,'Y','Active','InActive')
         from client_address ca
         where ca.acnt_contract__oid = ac.id
           and ca.amnd_state = 'A'
           and ca.address_type = 84
       ) phone_active,          
       pr.name product,
       decode(instr(ap.name,'SMS-NOTIFY'),0,
         decode(instr(ap.name,'SMS-FEE'),0,
           decode(instr(ap.name,'FIN-NOTIFY'),0,'UNCKNOWN'
           ,'FIN-NOTIFY')
         ,'SMS-FEE')
       ,'SMS-NOTIFY') add_sp_name,       
       ua.record_date usage_date,
       decode((max(ua.record_date) over(partition by ac.id,ap.name)), 
              ua.record_date,'Y','N') last_in_range 
from acnt_contract ac,
    usage_action ua,
    add_pack ap,
    add_pack_inc api,
    acnt_contract pac,
    client c,
    appl_product pr
where 
ac.f_i > 0 
and ac.pcat = 'C' 
and ac.amnd_state = 'A'
AND ua.acnt_contract__id = ac.ID
AND ua.start_date < SYSDATE
AND ua.event_type IS NOT NULL
AND ap.serv_pack__oid = ac.serv_pack__id
AND ap.amnd_state = 'A'
AND ap.serv_pack__id = api.add_pack
AND api.acnt_contract__oid = ac.ID
AND api.pack_type = 'S'
AND pac.ID = ows.cards_reports.main_main (ac.ID)
AND c.ID = pac.client__id
AND c.amnd_state = 'A'
AND pr.internal_code(+) = ac.product
AND NVL (pr.amnd_state, 'A') = 'A'
) q
where q.last_in_range = 'Y'
  and q.expire_date <= trunc(sysdate,'MM')

Вот такой запрос у меня не хочет выполняться, ему ресурсов не хватает
21 май 10, 10:18    [8811490]     Ответить | Цитировать Сообщить модератору
 Re: Нехватка ресурсов - оптимизация  [new]
AlexGru
Member

Откуда: Пермь рядом
Сообщений: 1600
Katsy,
Перепишите запрос.

Уберите подзапросы типа

  ( select ca.address_zip||' - '||decode(ca.is_active,'Y','Active','InActive') 
         from client_address ca
         where ca.acnt_contract__oid = ac.id
           and ca.amnd_state = 'A'
           and ca.address_type = 83
       ) phone_notify1,
, переписав их через join или left join как у вас по логике.


Не уверен конкретно в вашем случае, но очень часто требуется distinct,
если запрос не правильно написан. Не знаете свои данные/логику,
отсюда не правильно соединяете, и получается дублирование.
Избавьтесь от distinct.

select distinct q.short_name,
       q.parent_contract,
       q.contract_level,
       q.contract_name,
       q.contr_number,
21 май 10, 10:22    [8811524]     Ответить | Цитировать Сообщить модератору
 Re: Нехватка ресурсов - оптимизация  [new]
AlexFF__|
Member

Откуда:
Сообщений: 2854
Katsy,

У вас distinct сортирует весь результирующий набор
21 май 10, 10:22    [8811525]     Ответить | Цитировать Сообщить модератору
 Re: Нехватка ресурсов - оптимизация  [new]
-2-
Member

Откуда:
Сообщений: 15330
Katsy
ему ресурсов не хватает
create table Ресурсы as select level as Ресурс from dual connect by level <= :нужное_количество_ресурсов;
21 май 10, 10:23    [8811536]     Ответить | Цитировать Сообщить модератору
 Re: Нехватка ресурсов - оптимизация  [new]
AlexGru
Member

Откуда: Пермь рядом
Сообщений: 1600
Зачем использовать "внешнюю фильтрацию" по условию
 and q.expire_date <= trunc(sysdate,'MM')
у вас ведь
to_date(ac.card_expire,'YYMM') expire_date,
21 май 10, 10:27    [8811562]     Ответить | Цитировать Сообщить модератору
 Re: Нехватка ресурсов - оптимизация  [new]
Добрый Э - Эх
Guest
AlexGru
Зачем использовать "внешнюю фильтрацию" по условию
 and q.expire_date <= trunc(sysdate,'MM')
у вас ведь
to_date(ac.card_expire,'YYMM') expire_date,
Возможно из-за того, что результат, вычисляемый аналитическими функция во внутреннем подзапросе, может поменяться...
21 май 10, 10:28    [8811572]     Ответить | Цитировать Сообщить модератору
 Re: Нехватка ресурсов - оптимизация  [new]
Добрый Э - Эх
Guest
AlexGru

Уберите подзапросы типа

  ( select ca.address_zip||' - '||decode(ca.is_active,'Y','Active','InActive') 
         from client_address ca
         where ca.acnt_contract__oid = ac.id
           and ca.amnd_state = 'A'
           and ca.address_type = 83
       ) phone_notify1,
, переписав их через join или left join как у вас по логике.
+1.
Кроме того, можно все эти три подзапроса заменить на один заход в таблицу, с группировкой по ca.acnt_contract__oid и транспонированием по полю ca.address_type.
После чего приджойнить результат ко всему остальному.
21 май 10, 10:35    [8811635]     Ответить | Цитировать Сообщить модератору
 Re: Нехватка ресурсов - оптимизация  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18484
Мне интересно, в чем выражается нехватка ресурсов
RESOURCE_PLAN ?
21 май 10, 10:37    [8811648]     Ответить | Цитировать Сообщить модератору
 Re: Нехватка ресурсов - оптимизация  [new]
Katsy
Member

Откуда:
Сообщений: 313
AlexGru,

запросы переписаны так:
( select ca.address_zip||' - '||decode(ca.is_active,'Y','Active','InActive') 
         from client_address ca
         join acnt_contract ac
         on ca.acnt_contract__oid = ac.id
         where ca.amnd_state = 'A'
           and ca.address_type = 83
       ) phone_notify1,


AlexGru
Зачем использовать "внешнюю фильтрацию" по условию
 and q.expire_date <= trunc(sysdate,'MM')
у вас ведь
to_date(ac.card_expire,'YYMM') expire_date,

так во внутреннем запросе я всего лишь конвертирую в дату, а во внешнем уже фильтрую по системной дате
21 май 10, 10:38    [8811661]     Ответить | Цитировать Сообщить модератору
 Re: Нехватка ресурсов - оптимизация  [new]
Добрый Э - Эх
Guest
Katsy
запросы переписаны так:
( select ca.address_zip||' - '||decode(ca.is_active,'Y','Active','InActive') 
         from client_address ca
         join acnt_contract ac
         on ca.acnt_contract__oid = ac.id
         where ca.amnd_state = 'A'
           and ca.address_type = 83
       ) phone_notify1,

Их не надо переписывать, от них нужно избавляться.



Katsy
так во внутреннем запросе я всего лишь конвертирую в дату, а во внешнем уже фильтрую по системной дате
Одно другому не мешает.
21 май 10, 10:46    [8811731]     Ответить | Цитировать Сообщить модератору
 Re: Нехватка ресурсов - оптимизация  [new]
AlexGru
Member

Откуда: Пермь рядом
Сообщений: 1600
Неее, надо вообще убрать подзапросы эти 3

  ( select ca.address_zip||' - '||decode(ca.is_active,'Y','Active','InActive') 
         from client_address ca
         where ca.acnt_contract__oid = ac.id
           and ca.amnd_state = 'A'
           and ca.address_type = 83
       ) phone_notify1,
       ( select ca.address_zip||' - '||decode(ca.is_active,'Y','Active','InActive')
         from client_address ca
         where ca.acnt_contract__oid = ac.id
           and ca.amnd_state = 'A'
           and ca.address_type = 123
       ) phone_notify2,
       ( select ca.address_zip||' - '||decode(ca.is_active,'Y','Active','InActive')
         from client_address ca
         where ca.acnt_contract__oid = ac.id
           and ca.amnd_state = 'A'
           and ca.address_type = 84
       ) phone_active,          

а тут добавьте что-то типа

from acnt_contract ac,
    usage_action ua,
    add_pack ap,
    add_pack_inc api,
    acnt_contract pac,
    client c,
    appl_product pr

=>

from acnt_contract ac,
    usage_action ua,
    add_pack ap,
    add_pack_inc api,
    acnt_contract pac,
    client c,
    appl_product pr,
    client_address ca

и соответственно присодините к
acnt_contract ac через join или left join (+). Вам виднее.

А логику обработки ca.address_type можно вверху в case оформить.

Если у вас на каждую запись в acnt_contract ac может быть по 3 соответствия в
client_address ca, с разными ca.address_type, то

может стоит присоединить 3 таблички
  client_address ca1,
  client_address ca2,
  client_address ca3

С наложением соотв. фильтров.
ca.address_type = xxx

Так сложно сказать, не зная логики и данных.
21 май 10, 10:47    [8811740]     Ответить | Цитировать Сообщить модератору
 Re: Нехватка ресурсов - оптимизация  [new]
Katsy
Member

Откуда:
Сообщений: 313
AlexGru,

select distinct q.short_name,
       q.parent_contract,
       q.contract_level,
       q.contract_name,
       q.contr_number,
       q.expire_date,
       q.phone_notify1,
       q.phone_notify2,
       q.phone_active,
       q.product,
       q.add_sp_name,
       trunc(q.usage_date) usage_date
from (
select c.short_name short_name,
       cards_reports.main_main(ac.id) parent_contract,
       ac.contract_level contract_level,
       ac.contract_name contract_name,
       ac.contract_number contr_number,
       to_date(ac.card_expire,'YYMM') expire_date,
       case when (ca.address_type = 83) then ca.address_zip||' - '||decode(ca.is_active,'Y','Active','InActive') end phone_notify1,
       case when (ca.address_type = 123) then ca.address_zip||' - '||decode(ca.is_active,'Y','Active','InActive') end phone_notify2,
       case when (ca.address_type = 84) then ca.address_zip||' - '||decode(ca.is_active,'Y','Active','InActive') end phone_active,		  
       pr.name product,
       decode(instr(ap.name,'SMS-NOTIFY'),0,
         decode(instr(ap.name,'SMS-FEE'),0,
           decode(instr(ap.name,'FIN-NOTIFY'),0,'UNCKNOWN'
           ,'FIN-NOTIFY')
         ,'SMS-FEE')
       ,'SMS-NOTIFY') add_sp_name,       
       ua.record_date usage_date,
       decode((max(ua.record_date) over(partition by ac.id,ap.name)), 
              ua.record_date,'Y','N') last_in_range 
from usage_action ua,
    add_pack ap,
    add_pack_inc api,
    acnt_contract pac,
    client c,
    appl_product pr,
    acnt_contract ac
    join client_address ca
    on ca.acnt_contract__oid = ac.id
where --ac.contract_number = '4160840001181814' and 
ac.f_i > 0 
and ca.amnd_state = 'A'
and ac.pcat = 'C' 
and ac.amnd_state = 'A'
AND ua.acnt_contract__id = ac.ID
AND ua.start_date < SYSDATE
AND ua.event_type IS NOT NULL
AND ap.serv_pack__oid = ac.serv_pack__id
AND ap.amnd_state = 'A'
AND ap.serv_pack__id = api.add_pack
AND api.acnt_contract__oid = ac.ID
AND api.pack_type = 'S'
AND pac.ID = ows.cards_reports.main_main (ac.ID)
AND c.ID = pac.client__id
AND c.amnd_state = 'A'
AND pr.internal_code = ac.product
AND NVL (pr.amnd_state, 'A') = 'A'
) q
where q.last_in_range = 'Y'
  and q.expire_date <= trunc(sysdate,'MM')

вот такая красота работает
21 май 10, 11:52    [8812301]     Ответить | Цитировать Сообщить модератору
 Re: Нехватка ресурсов - оптимизация  [new]
Katsy
Member

Откуда:
Сообщений: 313
как прописать
       case when (ca.address_type = 83) then ca.address_zip||' - '||decode(ca.is_active,'Y','Active','InActive') end phone_notify1,
       case when (ca.address_type = 123) then ca.address_zip||' - '||decode(ca.is_active,'Y','Active','InActive') end phone_notify2,
       case when (ca.address_type = 84) then ca.address_zip||' - '||decode(ca.is_active,'Y','Active','InActive') end phone_active,
с else?
31 май 10, 09:28    [8859589]     Ответить | Цитировать Сообщить модератору
 Re: Нехватка ресурсов - оптимизация  [new]
Katsy
Member

Откуда:
Сообщений: 313
Если пишу
       case when (ca.address_type = 83) then ca.address_zip||' - '||decode(ca.is_active,'Y','Active','InActive') phone_notify1 
       when (ca.address_type = 123) then ca.address_zip||' - '||decode(ca.is_active,'Y','Active','InActive') phone_notify2
	   when (ca.address_type = 84) then ca.address_zip||' - '||decode(ca.is_active,'Y','Active','InActive') phone_active end,		  
то ошибка
ORA-00905: missing keyword
31 май 10, 09:33    [8859609]     Ответить | Цитировать Сообщить модератору
 Re: Нехватка ресурсов - оптимизация  [new]
Elic
Member

Откуда:
Сообщений: 29979
Katsy
то ошибка
ORA-00905: missing keyword
Ты не понимаешь разницы между тремя выражениями и одним выражением? И для чего выражению псевдоним и как его использовать?
31 май 10, 09:55    [8859724]     Ответить | Цитировать Сообщить модератору
 Re: Нехватка ресурсов - оптимизация  [new]
Katsy
Member

Откуда:
Сообщений: 313
Elic,

каждый псевдоним - это отдельный столбец в отчете
31 май 10, 10:01    [8859775]     Ответить | Цитировать Сообщить модератору
 Re: Нехватка ресурсов - оптимизация  [new]
Katsy
Member

Откуда:
Сообщений: 313
Пробую так:
select 
       c.short_name short_name,
       cards_reports.main_main(ac.id) parent_contract,
       ac.contract_level contract_level,
       ac.contract_name contract_name,
       ac.contract_number contr_number,
       to_date(ac.card_expire,'YYMM') expire_date,
       ca1.address_zip||' - '||decode(ca1.is_active,'Y','Active','InActive') phone_notify1,
       ca2.address_zip||' - '||decode(ca2.is_active,'Y','Active','InActive') phone_notify2,
       ca3.address_zip||' - '||decode(ca3.is_active,'Y','Active','InActive') phone_active,		  
       pr.name product,
       decode(instr(ap.name,'SMS-NOTIFY'),0,
         decode(instr(ap.name,'SMS-FEE'),0,
           decode(instr(ap.name,'FIN-NOTIFY'),0,'UNCKNOWN'
           ,'FIN-NOTIFY')
         ,'SMS-FEE')
       ,'SMS-NOTIFY') add_sp_name,       
       decode(ua.switch_tag,'Y',decode(api.is_active,'Y','Yes','N'),'N','No',null) is_sp_active,          
       ua.record_date usage_date,
       decode((max(ua.record_date) over(partition by ac.id,ap.name)), 
              ua.record_date,'Y','N') last_in_range
from acnt_contract pac,
     usage_action ua,
     client c,
     add_pack ap,     
     add_pack_inc api,
     acnt_contract ac     
    join client_address ca1
    on ca1.acnt_contract__oid = ac.id
    and ca1.address_type = 83
    join client_address ca2
    on ca2.acnt_contract__oid = ac.id
    and ca2.address_type = 123
    join client_address ca3
    on ca3.acnt_contract__oid = ac.id
    and ca3.address_type = 84        
    join appl_product pr
    on pr.internal_code = ac.product
where ac.f_i > 0
  and ac.pcat = 'C'
  and ac.amnd_state = 'A'
  and api.acnt_contract__oid = ac.id
  and api.pack_type = 'S' 
  and ap.serv_pack__oid = ac.serv_pack__id
  and ap.serv_pack__id = api.add_pack
  and ap.amnd_state = 'A'  
  and nvl(pr.amnd_state, 'A') = 'A'
  and ua.acnt_contract__id = ac.id
  and ua.new_pack =  ap.serv_pack__id 
  and ua.start_date < sysdate
  and ua.event_type is not null
  and pac.id = cards_reports.main_main(ac.id)
  and c.id = pac.client__id
  and c.amnd_state = 'A'

Возвращает пустоту
31 май 10, 10:04    [8859808]     Ответить | Цитировать Сообщить модератору
 Re: Нехватка ресурсов - оптимизация  [new]
Elic
Member

Откуда:
Сообщений: 29979
Katsy
    join client_address ca1
    join client_address ca2
    join client_address ca3
Возвращает пустоту
Ещё десять раз прочитай про outer join.
31 май 10, 10:10    [8859853]     Ответить | Цитировать Сообщить модератору
 Re: Нехватка ресурсов - оптимизация  [new]
Katsy
Member

Откуда:
Сообщений: 313
Elic,

join заменила на full join, работает :-*
31 май 10, 10:38    [8860051]     Ответить | Цитировать Сообщить модератору
 Re: Нехватка ресурсов - оптимизация  [new]
Elic
Member

Откуда:
Сообщений: 29979
Katsy
join заменила на full join, работает :-*
31 май 10, 10:51    [8860159]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить