【问题标题】:Is there an option to force partitions on a Snowflake table是否可以选择在雪花表上强制分区
【发布时间】:2020-05-06 05:49:29
【问题描述】:

我想看看在雪花表上创建分区并强制最终用户在查询中使用它们。目的是防止对大表进行意外的大查询

这可能吗?

【问题讨论】:

    标签: snowflake-cloud-data-platform


    【解决方案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 的意外查询节省积分。但积分也会用于集群密钥的维护。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-26
    • 2022-08-19
    • 1970-01-01
    • 2020-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多