Работа с материализованными представлениями

samatom
Дата: 05.11.2008 19:24:38
Доброе время суток, уважаемые коллеги.
В очередной раз обращаюсь к Вам с вопросом.
С мат. вьюхами ранее не имел дела, поэтому проштутдировал кучу статей.
В первую очередь эту, вот это, это, это и это. Дело в следующем - создаю таблицу, добавляю к ней перв. ключ и пытаюсь создать мат. вьюху

1)
create table table1 as (select o.object_id, o.object_name from all_objects o)

*** SCRIPT END :  Session:IGG@INVANL(2)   05.11.2008 19:19:57 *** 

select * from table1

Query finished, retrieving results...
               OBJECT_ID                         OBJECT_NAME          
-------------------------------------- ------------------------------ 
                                    97 ACCESS$                        
                                  4510 AGGXMLIMP                      
                                  4517 AGGXMLINPUTTYPE                
                                  1824 ALL_ALL_TABLES                 
                                  5830 ALL_APPLY                      
                                    ..........
35022 row(s) retrieved

2)
ALTER TABLE table1
ADD CONSTRAINT t_constr PRIMARY KEY (object_id)
USING INDEX
  PCTFREE     10
  INITRANS    2
  MAXTRANS    255
  TABLESPACE  users
  STORAGE   (
    INITIAL     524288
    NEXT        524288
    PCTINCREASE 0
    MINEXTENTS  1
    MAXEXTENTS  2147483645
  )

*** SCRIPT END :  Session:IGG@INVANL(2)   05.11.2008 19:22:00 *** 

3)
CREATE MATERIALIZED VIEW LOG ON table1 WITH ROWID

*** SCRIPT END :  Session:IGG@INVANL(2)   05.11.2008 19:22:24 *** 

4)
CREATE MATERIALIZED VIEW mv_c1
REFRESH FAST ON DEMAND AS
(select object_name from table1 t where t.object_id > 15000 );


[1]: (Error): ORA-23415: materialized view log for "IGG"."TABLE1" does not record the primary key


ORA-23415 materialized view log for "string"."string" does not record the primary key

Cause: A primary key materialized view is being fast refreshed, but the materialized view log does not record primary key information.

Action: Use the CREATE MATERIALIZED VIEW LOG...ADD PRIMARY KEY command to begin recording primary key information in the materialized view log.


Не могу понять - вроде всё делаю как в примерах, что не так, не пойму.
Самое главное, что нужна вьюха именно с этими параметрами - REFRESH FAST ON DEMAND.
samatom
Дата: 05.11.2008 19:33:53
Суть проблемы в том, что не получается создать мат. вьюху для большой таблицы, вот и смоделировал эту ситуацию, дабы понять, каким образом в таких случаях их создавать вообще. Такая вьюха нужна для ускорения выборки из этой большой таблицы (таблиц).
expla
Дата: 05.11.2008 19:48:46
Так читай Action и делай, что там написано...

CREATE MATERIALIZED VIEW LOG...ADD PRIMARY KEY 
samatom
Дата: 05.11.2008 22:13:27
Проделал это и снова мат.вью пытаюсь сделать:

ALTER MATERIALIZED VIEW LOG ON table1 ADD PRIMARY KEY

CREATE MATERIALIZED VIEW mv_c1
REFRESH FAST ON DEMAND AS
(select object_name from table1 t where t.object_id > 15000 );

ORA-12016 materialized view does not include all primary key columns
Cause: The query that instantiates the materialized view did not include all of the columns in the master's primary key constraint.
Action: Include all of the master's primary key columns in the materialized view query or create a ROWID materialized view.

Объясните мне деревянному, какое индексирование вьюлога в этом случае необходимо, если в матвью будут попадать лишь некоторые записи из основной (исходной) таблицы, удовлетворяющие, например, условию t.object_id > 15000 ?
samatom
Дата: 05.11.2008 22:58:04
Вышепроделанным хотелось бы добиться следующего: формировать в мат.вью некий список объектов, который использовался бы в других запросах. В случае если необходимо обновить вьюху, то чтобы обновление шло не полностью (полным перебором), а с использованием VIEW LOG, т.е. добавлением измененных, новых или удаленных объектов - с целью увеличения производительности.
samatom
Дата: 05.11.2008 23:09:31
Oracle следующей версии:

select * from v$version

Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
PL/SQL Release 9.2.0.1.0 - Production
CORE	9.2.0.1.0	Production
TNS for 32-bit Windows: Version 9.2.0.1.0 - Production
NLSRTL Version 9.2.0.1.0 - Production
samatom
Дата: 05.11.2008 23:51:49
Скажите, пожалуйста - я совсем безнадежен?
wurdu
Дата: 06.11.2008 00:53:08
samatom
Скажите, пожалуйста - я совсем безнадежен?
У тебя в тексте ошибки ORA-12016 описано целых два способа решения проблемы... Action: Include all of the master's primary key columns in the materialized view query or create a ROWID materialized view
samatom
Дата: 07.11.2008 14:16:51
Добрый день,
Разобрался более-менее в матер. представлениях =), но возник один вопрос, потому как везде рассматриваются простые примеры с 2-3 таблицами, а у меня более сложная ситуация.
Имеется одна большая вьюха с 3 млн записями (назовём её VIEW_1), в ней содержатся данные из 10 таблиц (довольно крупных), поэтому она только фитчится минут 7-8. Из этой вьюхи необходимо выбирать околы половины строк (1,5-2 млн строк) и далее часто использовать их в других выборках, более "тяжелых" (как правило с агрегацией и т.д.). Для того, чтобы в каждый раз не получать их по 5-10 минут хотелось бы создать мат. вью с инкрементальным обновлением (назовём её VIEW_2) таким образом, чтобы перед обращением к нему оно просто обновлялось, а не перестраивалось.

CREATE VIEW view_1 AS  -- порядка 3 млн записей, фитчится 7-8 минут
(SELECT t1, t2..t20
 FROM table1, table2..table10
 );

CREATE MATERIALIZED VIEW view_mv  --порядка 2 млн записей и хотелось бы,чтобы фитчилась как таблица(не более 30 с)
REFRESH FAST ON DEMAND AS
SELECT * FROM view_1 WHERE t1 = 'О';



здесь под таблицей 9.6 приведен подобный небольшой пример, но ничего н есказано о том, необходимо ли и если да, то каким образом создавать вью-логи для мониторинга действий над таблицами, входящими в VIEW_1. Скажите, пожалуйста, кто-нибудь имел дело с подобным?
samatom
Дата: 07.11.2008 14:22:32
сорри, очепятался (вместо view_mv надо view_2):

CREATE MATERIALIZED VIEW view_2  --порядка 2 млн записей и хотелось бы,чтобы фитчилась как таблица(не более 30 с)
REFRESH FAST ON DEMAND AS
SELECT * FROM view_1 WHERE t1 = 'О';