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

Откуда:
Сообщений: 6
есть таблица скажем test:
1:--------------
CREATE TABLE TEST
( KL NUMBER(6) primary key,
KOL NUMBER(6,2),
K CHAR(1),
D CHAR(1),
DAT DATE,
R VARCHAR2(100));
В ней положим около 3 миллинов записей.
И частенько делается запросы типа:
select sum(kol),d,k
from test
group by d,k;
2:---------------
Поэтому решил использовать snapshot-
привожу скрипт:
create materialized view mat_test
build immediate
refresh on commit
enable query rewrite
as
select sum(kol),d,k
from test
group by d,k;
3:--------------
Теперь вроде всё работает быстро и плане выполнения видно,что берёт этот
snapshot.
Но вот трабла когда делаешь запрос типа:
select sum(kol),d,k
from test
where dat<'01.06.2006'
group by d,k
В плане не берёт snapshot.
Почему?
16 май 06, 09:14    [2667503]     Ответить | Цитировать Сообщить модератору
 Re: snapshot & запрос  [new]
Q u a d r o
Member

Откуда: Canada
Сообщений: 1987
rendy
В плане не берёт snapshot.
Почему?

Потому что MV не может ответить на вопрос, который вы задаёте?

select * from mat_test

как из этих данных понять, какие из них с dat<'01.06.2006' (этой колонки там даже нет).
16 май 06, 09:18    [2667515]     Ответить | Цитировать Сообщить модератору
 Re: snapshot & запрос  [new]
rendy
Member

Откуда:
Сообщений: 6
ясно!
ну что тогда сделать???
1:------------------
создать snapshot типа
create materialized view mat_test
build immediate
refresh on commit
enable query rewrite
as
select sum(kol),d,k
from test
where dat <'01.06.2006'
group by d,k;
но этот вариант не подойдёт!
дата ведь вводится пользователем?!
2:-----------------
Либо есть другой вариант....
как дать понять,чтоб брался этот snapshot возможно hint-ами?!
Подскажите Ваши варианты.
16 май 06, 09:36    [2667571]     Ответить | Цитировать Сообщить модератору
 Re: snapshot & запрос  [new]
Q u a d r o
Member

Откуда: Canada
Сообщений: 1987
Вам необходима MV в которой среди прочего в агрегации будет учавствовать поле DAT, тогда она сможет отвечать на оба вопроса:

SQL> create table fact_table as
  2   select owner, object_type, object_name, trunc(last_ddl_time) dat
  3    from all_objects;

Table created.

SQL> create materialized view mv_fact_table enable query rewrite as
  2   select owner, object_type, dat, count(*) cnt
  3    from fact_table
  4    group by owner, object_type, dat;

Materialized view created.

SQL> select owner, object_type, count(*) cnt
  2   from fact_table
  3   group by owner, object_type;

Execution Plan
----------------------------------------------------------
Plan hash value: 4226912234

-----------------------------------------------------------------------------------------------
| Id  | Operation                     | Name          | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT              |               |   448 | 18368 |     3  (34)| 00:00:01 |
|   1 |  HASH GROUP BY                |               |   448 | 18368 |     3  (34)| 00:00:01 |
|   2 |   MAT_VIEW REWRITE ACCESS FULL| MV_FACT_TABLE |   448 | 18368 |     2   (0)| 00:00:01 |
-----------------------------------------------------------------------------------------------

Note
-----
   - dynamic sampling used for this statement

SQL> select owner, object_type, count(*) cnt
  2   from fact_table
  3   where dat<to_date('01012006', 'ddmmyyyy')
  4   group by owner, object_type;

Execution Plan
----------------------------------------------------------
Plan hash value: 4226912234

-----------------------------------------------------------------------------------------------
| Id  | Operation                     | Name          | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT              |               |   181 |  9050 |     3  (34)| 00:00:01 |
|   1 |  HASH GROUP BY                |               |   181 |  9050 |     3  (34)| 00:00:01 |
|*  2 |   MAT_VIEW REWRITE ACCESS FULL| MV_FACT_TABLE |   181 |  9050 |     2   (0)| 00:00:01 |
-----------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - filter("MV_FACT_TABLE"."DAT"<TO_DATE('2006-01-01 00:00:00', 'yyyy-mm-dd
              hh24:mi:ss'))

Note
-----
   - dynamic sampling used for this statement
16 май 06, 09:55    [2667649]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить