是否可以选择在雪花表上强制分区
Posted
技术标签:
【中文标题】是否可以选择在雪花表上强制分区【英文标题】:Is there an option to force partitions on a Snowflake table 【发布时间】:2020-05-06 05:49:29 【问题描述】:我想看看在雪花表上创建分区并强制最终用户在查询中使用它们。目的是防止对大表进行意外的大查询
这可能吗?
【问题讨论】:
【参考方案1】:Snowflake 不支持“传统分区”,它有自动创建的“微分区”。请阅读以下文档了解 Snowflake 的“微分区”:
https://docs.snowflake.com/en/user-guide/tables-clustering-micropartitions.html#what-are-micro-partitions
查询将始终尝试根据查询过滤器修剪分区,但无法强制您的用户指定过滤条件/分区。
为防止意外使用高额度,您可以考虑使用“资源监控”功能。您可以创建一个较小的仓库,设置资源限制并将此仓库分配给用户。
https://docs.snowflake.com/en/user-guide/resource-monitors.html#creating-resource-monitors
【讨论】:
有一种方法可以强制过滤条件。即通过使用视图或定义返回表的表 udf【参考方案2】:不,您不能在 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 |
--|-------------------+----------|
【讨论】:
但是维护集群密钥是另一个消耗信用的部分,对吧? 是的,但这与问题有什么关系? OP 想为 BU 的意外查询节省积分。但积分也会用于集群密钥的维护。以上是关于是否可以选择在雪花表上强制分区的主要内容,如果未能解决你的问题,请参考以下文章