【问题标题】:Snowflake Temporary Table Sequencing雪花临时表测序
【发布时间】:2020-10-16 16:20:41
【问题描述】:

我正在尝试在 CTE (WITH) 和临时表之间进行性能比较。我已将查询转换为使用的 Temp 表,但我看到了一种情况,即在整体运行时执行失败,因为早期的临时表执行之一被取消。 示例:

// Produces large result set
CREATE temporary table tt1 as
SELECT DISTINCT
    t1.c1
  FROM t1
  //ADDITIONAL LOGIC
  ;

CREATE temporary table tt2 as
SELECT t2.c1
    t2.c2
FROM t2;

CREATE temporary table tt3 as
SELECT t1.c1
FROM t1
INNER JOIN tt1
 on t1.c1 = tt1.c1;

随着 tt3 开始运行,执行似乎被取消,从 tt3 回到 tt1 存在依赖关系。 我已经尝试过 CTAS 以及使用标准 CREATE TABLE 定义表,然后执行 INSERT INTO 但它导致执行被取消的位置相同。

有没有办法通过标准 sql 语法更好地对这些进行排序,而不必走存储过程或任务的路线?

编辑[2] 这是一个使用行为相同的 COVID 数据集的更简单的场景。两种情况下的终止似乎都在 35 秒左右。因此,出于复制目的,如果您可以生成一个运行 2 分钟的查询,然后创建一个简单的后续临时表,从第一个临时表中选择您应该能够复制。

CREATE TEMPORARY TABLE PLATFORM_EVALUATIONS.PUBLIC.TT1 AS
select a.COUNTRY_REGION
    , a.PROVINCE_STATE
    , a.COUNTY
    , current_date() c_date
    , count(*) counts
from PUBLIC.JHU_COVID_19_TIMESERIES a
inner join public.jhu_dashboard_covid_19_global b
 on a.country_region = b.country_region
where 1=1
and a.COUNTRY_REGION = 'United States'
group by a.COUNTRY_REGION
    , a.PROVINCE_STATE
    , a.COUNTY;
    
CREATE TEMPORARY TABLE PLATFORM_EVALUATIONS.PUBLIC.TT2 AS
SELECT COUNTRY_REGION
    , COUNTS
FROM PLATFORM_EVALUATIONS.PUBLIC.TT1;

编辑1: Work History Screenshot 您可以在屏幕截图中看到 _valid_barcodes (tt1) 的持续时间缩短(通常独立为 2m 14s),其他步骤在其完成/终止之前开始。

// this is tt1 in my example it produces 3,657,599 rows in 2m 14s but is cancelled short when run as a whole.
CREATE temporary table business_vault_dev.dnr._valid_barcodes as
  SELECT DISTINCT
    e.Barcode
  FROM BUSINESS_VAULT_DEV.DNR.DIM_EVENT_VW e
  INNER JOIN BUSINESS_VAULT_DEV.DNR.DIM_PACKAGE_VW p
    on e.BARCODE = COALESCE(p.Barcode, p.Barcode)
  INNER JOIN BUSINESS_VAULT_DEV.DNR.DIM_ORDER_VW o
    on p.order_key = o.order_key
  INNER JOIN BUSINESS_VAULT_DEV.SCORECARD.DIM_CUSTOMER_VW cl
    on o.CUSTOMER_ID=cl.CUSTOMER_ID
  WHERE e.Event_Type='Delivered'
    and o.service_code not in ('XD', 'PU')
    and lower(cl.NAME) IN ('a', 'b', 'c')
  GROUP BY e.Barcode
  HAVING date(min(e.EST_Event_DateTime)) between '2020-09-05' and '2020-10-02';

// this is tt2 
CREATE temporary table business_vault_dev.dnr._driver_merge as 
    select 
//redacted
    from data_lake.driver.driver_table1
    union
    select 
//redacted
    from data_lake.driver.driver_table2
    union
    select 
//redacted
    from data_lake.driver.driver_table3
    UNION
    select 
//redacted
    from data_lake.driver.driver_table4;

// this is unreferenced in my example but completes successfully and references the previous temp table    
CREATE temporary table business_vault_dev.dnr._driver as 
    select 
// redacted
    from business_vault_dev.dnr._driver_merge dm
    group by dm.contractor_number;

// this is tt3 in my example
CREATE temporary table business_vault_dev.dnr._slef_dedup as 
    SELECT
          e.Barcode
    // redacting columns here
    FROM BUSINESS_VAULT_DEV.DNR.DIM_EVENT_VW e
    INNER JOIN business_vault_dev.dnr._valid_barcodes vb
     ON e.Barcode = vb.Barcode
    LEFT JOIN data_lake.driver.driver_table1 cn
     ON //redacted
    LEFT JOIN data_lake.driver.driver_table2 pcp
     ON //redacted
;

【问题讨论】:

  • 您的最终查询看起来会失败,因为tt1 不存在。
  • 正确,但我在 Job History 中看到的是 t1 在 tt3 开始时被取消(因此没有完成表的创建)。在较小的临时表中,这似乎不是问题,因为执行和加载在下一次执行发生之前完成
  • @DanielZagales 为什么它会被取消?是设计的吗?
  • 我不知道,我没有得到太多关于取消的信息。 SQL execution canceled 这让我相信我需要以某种方式对执行进行排序以避免它。我相信我可以使用任务或存储过程来做到这一点,但我希望只使用 sql。
  • 嗨 - 如果您以相同的顺序单独运行语句,并在开始下一个语句之前等待每个语句完成,那么所有 3 个语句都运行正常吗?

标签: sql snowflake-cloud-data-platform


【解决方案1】:

Daniel,我能够在我的测试中使用您的简单场景和 COVID 数据库重现该问题。新用户界面似乎有问题。它开始运行第二个 CREATE TABLE 命令而不完成第一个命令。请向 Snowflake 支持提交工单。

在提交此工单时生成和共享 HAR 文件会很有用,并包含 SQL 以进行复制。

https://community.snowflake.com/s/article/How-to-generate-a-HAR-file-for-Web-Interface-Troubleshooting

【讨论】:

  • 感谢 Gokhan 确认该行为。我已提交支持请求。
猜你喜欢
  • 2021-06-07
  • 2020-11-03
  • 1970-01-01
  • 2022-10-14
  • 2021-08-18
  • 2022-07-22
  • 2022-07-10
  • 2022-07-13
  • 2022-01-15
相关资源
最近更新 更多