У меня есть запрос, который я хотел бы сохранить в качестве вида:Повышение производительности на взгляд Oracle
WITH subquery AS (SELECT aaa_id, ... FROM table_aaa ...)
SELECT subquery.aaa_id, ... FROM table_bbb JOIN subquery USING (...)
;
[Примечание: В реальной жизни, мой запрос является гораздо более сложным, чем это, с несколькими WITH
подзапросы, многие из которых выполняют JOINS
, все из которых являются JOIN
ed вместе. Но я ищу общее руководство, которое я могу использовать для решения моей проблемы.]
Выполнение этого запроса включает полное сканирование таблицы. Это имеет смысл, поскольку в предложении WHERE
нет критериев. Тем не менее, я могу устранить большинство из полного сканирования таблицы путем включения такого положения:
WITH subquery AS (SELECT aaa_id, ... FROM table_aaa ... WHERE aaa_id = :id)
SELECT subquery.aaa_id, ... FROM table_bbb JOIN subquery USING (...)
;
Однако, это не кажется, что у меня есть возможность поставить условие WHERE
в нужном месте, когда я создаю вид :
CREATE OR REPLACE VIEW vw_my_view AS
WITH subquery AS (SELECT aaa_id, ... FROM table_aaa ...)
SELECT subquery.aaa_id, ... FROM table_bbb JOIN subquery USING (...)
;
SELECT ... FROM vw_my_view WHERE aaa_id = :id
;
В этом случае план выполнения по-прежнему содержит полное сканирование таблицы. Есть ли способ для меня намекнуть, что предложение WHERE
действительно может быть вставлено в подзапрос WITH
?
Что вы имеете в виду, когда говорите, что у вас нет возможности указать условие WHERE в подзапросе внутри предложения WITH? –
@Darius - Это правда, что я могу указать условие «WHERE» на мой взгляд, если я хочу ограничить свое представление определенным подмножеством данных. Это не то, чего я хочу. –
@Darius - Я сказал, что если запрос к представлению, добавив условие «WHERE» к этому запросу, не поместит его в нужное место в плане выполнения. (Обратите внимание, что условие 'WHERE' внутри подзапроса' WITH' состояло в том, как я зафиксировал план выполнения за пределами представления). –