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

时间:2020-05-06 05:49:29

标签: snowflake-cloud-data-platform

我想看看如何在Snowflake表上创建分区,并强迫最终用户在查询中使用它们。目的是为了防止在大表上意外进行大查询

有可能吗?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

不,您无法在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 |
--|-------------------+----------|