🔥

【Snowflake】使用するroleによってコンパイル時間が変わる?

2024/07/09に公開

概要

先日のSnowflake Summit2024のセッションの中で、roleがネストされている状態だとコンパイルが遅くなるという噂をキャッチしました。気になったので実際に見てみます。

roleのネストなし(sysadmin)

TPC-DSから適当なクエリを流します(ドキュメントから抜粋)。

alter session set use_cached_result = false;
use role sysadmin;
use schema snowflake_sample_data.tpcds_sf10Tcl;

-- QID=TPC-DS_query57

with v1 as(
  select i_category, i_brand, cc_name, d_year, d_moy,
        sum(cs_sales_price) sum_sales,
        avg(sum(cs_sales_price)) over
          (partition by i_category, i_brand,
                     cc_name, d_year)
          avg_monthly_sales,
        rank() over
          (partition by i_category, i_brand,
                     cc_name
           order by d_year, d_moy) rn
  from item, catalog_sales, date_dim, call_center
  where cs_item_sk = i_item_sk and
       cs_sold_date_sk = d_date_sk and
       cc_call_center_sk= cs_call_center_sk and
       (
         d_year = 1999 or
         ( d_year = 1999-1 and d_moy =12) or
         ( d_year = 1999+1 and d_moy =1)
       )
  group by i_category, i_brand,
          cc_name , d_year, d_moy),
v2 as(
  select v1.i_category ,v1.d_year, v1.d_moy ,v1.avg_monthly_sales
        ,v1.sum_sales, v1_lag.sum_sales psum, v1_lead.sum_sales nsum
  from v1, v1 v1_lag, v1 v1_lead
  where v1.i_category = v1_lag.i_category and
       v1.i_category = v1_lead.i_category and
       v1.i_brand = v1_lag.i_brand and
       v1.i_brand = v1_lead.i_brand and
       v1.cc_name = v1_lag.cc_name and
       v1.cc_name = v1_lead.cc_name and
       v1.rn = v1_lag.rn + 1 and
       v1.rn = v1_lead.rn - 1)
select  *
from v2
where  d_year = 1999 and
        avg_monthly_sales > 0 and
        case when avg_monthly_sales > 0 then abs(sum_sales - avg_monthly_sales) / avg_monthly_sales else null end > 0.1
order by sum_sales - avg_monthly_sales, 3
limit 100;

結果、コンパイル時間は600msでした。

ネストしたroleでの実行

適当に100個くらい直列にroleをネストさせます。

use role securityadmin;
create role test_1;
create role test_2;
create role test_3;
...
create role test_100;

grant role sysadmin to role test_1;
grant role test_1 to role test_2;
grant role test_2 to role test_3;
...
grant role test_99 to role test_100;

grant role test_100 to user <username>;

roleを変えて同じクエリを実行すると...

コンパイル時間が1.6sとなり、約1秒増加しました

結論

roleの構造もクエリの速度に僅かながら影響がありそうです(試したのは1ケースだけなので正確な影響度合いは何ともいえませんが)。大量のクエリを頻繁に流すようなケースではちりつもで効いてきそうですね。

Discussion