【问题标题】:Snowflake Query Killed: "SQL execution canceled"雪花查询被杀死:“SQL 执行被取消”
【发布时间】:2020-07-16 03:40:21
【问题描述】:

我有一个 Talend 作业正在运行,其中有几个数据流在 Snowflake 数据库上并行运行。针对表 A 的更新语句导致对表 B 的更新失败并出现以下错误:

事务 'uuid-of-transaction',id 'a-very-long-integer-id',正在提交,SQL 执行已取消。

Call END_OPERATION(999,'String1','String2','String3','String4','Success','0')

UPDATE TableB SET BATCH_KEY =  1234, LOAD_DT = current_timestamp::timestamp_ntz, KEY_HASH = MD5(TO_VARCHAR(ARRAY_CONSTRUCT(col1))), ROW_HASH = MD5(TO_VARCHAR(ARRAY_CONSTRUCT(col2, col3))) WHERE BATCH_KEY = -1 OR BATCH_KEY IS NULL;

END_OPERATION 的代码在这里:

var cmd = 
 "CALL END_OPERATION(:1,:2,:3,:4,:5,:6,null);";
    try {
    
    snowflake.execute (
        {sqlText: cmd,binds: [BATCH_KEY,ENTITY,LAYER,SRC,OPERATION,OPERATION_STATUS].map(function(param){return param === undefined ? null : param})},
        );
    return "Succeeded.";  
    
    }
catch (err)  {
    return "Failed: " + err;   
    }


var cmd = 
 "UPDATE TableA SET OPERATION_STATUS=:6,END_DT=current_timestamp,ROW_COUNT=IFNULL(:7,ROW_COUNT) WHERE BATCH_KEY=:1 AND ENTITY_NAME=:2 AND LAYER_NAME=:3 AND SRC=:4 AND OPERATION_NAME=:5";
    try {
    
    snowflake.execute (
        {sqlText: cmd,binds: [BATCH_KEY,ENTITY,LAYER,SRC,OPERATION,OPERATION_STATUS,ROW_COUNT].map(function(param){return param === undefined ? null : param})},
        );
    return "Succeeded.";  
    
    }
catch (err)  {
    return "Failed: " + err;   
    }

我不明白为什么针对 TableB 的 UPDATE 语句会被杀死。它几乎立即被杀死。

【问题讨论】:

    标签: sql talend snowflake-cloud-data-platform


    【解决方案1】:

    在这里,我们需要检查来自 Talend 作业的所有 SQL 语句的流,在该会话中运行失败的 SQL 命令,以及来自其他并行作业的所有语句。

    从查询历史中我们可以得到会话的 SessionID。在 Snowflake UI 的 History 部分,我们可以根据 SessionID 进行搜索。这将列出通过此特定会话运行的所有命令。 我们可以通过对 start_date 列进行排序,按时间顺序查看所有命令,并尝试观察 SQL 语句的顺序。

    您的观点确实有效,TableA 上的更新不应该影响 TableB 上的更新,但是在查看了两个会话的所有语句之后(我们读到 Talend 作业正在并行运行几个数据流),我们可能会遇到一个会话中的某些 SQL 语句在从另一个会话提交更新命令之前已锁定 tableB。

    这里可以查看的另一件事是工作流如何管理事务。在该会话中的同一 SQL 查询列表中,我们需要检查在会话级别设置参数 Autocommit 的任何语句。如果 Autocommit 在会话开始时将其设置为 FALSE,则在提交显式提交之前,会话不会释放任何表锁。

    由于这里的情况听起来有点不寻常和复杂,我们可能需要更深入地挖掘以查看两个查询的执行日志,为此我们可能需要联系 Snowflake 支持。

    【讨论】:

    • 这给了我一个很好的起点,我将继续深入研究。我知道 Talend 在某些情况下将 Autocommit 设置为 false,所以这可能是罪魁祸首。
    • 你成功了 Haseeb。 Talend 在会话中将 autocommit 设置为 false,然后背靠背运行两个更新语句,第二个被取消。为了解决这个问题,我让每个 Talend 组件为单独的更新语句创建自己的会话。
    • 感谢尼克的确认。我很高兴这些指针有所帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-18
    • 1970-01-01
    • 1970-01-01
    • 2021-10-28
    • 2021-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多