Зависает вьюха 'Проверка на причастность к терроризму'
На страницу Пред. 1, 2
|
Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
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 пишет: | Но это дистрибутивное представление. Появлиять на способ написания не могу.
Но Ваш вариант попробую. Спасибо! |
Что ж, если дистрибутивное.
Думаете, у нас в ЦФТ нет таких "грамотных" ребят, которые норовят атомный генератор к телеге прикрутить?
Заводите заявку, указывайте причину - невразумительное время работы, приводите цифры, что с оптимизированным запросом вьюшка работает в разы быстрее, и просите повлиять на качество кода.
Цифры в руках бухгалтера (в данном случае оптимизатора) - всё равно что кольт в руках ковбоя  |
|
 |
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%экономии) |
|
 |
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|