我在亚马逊RedShift上有一个视图,它正常工作了几个月.有一天,它突然停止工作,并出现错误:
error: Assert
code: 1000
context: ht0_3 != NULL - Hash table for subplan does not exist.
查询本身有3个CTE,每个CTE从一个表中 Select 不同的行.然后将它们连接在一起.每个CTE本身都工作得很好,但当我try 加入它们时,我得到了这个错误(尽管以前它工作得很好)
Internet上有关于此错误的近0条信息.如果我将其中一个CTE留在联接之外,错误是可以避免的,但我需要在结果表中包含该信息.
UPD:我设法解决了这个问题,但我仍然不知道为什么会发生错误.以下是导致问题的查询和重写后的工作版本.
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'))
)
有趣的是,失败的AND条件在两个不同的CTE中使用.在一个CTE中,它是有效的(在in
子句中列举了30个表,还有更多),而在另一个CTE中(只有30个表)失败了.
总而言之,我希望听到以下两个问题的解释:
- 为什么视图在一个月内一直运行良好,然后突然开始抛出这个错误.未对数据库设置或视图本身进行任何更改.
- 为什么相同的AND条件在所有
in
个条件都被一起枚举的情况下失败,但当它们由or
运算符连接时工作得很好.