Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
MMT Участник
Вступление в Клуб: 18.10.2010
|
Пн Окт 18, 2010 12:33  Материализованное представление. |
|
Полезность: Нет оценки
|
Доброго дня. Подскажите как можно используя АСД (Администратор словаря данных), создать MATERIALIZED VIEW или же использовать готовое MVIEW в АСД при написаний функций. |
|
 |
lexus Профи
Вступление в Клуб: 28.09.2007
|
Пн Окт 18, 2010 12:59   |
|
Полезность: Нет оценки
|
Создать MV в Админе нельзя. Только sql'ем.
А использовать существующее из операции можно.
Вроде надо было включить query_rewrite_enabled. Возможно, на 10g этого уже не требуется... Не проверял.
Код: | -- begin pl/sql
execute immediate 'alter session set query_rewrite_enabled=true';
dbms_mview.refresh('IBS.MV$FACT_OPER');
-- end pl/sql |
Ну и далее Oracle сам запрос на это представление перенаправит. |
|
 |
MMT Участник
Вступление в Клуб: 18.10.2010
|
Пн Окт 18, 2010 13:54   |
|
Полезность: Нет оценки
|
lexus спасибо за ответ.
1. Что в Админе создать MV нельзя я понял.
2. Вопрос задам поккоректнее: Как сделать так чтобы АСД увидел MV созданное через sql.
Обновление MV не требуется
dbms_mview.refresh ? - зачем он мне.
CREATE MATERIALIZED VIEW CLIENT_DETAIL - т.е. есть MV: CLIENT_DETAIL
Как использовать MV в написаний функций:
--begin pl\sql
function pasport (cl_id integer) return varchar2 is
rez varchar2(1000);
begin
for cl_pass in
(select c_num
from client_detail
where id = cl_id
) loop
rez := '№ '||cl_pass.c_num;
end loop;
return rez;
end;
--end pl\sql |
|
 |
svn Профи
Вступление в Клуб: 04.02.2008
|
Пн Окт 18, 2010 15:18   |
|
Полезность: Нет оценки
|
Обновление MV не требуется - а зачем тогда вообще городить такой огород? почему тогда не обычный справочник или структура? |
|
 |
MMT Участник
Вступление в Клуб: 18.10.2010
|
Вт Окт 19, 2010 06:42   |
|
Полезность: Нет оценки
|
обновление происходит ежедневно в определенное время. |
|
 |
lexus Профи
Вступление в Клуб: 28.09.2007
|
Вт Окт 19, 2010 07:06   |
|
Полезность: Нет оценки
|
в таком случае - refresh убрать, конечно.
query_rewrite_enabled включить.
Для большей точности - посмотрите оракловую документацию по MV.
MV создавал под конкретный запрос
Код: | <...>
AS
SELECT A1.ID,
A1.COLLECTION_ID COLLECTION_ID,
A1.C_DATE C_DATE,
A1.C_SUMMA C_SUMMA
FROM ibs.Z#FACT_OPER A1
WHERE A1.COLLECTION_ID IS NOT NULL
AND (A1.C_OPER = 2052198 AND A1.C_IS_STORNO = '0'); |
При этом курсор в операции
Код: | type TypeGIVECur is
select GIVE(GIVE%collection : CollId,
min(GIVE.[DATE]) : DATE_OP,
sum(GIVE.[SUMMA]) : Summa
)
in ::[FACT_OPER] all
where GIVE%collection is not null and GIVE.[OPER] = ::[VID_OPER_DOG]([ CODE ] = 'ВЫДАЧА_КРЕДИТА')
and GIVE.[IS_STORNO]='0'
group by GIVE%collection; |
начинал бегать по MV (судя по трейсу и по сокращению времени выполнения)
То есть, нет нужды писать селект из MV. Оракл сам оптимизирует выборку - перенаправляет вместо таблички на MV.
PS Вспомнилась основная засада, почему мы тогда так и не смогли использовать MV "по-настоящему". При явном запуске операции все было красиво. А при выполнении того же запроса из джоба - MV Ораклом не использовалось. Баг в Оракл регили. Судьбу его не знаю  |
|
 |
|