ORA-01652 ошибка при извлечении из курсора - PullRequest
2 голосов
/ 08 апреля 2019

У меня есть хранимая процедура, в которой я использую курсор для циклического перемещения по элементам во временной таблице:

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-Segment kann nicht um 12800 в табличном пространстве TEMP_ALL erweitert werden"

(извините,на немецком языке).

Обратите внимание, что SCORE_ITEMS - это временная таблица, созданная ранее в процедуре.Похоже, что запрос курсора превышает размер временного табличного пространства.

Я уже читал некоторые решения, которые включают увеличение размера табличного пространства, но у меня нет никаких привилегий для этой базы данных, поэтому я не думаю, чтовозможно.Есть ли альтернативный способ или какая-то предварительная обработка, которую я мог бы рассмотреть, чтобы уменьшить накладные расходы во временном табличном пространстве?

1 Ответ

1 голос
/ 08 апреля 2019

Глобальные временные таблицы записываются в табличное пространство TEMPORARY (то есть не в обычное табличное пространство для таблиц кучи).У вас есть отдельное временное табличное пространство для GTT?Я подозреваю, что нет.В большинстве мест нет.

Итак (при условии Нет ), когда SCORE_ITEMS имеет миллионы строк, вы уже съели большую часть TEMP.Затем ваш запрос начинается с достаточно большой агрегации, чтобы перейти в TEMP - потому что GROUP BY нуждается в сортировке.

Вы уже исключили очевидное решение:

увеличение размера табличного пространства, но у меня нет никаких привилегий для этой базы данных, поэтому я не думаю, что это возможно.

Я не знаю, исключает ли это также радикальную идею общения с вашим администратором базы данных и выяснения, увеличат ли они пространство, выделенное для TEMP, или - лучше - создадут новое табличное пространство для глобальных временных таблиц.

Еще одна вещь, которую нужно учитывать, - нужен ли вам TEMP_SCORE.Люди нередко заполняют GTT, когда вместо этого они могут просто написать более эффективный SELECT.В GTT много накладных расходов - все эти операции ввода-вывода на диск, не говоря уже о борьбе за общее табличное пространство TEMP.Это определенно вариант для рассмотрения.

...