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

Есть документов табличка t вида (doc_id, person_id, doc_type_id,
give_date, expire_date, missed) - (id документа, id человека, id типа
документа, даты выдачи, дата истечения срока действия, потерян ли). Для
того, чтобы узнать актуальные в данный момент документы сдеало view
[src]
create view v as
select * from (
select t.*,
       row_number() over(partition by t.person_id, t.doc_type_id order 
by t.give_date desc) rn
from t)
where rn = 1
and missed = 0
and expire_date <= sysdate

Надо уменьшить время отклика запросов, связывающих вышенаписанное view и
другие таблицы по person_id.

1й вопрос: какой materialized view создать с refresh fast on commit?
Пробовал вышенаписанный запрос, а так же запрос без row_number() с group
by, но materialized view получается без refresh fast on commit.
Разумеется, предикат expire_date <= sysdate убирал при создании
materialized view.

2й вопрос: возможно, изменение схемы поможет уменьшить время отклика?
Помимо денормализации.
23 июн 08, 14:52    [5834466]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте materialized view  [new]
Andrey.L
Member

Откуда: Харьков
Сообщений: 1546
Может стОит переписать запрос?
select *
  from t t1
  where t1.missed = 0
    and t1.expire_date <= sysdate
    and not exists(
      select null 
        from t t2 
        where t2.person_id=t1.person_id 
          and t2.doc_type_id=t1.doc_type_id 
          and t2.missed = 0
          and t2.expire_date <= sysdate
23 июн 08, 15:04    [5834584]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте materialized view  [new]
Andrey.L
Member

Откуда: Харьков
Сообщений: 1546
Закрывающую скобку в конце забыл.
23 июн 08, 15:06    [5834600]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте materialized view  [new]
ВладМ
Member

Откуда: Минск
Сообщений: 41
А запросы разве равнозначны?

Первый вроде выдает на человека последний неистекший непотерянный документ конкретного типа, а второй оставляет только обладателей "единственного" документа в типе?

Или от жары у меня крыша поехала? :))

PS. Как насчет индекса person_id, missed, doc_type_id, give_date desc, expire_date?

Точка вставки missed зависит от связи вьюхи далее, вроде (??).

expire_date в индексе не надо если к табличке все равно придется обращаться
23 июн 08, 17:43    [5835925]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте materialized view  [new]
Andrey.L
Member

Откуда: Харьков
Сообщений: 1546
ВладМ
А запросы разве равнозначны?
Согласен.
Наверное, правильно будет так:
select *
  from t t1
  where t1.missed = 0
    and t1.expire_date <= sysdate
    and not exists(
      select null 
        from t t2 
        where t2.person_id=t1.person_id 
          and t2.doc_type_id=t1.doc_type_id 
 --          and t2.missed = 0
          and t2.give_date > t1.give_date)
Автора нет. Оценку выставить некому.
23 июн 08, 19:27    [5836597]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте materialized view  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 8136
Умница
Привет.

Есть документов табличка t вида
doc_id person_id doc_type_id give_date expire_date missed
id документа id человека id типа документа дата выдачи дата истечения срока действия потерян ли

Для того, чтобы узнать актуальные в данный момент документы сдеало view
create view v as
select * from (
select t.*,
       row_number() over(partition by t.person_id, t.doc_type_id order 
by t.give_date desc) rn
from t)
where rn = 1
and missed = 0
and expire_date <= sysdate
Надо уменьшить время отклика запросов, связывающих вышенаписанное view и
другие таблицы по person_id.

А зачем так сложно? Если я вас правильно понял, тот же результат вы получите так:
create view v 
as
select * from t
where sysdate BETWEEN give_date AND expire_date
  and missed = 0
Поскольку запрашивать вы скорее всего будете для конкретных person_id.
то работать это будет очень быстро при наличии соответствующего индекса.
23 июн 08, 19:30    [5836608]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить