是否可以选择在雪花表上强制分区

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 的意外查询节省积分。但积分也会用于集群密钥的维护。

以上是关于是否可以选择在雪花表上强制分区的主要内容,如果未能解决你的问题,请参考以下文章

使用分区的雪花到 Hive 数据移动

雪花分区与手动集群

在雪花中按分区过滤

通过自定义分区器对雪花中的大表进行分区

如何使用主键和分区列创建雪花表?示例 DDL?

雪花 - Azure 文件上传 - 如果文件大小超过 40MB,我如何对文件进行分区