CftClub.ru
Клуб специалистов ЦФТ-Банк

Зависает вьюха 'Проверка на причастность к терроризму'
На страницу Пред.  1, 2
 
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle
Предыдущая тема :: Следующая тема  
Автор Сообщение
timochev
Эксперт


Вступление в Клуб: 02.07.2007
СообщениеЧт Дек 20, 2012 12:46    Ответить с цитатой
Полезность: Нет оценки
Volod пишет:
сунуть в where селекта f (обернуть селектом текущую выборку)?

уже смысл запроса изменится и first_value будет работать нет над всем массивом проверок, а только над записями TERRORIST_AUTO, EXTREMIST_AUTO и NEED_CHECK

еще пробовали вот так, но положительного результата нет
Код:
type main is
   select z(
            z.Class_Id         : CLASS_ID     
            , z.C_REGISTR_NUM   : C_REGISTR_NUM
            , z.C_CLIENT_NAME   : C_CLIENT_NAME
            , z.C_INN           : C_INN       
            , mark.[ CODE ]       : C_IS_SUSPECT
            , z.CH_VAL         : C_VAL
         ) in
      (
      select u1(
            u1%id            :   ID
            ,u1%class         :   Class_Id
            ,u1.[REGISTR_NUM]   :    C_REGISTR_NUM
                , u1.[NAME]         :    C_CLIENT_NAME
                , u1.[INN]         :    C_INN                 
            ,(   select x( distinct analytic(first_value(x.[CHECK_VAL]), 'over (order by [1] desc)', x.[CHECK_DATE]))
                  in   ::[CL_CHECK_RESULT]
               where   x.[CHECK_OBJ] = u1
                  and x.[CHECK_TYPE]+0 = ::[CLIENT_CHECKS]([ CODE ] = 'TERROR_LIST')
            )                :   ch_val
            )
         
      in   ::[CLIENT]
      ), 
      ([P207_TERROR_FLAG] all : mark)
      where mark = z.CH_VAL
      and z.CH_VAL  in
                     ( ::[P207_TERROR_FLAG]([ CODE ] = 'TERRORIST_AUTO')
                     , ::[P207_TERROR_FLAG]([ CODE ] = 'EXTREMIST_AUTO')
                     , ::[P207_TERROR_FLAG]([ CODE ] = 'NEED_CHECK')
                     )
;
Random
Эксперт


Вступление в Клуб: 27.06.2011
СообщениеПн Дек 24, 2012 14:12    Ответить с цитатой
Полезность: Нет оценки
timochev пишет:
Volod пишет:
сунуть в where селекта f (обернуть селектом текущую выборку)?

уже смысл запроса изменится и first_value будет работать нет над всем массивом проверок, а только над записями TERRORIST_AUTO, EXTREMIST_AUTO и NEED_CHECK

еще пробовали вот так, но положительного результата нет
Код:
type main is
   select z(
            z.Class_Id         : CLASS_ID     
            , z.C_REGISTR_NUM   : C_REGISTR_NUM
            , z.C_CLIENT_NAME   : C_CLIENT_NAME
            , z.C_INN           : C_INN       
            , mark.[ CODE ]       : C_IS_SUSPECT
            , z.CH_VAL         : C_VAL
         ) in
      (
      select u1(
            u1%id            :   ID
            ,u1%class         :   Class_Id
            ,u1.[REGISTR_NUM]   :    C_REGISTR_NUM
                , u1.[NAME]         :    C_CLIENT_NAME
                , u1.[INN]         :    C_INN                 
            ,(   select x( distinct analytic(first_value(x.[CHECK_VAL]), 'over (order by [1] desc)', x.[CHECK_DATE]))
                  in   ::[CL_CHECK_RESULT]
               where   x.[CHECK_OBJ] = u1
                  and x.[CHECK_TYPE]+0 = ::[CLIENT_CHECKS]([ CODE ] = 'TERROR_LIST')
            )                :   ch_val
            )
         
      in   ::[CLIENT]
      ), 
      ([P207_TERROR_FLAG] all : mark)
      where mark = z.CH_VAL
      and z.CH_VAL  in
                     ( ::[P207_TERROR_FLAG]([ CODE ] = 'TERRORIST_AUTO')
                     , ::[P207_TERROR_FLAG]([ CODE ] = 'EXTREMIST_AUTO')
                     , ::[P207_TERROR_FLAG]([ CODE ] = 'NEED_CHECK')
                     )
;


Вы издеваетесь, да?!

Зачем, скажите, ЗАЧЕМ вы используете здесь аналитические функции?!

Код:

select u(   u.[REGISTR_NUM]
   ,   u.[NAME]
   ,   u.[INN]
   ,   nvl(   (   select f(   1  -- Вытаскивайте здесь что угодно, только в одно поле, например, f.check_type
               ) in ::[CL_CHECK_RESULT] all
               where   f.[CHECK_OBJ] = u
                  and f.check_type in (
                     ::[P207_TERROR_FLAG]([ CODE ] = 'TERRORIST_AUTO')
                  ,   ::[P207_TERROR_FLAG]([ CODE ] = 'EXTREMIST_AUTO')
                  ,   ::[P207_TERROR_FLAG]([ CODE ] = 'NEED_CHECK')
                                    )
               )
         ,   0)   :IS_TERRORIST
--                  , f.val.[ CODE ]                     : C_IS_SUSPECT
) in ::[CLIENT]
;


Последний раз редактировалось: Random (Пн Дек 24, 2012 14:18), всего редактировалось 1 раз
timochev
Эксперт


Вступление в Клуб: 02.07.2007
СообщениеПн Дек 24, 2012 14:17    Ответить с цитатой
Полезность: Нет оценки
Random пишет:
Вы издеваетесь, да?!
Зачем, скажите, ЗАЧЕМ вы используете здесь аналитические функции?!

Аналитическая функция здесь для вычисления текущего значения CHECK_VAL для клиента. Текущим является значение, сохраненное в ::[CL_CHECK_RESULT] на максимальную дату CHECK_DATE.
А что не так?
Random
Эксперт


Вступление в Клуб: 27.06.2011
СообщениеПн Дек 24, 2012 14:23    Ответить с цитатой
Полезность: 1
timochev пишет:
Random пишет:
Вы издеваетесь, да?!
Зачем, скажите, ЗАЧЕМ вы используете здесь аналитические функции?!

Аналитическая функция здесь для вычисления текущего значения CHECK_VAL для клиента. Текущим является значение, сохраненное в ::[CL_CHECK_RESULT] на максимальную дату CHECK_DATE.
А что не так?


Да понимаете ли, лично я сторонник наиболее простых решений. В том запросе выше - сам чёрт ногу сломит.
Переписал кусок подзапроса в реквизите для учёта даты.
Код:

select u(
...
,(
substr(
(
select f( max(to_char(f.CHECK_DATE,'yyyymmddhh24miss')||f.check_val)
) in ::[CL_CHECK_RESULT] all
where   f.[CHECK_OBJ] = u
and f.[CHECK_TYPE]+0 = ::[CLIENT_CHECKS]([ CODE ] = 'TERROR_LIST')
), 15) :F_CHECK_VAL -- значение CHECK_VAL
...
) in ::[CLIENT]
;


Последний раз редактировалось: Random (Пн Дек 24, 2012 14:27), всего редактировалось 1 раз
timochev
Эксперт


Вступление в Клуб: 02.07.2007
СообщениеПн Дек 24, 2012 14:27    Ответить с цитатой
Полезность: Нет оценки
Но это дистрибутивное представление. Появлиять на способ написания не могу.
Но Ваш вариант попробую. Спасибо!
Random
Эксперт


Вступление в Клуб: 27.06.2011
СообщениеПн Дек 24, 2012 14:30    Ответить с цитатой
Полезность: Нет оценки
timochev пишет:
Но это дистрибутивное представление. Появлиять на способ написания не могу.
Но Ваш вариант попробую. Спасибо!


Что ж, если дистрибутивное.

Думаете, у нас в ЦФТ нет таких "грамотных" ребят, которые норовят атомный генератор к телеге прикрутить?

Заводите заявку, указывайте причину - невразумительное время работы, приводите цифры, что с оптимизированным запросом вьюшка работает в разы быстрее, и просите повлиять на качество кода.

Цифры в руках бухгалтера (в данном случае оптимизатора) - всё равно что кольт в руках ковбоя Smile
timochev
Эксперт


Вступление в Клуб: 02.07.2007
СообщениеПн Дек 24, 2012 14:33    Ответить с цитатой
Полезность: Нет оценки
Заявка есть. Разбираемся с октября. Накатываю хранилища, строю индексы, собираю статистику и отсылаю трейсы.
Random
Эксперт


Вступление в Клуб: 27.06.2011
СообщениеПн Дек 24, 2012 14:47    Ответить с цитатой
Полезность: 2
timochev пишет:
Заявка есть. Разбираемся с октября. Накатываю хранилища, строю индексы, собираю статистику и отсылаю трейсы.


Сочувствую. Пришлите вашему разработчику нижеследующий вариант:
Код:

type main is
   select z(
             z.REGISTR_NUM   : C_REGISTR_NUM
            , z.NAME   : C_CLIENT_NAME
            , z.INN           : C_INN       
            ,   substr(   
                     (   select x(max(to_char(x.[CHECK_DATE],'yyyymmddhh24miss') || x.[CHECK_VAL].CODE)
                        ) in ::[CL_CHECK_RESULT] all
                        where   x.[CHECK_OBJ] = z
                           and   x.[CHECK_TYPE] = ::[CLIENT_CHECKS]([ CODE ] = 'TERROR_LIST')
                           and x.[CHECK_VAL].CODE in (   'TERRORIST_AUTO'
                                                ,   'EXTREMIST_AUTO'
                                                ,   'NEED_CHECK' )
                     ), 15
               )            : C_IS_SUSPECT
--            , z.CH_VAL         : C_VAL
         ) in ::[CLIENT] all
;


Ах, да...
Индекс пригодится только один - на ТБП ::[CLIENT_CHECKS] // исправление: ::[CL_CHECK_RESULT], конечно же
, включающий поля:
CHECK_OBJ, CHECK_TYPE, CHECK_DATE. Можно, чтобы совсем доступ к таблице исключить, добавить поле CHECK_VAL.


Последний раз редактировалось: Random (Ср Дек 26, 2012 07:40), всего редактировалось 2 раз(а)
Random
Эксперт


Вступление в Клуб: 27.06.2011
СообщениеПн Дек 24, 2012 14:53    Ответить с цитатой
Полезность: Нет оценки
timochev пишет:
Заявка есть. Разбираемся с октября. Накатываю хранилища, строю индексы, собираю статистику и отсылаю трейсы.


Ех... Все бы заявки были такими...
Как просто было бы жить...

Мне бы кто помог...
vtar
Эксперт


Вступление в Клуб: 20.03.2009
СообщениеПн Дек 24, 2012 16:48    Ответить с цитатой
Полезность: Нет оценки
Random пишет:

Мне бы кто помог...

Врачу - исцелися СамЪ (C)
timochev
Эксперт


Вступление в Клуб: 02.07.2007
СообщениеВт Дек 25, 2012 09:52    Ответить с цитатой
Полезность: Нет оценки
Попробовал следующую версию. Отработала за 45 минут.
Код:
type main is
select j(   j.class_id          : class_id,
         j.C_CLIENT_NAME    : C_CLIENT_NAME,
         j.C_IS_SUSPECT       : C_IS_SUSPECT)
   in
   (select z(
            z%id             : ID
            , z%class          : CLASS_ID
            , z.REGISTR_NUM      : C_REGISTR_NUM
            , z.NAME            : C_CLIENT_NAME
            , z.INN              : C_INN       
            ,   substr(   
                     (   select x(max(to_char(x.[CHECK_DATE],'yyyymmddhh24miss') || x.[CHECK_VAL].CODE)
                        ) in ::[CL_CHECK_RESULT] all
                        where   x.[CHECK_OBJ] = z
                           and   x.[CHECK_TYPE]+0 = ::[CLIENT_CHECKS]([ CODE ] = 'TERROR_LIST')
                     ), 15)      : C_IS_SUSPECT
         ) in ::[CLIENT] all
   )
   where j.C_IS_SUSPECT in ('TERRORIST_AUTO','EXTREMIST_AUTO','NEED_CHECK')
;
Random
Эксперт


Вступление в Клуб: 27.06.2011
СообщениеСр Дек 26, 2012 07:33    Ответить с цитатой
Полезность: Нет оценки
timochev пишет:
Попробовал следующую версию. Отработала за 45 минут.

Это хорошо или плохо?
Random
Эксперт


Вступление в Клуб: 27.06.2011
СообщениеСр Дек 26, 2012 07:34    Ответить с цитатой
Полезность: Нет оценки
vtar пишет:
Random пишет:

Мне бы кто помог...

Врачу - исцелися СамЪ (C)

Это уже не лечится. Мне нужно добавить функционала в синтаксис Oracle...
timochev
Эксперт


Вступление в Клуб: 02.07.2007
СообщениеСр Дек 26, 2012 09:44    Ответить с цитатой
Полезность: Нет оценки
Random пишет:
timochev пишет:
Попробовал следующую версию. Отработала за 45 минут.

Это хорошо или плохо?

С одной стороны - лучше на 25%, чем тест старого представления.
Но, возможно, повлияло кэширование.
Будем еще смотреть.
timochev
Эксперт


Вступление в Клуб: 02.07.2007
СообщениеЧт Дек 27, 2012 08:01    Ответить с цитатой
Полезность: Нет оценки
пока остановился на таком варианте:
Код:
type main is
select z(   z%id            : ID
            , z%class         : CLASS_ID
            , z.REGISTR_NUM      : C_REGISTR_NUM
           , z.NAME            : C_CLIENT_NAME
           , z.INN              : C_INN
           , substr(max(to_char(x.[CHECK_DATE],'yyyymmddhh24miss')||x.[CHECK_VAL].CODE),15) : C_IS_SUSPECT
            )
      in ::[CLIENT], (::[CL_CHECK_RESULT] all : x)
   where x.[CHECK_TYPE]+0 = ::[CLIENT_CHECKS]([ CODE ] = 'TERROR_LIST')
      and x.[CHECK_OBJ] = z
   group by z%id,z%class,z.REGISTR_NUM,z.NAME,z.INN
   having substr(max(to_char(x.[CHECK_DATE],'yyyymmddhh24miss')||x.[CHECK_VAL].CODE),15) in ('TERRORIST_AUTO','EXTREMIST_AUTO','NEED_CHECK')            
;

на моих данных отрабатывает за 45 мин. (ок.25%экономии)
Показать сообщения:   
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle Часовой пояс: GMT + 3
На страницу Пред.  1, 2
Страница 2 из 2

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Рейтинг@Mail.ru