Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 从光标提取时出现ORA-01652错误_Sql_Oracle_Plsql_Tablespace - Fatal编程技术网

Sql 从光标提取时出现ORA-01652错误

Sql 从光标提取时出现ORA-01652错误,sql,oracle,plsql,tablespace,Sql,Oracle,Plsql,Tablespace,我有一个存储过程,其中我使用游标在临时表中的项之间循环: OPEN CURSOR_SCORE_ITEMS FOR SELECT ID_X, ID_Y FROM SCORE_ITEMS GROUP BY ID_X, ID_Y HAVING SUM(SCORE) > 10; LOOP FETCH CURSOR_SCORE_ITEMS BULK COLLECT INTO COMPA

我有一个存储过程,其中我使用游标在临时表中的项之间循环:

OPEN CURSOR_SCORE_ITEMS FOR SELECT 
        ID_X, ID_Y
    FROM
        SCORE_ITEMS
    GROUP BY 
        ID_X, ID_Y
    HAVING 
        SUM(SCORE) > 10;   
    LOOP
    FETCH CURSOR_SCORE_ITEMS BULK COLLECT INTO COMPARE_ITEMS LIMIT 100;

    ---loop over items and do stuff---

    END LOOP;
CLOSE CURSOR_SCORE_ITEMS;

对于“SCORE_ITEMS”表很小的情况,该过程运行良好,但对于大型表(数百万行),我收到了错误消息

“ORA-01652:表空间Temp_ALL中的临时段kann nicht um 12800 厄维特·沃登“

(对不起,是德语的)

请注意,SCORE_ITEMS是一个临时表,在程序的前面生成。游标查询似乎超出了临时表空间的大小


我已经读过一些涉及增加表空间大小的解决方案,但是我对这个数据库没有任何特权,所以我认为这是不可能的。是否有另一种方法,或者某种类型的预处理,可以减少临时表空间中的开销?< /p> < p>全局临时表被写入临时表空间(即,不是堆表的常用表空间)。您有单独的GTT临时表空间吗?我想不是。大多数地方没有

所以(假设没有),当分数项有数百万行时,你已经吃了一大块临时食物。然后,您的查询以一个足够大的聚合开始,该聚合可以溢出到TEMP中,因为groupby需要排序

您已经排除了显而易见的解决方案:

增加表空间的大小,但我对此数据库没有任何特权,因此我认为这是不可能的

我不知道这是否也排除了与DBA交谈并查看他们是否会增加分配给TEMP的空间的激进想法,或者更好地为全局临时表创建一个新的表空间


另一件要考虑的是你是否真的需要TungSmith.当人们可以编写更高效的SELECT时,填充GTT并不罕见。GTT中有很多开销—所有磁盘I/O,更不用说争夺共享临时表空间了。这是一个可以考虑的选项。

你的TEMP表空间对于事务来说是小的,你应该在X行之后提交或者增加你的TEM表空间的大小,你在循环中所做的是什么?是否有可能将游标和循环的逻辑封装到单个DML语句中?或者,至少,将大部分计算移到开始光标中?另外,为什么要使用ref游标,而不是“普通”(即显式或隐式)游标?谢谢,这非常有用。因此,如果SCORE_ITEMS表是一个永久表而不是临时表,这意味着它不会被分配给TEMP,这可能会通过聚合为组释放足够的空间?这将是另一种可能性。您仍然会有写入磁盘和从磁盘读取的开销,这在处理“数百万行”时显然更大。此外,您还需要明确地处理内务管理(清理)。最后,如果在任何给定时间有多个用户运行此进程,则需要处理会话隔离。对于将来的任何引用,请明确指出,害怕DBA从来都不是正确的答案!如果使用临时表对这个问题有意义并且避免了内务管理方面的麻烦,那么就不要把整个应用程序搞得一团糟,“因为DBA是一个神圣的人,我们无法交谈!”!。永远不要因为政治而弄乱代码!