首页 > 解决方案 > Snowflake - CTE 内的动态过滤条件(公用表表达式)

问题描述

我正在Snowflake中创建视图,该视图在基表上具有 CTE,没有任何过滤器。我有其他 CTE 依赖于父 CTE 来获取更多信息。

当我从具有 45K 行的基表中查询所有记录时,一切正常。但是当我查询一个特定 ID 的视图时,解释计划显示 Base CTE 正在获取 45K 行,将 CTE 的其余部分加入 45K 行,然后最终应用我的唯一 ID 过滤器并返回一行。

我在为所有记录或一条记录提取数据的性能方面没有任何差异。Snowflake 并未优化基本 CTE 以应用我正在寻找的过滤条件。

有什么建议可以解决这个问题吗?我在基本 CTE 的过滤条件中使用了局部变量,但这不是可行的解决方案。

CREATE OR REPLACE VIEW test_v AS 
WITH parent_cte as 
(select document_id, time, ...
   from audit_table
),

emp_cte as
(select employee_details, ...
   from employee_tab,
        parent_cte
   where parent_cte.document_id = employee_tab.document_id),

dep_cte as 
(select dep_details, ....
   from dependent_tab,
        emp_cte
  where ..........)
select * 
  from dep_cte, emp_cte, base_cte;

现在,当我在视图中查询一个 document_id 时,计划正在获取所有数据并加入,然后应用效率不高的过滤器。

select * from test_v where document_id = '1001';

我不能在一个带有连接条件的选择中使用这些表,因为我正在使用“LATERAL FLATTEN”,它交叉乘以每个基表记录,所以我使用 CTE 方法。

欣赏你的想法。

标签: snowflake-cloud-data-platformcommon-table-expression

解决方案


推荐阅读