MView "включить переписывание запросов" использование - PullRequest
3 голосов
/ 30 ноября 2010
CREATE TABLE TEST_DATE(COL1 VARCHAR2(20),COL2 NUMBER,COL3_DATE DATE,COL4_DATE DATE)
/   

create materialized view TEST_SYS
REFRESH FORCE ON DEMAND
ENABLE QUERY REWRITE  --- ????
AS
SELECT COL1,COL2
FROM    TEST_date
WHERE TRUNC(SYSDATE) BETWEEN TRUNC(COL3_DATE) AND TRUNC(COL4_DATE)
/

Если опция Enable Query Rewrite отключена, MView создается для вышеуказанного запроса, тогда какова цель наличия предложения ENABLE QUERY REWRITE при создании материализованного представления, можем ли мы удалить его и создать его, и нужно ли идти на компромисс с производительность MView, если мы должны прокомментировать Enable Query Rewrite.

Пожалуйста, объясните мне, как подробно использовать опцию включения перезаписи запроса.

Ответы [ 2 ]

7 голосов
/ 30 ноября 2010

Перезапись запроса позволяет Oracle переписать запрос к базовой таблице (в данном случае TEST_DATE), чтобы прозрачно использовать материализованное представление (в данном случае TEST_SYS). Это очень полезно, например, когда ваше материализованное представление предварительно агрегирует данные. Если у меня есть таблица транзакций и материализованное представление

CREATE MATERIALIZED VIEW mv_transaction_daily
  REFRESH FORCE ON DEMAND
  ENABLE QUERY REWRITE
AS
SELECT store_id,
       transaction_day,
       SUM(transaction_amount) total_transaction_amount
  FROM transactions
 GROUP BY store_id, transaction_day

тогда Oracle может преобразовать запрос как

SELECT store_id,
       transaction_day,
       SUM(transaction_amount) total_transaction_amount
  FROM transactions
 GROUP BY store_id, transaction_day

использовать материализованное представление, а не попадать в базовую таблицу. И если у вас есть соответствующие объекты измерений, вы можете запросить, например,

SELECT store_id,
       trunc(transaction_day,'MM'),
       SUM(transaction_amount) monthly_transaction_amount
  FROM transactions
 GROUP BY store_id, trunc(transaction_day,'MM')

, который также можно переписать, чтобы использовать материализованное представление, а не базовую таблицу.

Если перезапись запросов не включена, вы получите преимущество в производительности от использования материализованного представления, если явно запросите материализованное представление, а не запросите базовую таблицу. Как правило, это требует больше усилий по разработке и ограничивает возможности администраторов баз данных настраивать приложение в будущем путем тонкой настройки материализованных представлений.

В вашем случае наличие SYSDATE в вашем предложении WHERE предотвратит перезапись запроса, потому что Oracle не сможет выяснить, что запрос к TEST_DATE действительно сможет использовать материализованное представление. Oracle знает, что данные в материализованном представлении, которые удовлетворяли условию, когда материализованное представление было обновлено, больше не удовлетворяют условию, а данные, которые не попали в материализованное представление, теперь удовлетворяют условию просто потому, что SYSDATE изменился. *

0 голосов
/ 30 ноября 2010

Вам не нужно включать переписывание запросов.Кроме того, учитывая ваше определение mview, оно, вероятно, не помешало бы вам в любом случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...