我有一个要保存为视图的查询:
WITH subquery AS ( SELECT aaa_id, ... FROM table_aaa ... )
SELECT subquery.aaa_id, ... FROM table_bbb JOIN subquery USING ( ... )
;
[注意:在现实生活中,我的查询比这复杂得多,有几个WITH
子查询,许多正在执行JOINS
,都被JOIN
一起编辑。但我正在寻找可以用来解决我的问题的一般指导。]
此查询的执行包括全表扫描。这是有道理的,因为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
子查询中?