snowflake-cloud-data-platform - 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 方法。
欣赏你的想法。
解决方案
推荐阅读
- gcc - 如何更正堆栈位置 arm-none-eabi-gcc?
- sql-server - SQL Server 创建具有类型的表
- git - 如何恢复 git lost and found 文件夹中的文件
- r - 使用 R 中的 odbc 包将日期列插入 Oracle 数据库时出错
- mysql - 我的约束外键在我的数据库上不起作用
- swiftui - SwiftUI:以编程方式设置 Picker 的值
- windows - 脚本路径中不存在 sshd.exe
- javascript - 克隆的元素更改事件行为
- react-native - iOS录制的视频不能在安卓设备上播放?
- kubernetes - Kubectl exec 到部署中的特定容器