Представление с UNION не может вернуть результат первой части запроса при сбое dblink - PullRequest
0 голосов
/ 23 апреля 2020

У меня есть одна view, содержащая две таблицы с одинаковой информацией. Разница лишь в том, что первый является подмножеством второго. Первый table с именем SMALL_TABLE с 1-месячным данными для более быстрого выполнения различных запросов и еще один table с именем BIG_TABLE с более чем 6 месяцев данных в другой базе данных. Я использую db_link в представлении из БД, где расположена маленькая таблица, чтобы объединить обе таблицы с оператором UNION для возврата любых результатов, где диапазон дат превышает один месяц. До сих пор это прекрасно работало. Но проблема в том, что когда вторая БД недоступна, представление также не может вернуть даже эти данные из первой таблицы. Как я могу по-прежнему получать результаты из первой части представления для определенных c запросов с диапазоном дат менее одного месяца, несмотря на недоступность второй БД по определенным причинам?

SELECT COL1 DATEFIELD1, COL2 ALIASFIELD2, COL3 ALIASFIELD3
FROM SMALL_TABLE
WHERE DATEFIELD < TRUNC(SYSDATE)-31
UNION
SELECT COL1 DATEFIELD1, COL2 ALIASFIELD2, COL3 ALIASFIELD3
FROM BIG_TABLE@DBLINK_MAINDB
WHERE DATEFIELD >= TRUNC(SYSDATE)-31

1 Ответ

0 голосов
/ 24 апреля 2020

Переключение из вида в материализованное представление может быть одним из вариантов. В отличие от «обычного» представления, которое является просто сохраненным запросом и не содержит никаких данных, материализованное представление на самом деле содержит данных и действует так, как если бы оно было таблицей ; например, вы можете создавать для него индексы.

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

Как обновляется? Это зависит от тебя; запланируйте это, например, в 02:00, когда никто не работает, и он будет готов утром. Или делайте это дважды в день. Или refre sh по требованию (вы явно выполняете refre sh). Или сделайте это, когда происходит фиксация в базовых таблицах. Эти опции описаны в документации; как только вы выясните, какой использовать, см. как применять его.

Более того, материализованное представление выберет only из BIG_TABLE (поскольку он содержит все данные; вы сказали, что SMALL_TABLE - это его подмножество), и вы избежали бы UNION, который может быть дорогим, так как устраняет дублирующиеся строки.

В простейшем случае вы бы

create materialized view mv_big_table as
select col1 datefield1,
       col2 aliasfield2,
       col3 aliasfield3
from big_table@dblink_maindb;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...