You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Amazon Redshift子计划哈希表不存在报错及查询改写疑问

Amazon Redshift 哈希表断言错误问题解析

报错信息

error: Assert
code: 1000
context: ht0_3 != NULL - Hash table for subplan does not exist.

问题背景

在Amazon Redshift中运行数月的视图突然触发上述断言错误。该查询包含3个CTE,每个CTE从单表选取去重行后进行关联;单独执行每个CTE均正常,但关联操作时触发报错。移除其中一个CTE可规避问题,但业务需要该数据。

原报错查询

CREATE TABLE bad_table AS (
    SELECT DISTINCT
        t.table_schema,
        t.table_name,
        t.column_name
    FROM svv_columns t
    WHERE true
        AND t.table_name not like '%test%'
        AND t.table_schema in ('table_1','table_2', ... , 'table_30')
)

改写后正常运行的查询

CREATE TABLE failing_table AS (
    SELECT DISTINCT
        t.table_schema,
        t.table_name,
        t.column_name
    FROM svv_columns t
    WHERE true
        AND t.table_name not like '%test%'
        AND (t.table_schema in ('table_1', ... , 'table_10')
            or t.table_schema in ('table_11', ... , 'table_20')
            or t.table_schema in ('table_21', ... , 'table_30'))
    )

补充:相同的过滤条件在包含这30个表及更多表的CTE中正常运行,仅单独包含这30个表的CTE触发报错。


问题解答

1. 未修改数据库设置或视图本身,为何视图突然触发该报错?

  • 核心原因是Redshift查询优化器生成了有缺陷的执行计划。即使视图和数据库配置未改动,当底层表的统计信息过期、数据分布/量级发生显著变化(比如某schema下的表数量大幅变动、数据倾斜加剧),优化器会重新计算执行计划,此时可能触发哈希表初始化相关的断言bug。
  • 另外,Redshift后台推送的小版本补丁或优化器逻辑微调,也可能在特定查询场景下引入临时异常,刚好命中你的查询模式。

2. 为何同一AND条件在单IN子句时报错,拆分为多IN子句用OR连接时正常?

  • 单IN子句包含30个值时,优化器可能选择了哈希连接作为核心执行策略,但该场景下哈希表的创建/初始化逻辑出现异常;拆分后多个小IN子句通过OR连接,优化器会调整执行计划(比如转为嵌套循环、分段过滤后再连接),避开了触发bug的代码路径。
  • 小批量的IN列表会让优化器判断更适合采用低复杂度的过滤或连接方式,从而生成了更稳定的执行计划,绕过了原计划中的哈希表初始化问题。

内容的提问来源于stack exchange,提问作者drapail

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 17:11:08