| Предыдущая тема :: Следующая тема   | 
	
	
	
		| Автор | 
		Сообщение | 
	
	
		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 Ораклом не использовалось. Баг в Оракл регили. Судьбу его не знаю   | 
			 
		  | 
	
	
		  | 
	
	
		 |