snowflake-cloud-data-platform - 是否可以选择在雪花表上强制分区
问题描述
我想看看在雪花表上创建分区并强制最终用户在查询中使用它们。目的是防止对大表进行意外的大查询
那可能吗?
解决方案
不,您不能在 Snowflake 中手动创建分区,Snowflake 中的微分区是根据数据到达的时间而不是数据包含的内容自动创建的。但是,您可以使用集群键对微分区内和跨微分区的数据进行排序,这将有助于在执行查询时删除分区。
您可以通过使用 BI 工具或通过使用 SQL 变量参数化您的(安全?)视图并限制对基础表的访问来强制用户对其查询进行谓词。显然,这意味着您的用户需要以某种方式正确设置他们的会话变量,在我看来可能有点过于严格,但这里有一个例子:
-- Set variable before creating the view
set predicate_var = 'Mid Atlantic';
-- Create view using parameter in the where condition
create or replace view test_db.public.parameterised_view as
select
*
from "SAMPLE_DATA"."TPCDS_SF100TCL"."CALL_CENTER"
where CC_NAME = $predicate_var;
-- Select from the view. Only records with 'Mid Atlantic' are returned
select CC_CALL_CENTER_SK, CC_NAME from test_db.public.parameterised_view;
--Results:
--|-------------------+--------------|
--| CC_CALL_CENTER_SK | CC_NAME |
--|-------------------+--------------|
--| 2 | Mid Atlantic |
--| 3 | Mid Atlantic |
--|-------------------+--------------|
-- Change the var to something different to prove it works
set predicate_var = 'NY Metro';
-- Select from the view to show that the predicate has changed
select CC_CALL_CENTER_SK, CC_NAME from test_db.public.parameterised_view;
--Results:
--|-------------------+----------|
--| CC_CALL_CENTER_SK | CC_NAME |
--|-------------------+----------|
--| 1 | NY Metro |
--|-------------------+----------|
推荐阅读
- java - 有没有办法在 AspectJ 中启用加载时间编织而不将 java 代理参数传递给 JVM?
- javascript - 数据表格式器
- c# - .Net Framework 4.6 - 加载 Crystal Reports - System.Web.Ui.Controls
- node.js - 无法访问 Kubernetes 集群上的本地证书
- mysql - 如何在 pdo 批量插入中捕获失败
- python - 如何使用 python pika 将 msg 发布到带有自签名证书的 rabbitmq 服务器?
- macos - 如何将 chromedriver 从下载文件夹移动到 /usr/local/bin?
- javascript - 引导模式窗口未从引导弹出窗口内部打开
- swift - 在实时数据库中观察孩子的变化?
- node.js - ReferenceError:测试没有用 Jest 定义