雪花查询被杀死:“ SQL执行已取消”

时间:2020-07-16 03:40:21

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

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

正在提交事务'uuid-of-transaction',标识为'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语句被杀死。它几乎马上就被杀死了。

1 个答案:

答案 0 :(得分:1)

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

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

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

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

由于这里的情况听起来有点异常和复杂,因此我们可能必须更深入地研究两个查询的执行日志,并可能需要联系Snowflake支持。