snowflake-cloud-data-platform - 在 Snowflake 中使用内联值的视图
问题描述
我们有时通过使用子句提供内联值来创建带有小型静态数据集(值永远不会改变)的表/维度VALUES
,如下所示(简化):
CREATE TABLE my_table
AS
SELECT * FROM VALUES
(1, 2, 3),
(4, 5, 6);
然而,一位同事刚刚意识到我们也可以将它们创建为相同的视图:
CREATE VIEW my_view
AS
SELECT * FROM VALUES
(1, 2, 3),
(4, 5, 6);
它有效,但我想知道使用视图而不是表的含义。我主要在寻找关于这是否是一个好主意以及为什么的任何社区/专家意见。只是想确保我们没有遗漏任何东西!
一些想法:
- 从表中读取意味着从云存储或雪花缓存中读取数据。
- 但是从视图中读取时,每次都只是简单地从视图定义中获取数据?(顶部可能有缓存)
- 对此视图的查询在查询历史记录中没有“扫描的字节数”这一事实似乎证实了这一点。
- 显然,除非我们替换视图,否则无法修改视图数据,这是意料之中的(而且是件好事)。
- 对于这些数据集,我们并不真正关心表数据的保留(如果需要,我们可以轻松地重新创建它们)。
- 两种情况下的性能都很好(对于如此小的数据集来说这并不奇怪)。
编辑:谢谢你的两个很好的答案!我希望我能接受两者。坚持使用桌子可能会更好。
解决方案
对于像您的示例这样的小型数据集,表和(常量)视图之间的性能不会有太大差异。我们通常使用带有VALUES
or的小数据集的子查询/CTE GENERATOR
,它们通常性能足够。视图用法与子查询/CTE 非常相似,因此我不关心创建具有恒定视图的微小数据集。
相反,如果数据集很大,我更喜欢使用表而不是视图,因为表的性能要比视图好得多。
以下是视图可能比表性能更差的一些示例。请注意,这不是性能差异的唯一列表;可能存在其他情况/极端情况导致表和常量视图之间的性能差异。
在示例中,我将使用以下包含 10 亿个连续整数值的虚拟数据。这与在子句中列出 10 亿个值几乎相同VALUES
(解析/编译的成本除外)。
create or replace table test_t1b (c1 int) as
select seq4() from table(generator(rowcount => 1000000000));
create or replace view test_v1b as
select seq4() c1 from table(generator(rowcount => 1000000000));
此外,我对所有示例都使用了 XSMALL 仓库。
(1) 分区剪枝不适用于常量视图
由于常量视图不是表,因此在运行查询时会生成值;它不能从分区修剪中受益。
select * from test_t1b where c1 < 1000;
-- 171 ms
select * from test_t1b where c1 = 1000;
-- 172 ms
select * from test_v1b where c1 < 1000;
-- 588 ms
select * from test_v1b where c1 = 1000;
-- 597 ms
在上面的例子中,对表 ( test_t1b
) 的查询只扫描了 200+ 个分区中的 1 个分区,但对视图 ( test_v1b
) 的查询总是要生成 10 亿行然后过滤。
(2) 元数据查询不适用于常量视图
Snowflake 可以在不执行查询的情况下从表元数据中获取多个函数(如MAX()
、MIN()
和)的结果。COUNT()
然而,常量视图没有这样的元数据,所以函数总是必须从生成的数据集中计算结果。
select max(c1), min(c1), count(*) from test_t1b;
-- 45 ms
select max(c1), min(c1), count(*) from test_v1b;
-- 797 ms
总之,如果数据集只包含几行,那么您的分析是完全正确的;您可以随意使用视图来生成数据集。否则,将首选物理表,因为它受益于仅适用于物理表的各种优化。
推荐阅读
- sql - SQL Server:如何根据查询限制结果
- javascript - ServiceNow:如何使用链接参数自动填写调查?
- swift - 通过拖动手势在 SwiftUI 中使用拨号视图并显示所选数字的值
- r - 使用 R 构建决策树时如何解决
- php - 解析错误:语法错误,意外的 '$smt' (T_VARIABLE)
- reactjs - 如何从顶点图表的图表中删除图例、标签和所有数字
- python - Python正则表达式:交替给出空匹配
- python - 如何使用带有换行符的 python -c “code here”?
- javascript - 查找所有元素是否包含相同的类
- hybris - 自定义斯巴达克斯店面的自定义角度应用程序