首页 > 解决方案 > cx_Oracle DatabaseError: ORA-01652: 无法在表空间 TEMP 中将临时段扩展 128

问题描述

我正在使用 python 版本 3.6.8。最近使用我在 jupyter notebook 上使用了几个月的代码,我开始收到上述错误。该代码使用 cx_Oracle 连接运行多个查询。在运行这些查询之前,我从未遇到过此错误,并且查询通常会在 1 分钟内完成。

该代码以以下形式创建了一个 sql 查询字符串(这里我使用 *** 表示查询实际上要长得多,但我已将其剥离为基础知识):

def function(d1,d2):
conn=cx_Oracle.connect(dsn="connection")
sqlstr=f"""select *** from table 
          where date between {d1} and {d2}
       """

query1=pd.read_sql(f"""
select * from 
({sqlstr})
""",conn)


*several similar queries**

conn.close()

return [(query1,query2...)]

我认为错误可能来自我根据我所做的测试所做的字符串格式,但我不确定为什么它现在/随机成为一个问题,而代码已经工作了很长一段时间了。如果我删除日期格式,则 sql 运行得非常好,并且在其他地方非常快,所以这就是格式似乎是问题的原因*。

编辑*

即使在编辑了字符串格式之后我仍然遇到问题,但我实际上能够将它隔离到一个查询中——这实际上也不能在直接 sql 查询上运行,所以它可能不是 python /string 问题,但 DB 问题(我为错误的保证道歉),

查询是:

select column1,column2,sum(column3)
from
(select several variables,Case When ... as column2
from table1 inner join table2 inner join table3
where several conditions
UNION ALL
select several variables, Case When ... as column2
from table1 inner join table2 inner join table3
where several conditions)
group by column1, column2
having (ABS(sum(column3))>=10000 and column1 in ('a','b','c'))
                or (column1 not in ('a','b','c'))
                order by column1, sum(column3) desc

我认为数据库端肯定有一些变化会使运行这个有点庞大的查询当前无法运行以给出上述错误?进一步隔离它——它看起来可能与变量列 2 时的 CASE 分组有关

标签: pythonsqloracle

解决方案


就我而言,有些selectsql执行时间很长,大约10分钟,但一般sql通常可以在5秒内完成。

我在它使用的sql中发现SELECT COLUMN_A||COLUMN_B FROM TABLE_C ... ,即它用于||连接列,并与另一个表进行比较,另一个表也使用 ||,所以它可能导致Oracle数据库执行Table Full Scan并使用大量内存,并ORA-01652发生。

改成||通用列 compare:SELECT COLUMN_A, COLUMN_B FROM TABLE_C ... 后,可以正常执行,没有报错。


推荐阅读