Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Как "остановить" выполнение запроса раньше появления ORA-04030 ?  [new]
rolechka
Member

Откуда:
Сообщений: 45
Есть постянно растущая таблица. В обычном режиме пользователи выбирают данные небольшими порциями, но неограниченны в выборе и больших данных. Заранее сказать когда свалиться ORA-04030 (out of process memory when trying to allocate 16396 bytes (koh-kghu sessi,pmuccst: adt/record)) не видится возможным. Нужно даже при невозможности достать все записи достать хотя бы часть, которую можно достать. Можно конечно в эксепшене словить эту ору 04030 и перевыполнить запрос с ограничением количества записей... но опять таки - как определить количество максимальное которое еще допустимо до появления этой оры? Да и выполнять запрос дважды не хочется... Может быть есть какой-то еще путь решения этой проблемы?


Oracle 10.2.0.3
11 дек 08, 12:59    [6555887]     Ответить | Цитировать Сообщить модератору
 Re: Как "остановить" выполнение запроса раньше появления ORA-04030 ?  [new]
rolechka
Member

Откуда:
Сообщений: 45
совсем нет вариантов? :(
12 дек 08, 13:01    [6562255]     Ответить | Цитировать Сообщить модератору
 Re: Как "остановить" выполнение запроса раньше появления ORA-04030 ?  [new]
Timm
Member

Откуда: Moscow, Ё-burg
Сообщений: 3696
rolechka
Может быть есть какой-то еще путь решения этой проблемы?

Конечно. Изменить запрос так чтобы он потреблял меньше PGA.
12 дек 08, 13:08    [6562297]     Ответить | Цитировать Сообщить модератору
 Re: Как "остановить" выполнение запроса раньше появления ORA-04030 ?  [new]
pravednik
Member

Откуда: Jacksonville, FL
Сообщений: 16268
поиск по причине из которой можно сделать выводы по решению
http://www.orafaq.com/usenet/comp.databases.oracle.server/2006/03/23/1649.htm
12 дек 08, 13:09    [6562305]     Ответить | Цитировать Сообщить модератору
 Re: Как "остановить" выполнение запроса раньше появления ORA-04030 ?  [new]
rolechka
Member

Откуда:
Сообщений: 45
Вопрос не в том как обойти проблему, а в том как ее правльно словить до момента появления. Запрос все равно будет выбирать данные из большой таблицы....
12 дек 08, 16:56    [6564600]     Ответить | Цитировать Сообщить модератору
 Re: Как "остановить" выполнение запроса раньше появления ORA-04030 ?  [new]
Timm
Member

Откуда: Moscow, Ё-burg
Сообщений: 3696
rolechka
Вопрос не в том как обойти проблему, а в том как ее правльно словить до момента появления. Запрос все равно будет выбирать данные из большой таблицы....

и? как размер таблицы влияет на количество необходимой памяти для выполнения select ... from tab?
12 дек 08, 17:02    [6564656]     Ответить | Цитировать Сообщить модератору
 Re: Как "остановить" выполнение запроса раньше появления ORA-04030 ?  [new]
terrymoon
Member

Откуда:
Сообщений: 315
автор
Запрос все равно будет выбирать данные из большой таблицы....

Это еще не значит, что он будет жрать PGA до отвала.

автор
а в том как ее правльно словить до момента появления

Я думаю никак. Только мониторингом и тюнингом.
12 дек 08, 17:04    [6564675]     Ответить | Цитировать Сообщить модератору
 Re: Как "остановить" выполнение запроса раньше появления ORA-04030 ?  [new]
Серафимный Шестикрыл
Member [заблокирован]

Откуда: С луны свалился
Сообщений: 2922
Timm

и? как размер таблицы влияет на количество необходимой памяти для выполнения select ... from tab?


Я так мыслю, что там знаменитый SELECT BULK COLLECT INTO ...
12 дек 08, 17:23    [6564795]     Ответить | Цитировать Сообщить модератору
 Re: Как "остановить" выполнение запроса раньше появления ORA-04030 ?  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18343
Серафимный Шестикрыл
Timm

и? как размер таблицы влияет на количество необходимой памяти для выполнения select ... from tab?

Я так мыслю, что там знаменитый SELECT BULK COLLECT INTO ...

В этом случае достаточно выучить окончание этой знаменитой конструкции, limit называется.
12 дек 08, 17:29    [6564820]     Ответить | Цитировать Сообщить модератору
 Re: Как "остановить" выполнение запроса раньше появления ORA-04030 ?  [new]
Серафимный Шестикрыл
Member [заблокирован]

Откуда: С луны свалился
Сообщений: 2922
andrey_anonymous

Я так мыслю, что там знаменитый SELECT BULK COLLECT INTO ...

В этом случае достаточно выучить окончание этой знаменитой конструкции, limit называется.[/quot]

Помилуйте, какой LIMIT в SELECT BULK COLLECT INTO ?
LIMIT - он в FETCH ... BULK COLLECT ;)
12 дек 08, 17:43    [6564899]     Ответить | Цитировать Сообщить модератору
 Re: Как "остановить" выполнение запроса раньше появления ORA-04030 ?  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18343
Серафимный Шестикрыл
Помилуйте, какой LIMIT в SELECT BULK COLLECT INTO ?
LIMIT - он в FETCH ... BULK COLLECT ;)

1) цитируйте плиз аккуратнее
2) и что, с этим есть реальные проблемы?
12 дек 08, 19:15    [6565293]     Ответить | Цитировать Сообщить модератору
 Re: Как "остановить" выполнение запроса раньше появления ORA-04030 ?  [new]
Camper
Member

Откуда:
Сообщений: 174
Если лезет ора 4030 и PGA достаточно большое, то это ошибки вызванные установкой лимитов, может быть как на уровне ОС, так и в БД.
Как выяснить в какой лимит именно упирается программа нужно делать трасу на 4030 на heapdump и смотреть как выделяется память и дальше смотреть какой лимит достигнут.
Могу сказать, что если настройки экземпляра меняются, что с течением времени нормально, то и установленные лимиты будут меняться.
Для пользователя ОС - смотреть ulimit, для БД - следует обратить внимание на недокументируемые параметры
_pga_max_size Maximum size of the PGA memory for one process
_smm_max_size maximum work area size in auto mode (serial).

Можно попробывать отловить появление оры 4030 через exception на others в pl\sql коде, и через SQLCODE и SQLERRM обработать ошибку.

Но требуемого средства предсказания появления оры 4030 я не знаю.
13 дек 08, 12:00    [6566729]     Ответить | Цитировать Сообщить модератору
 Re: Как "остановить" выполнение запроса раньше появления ORA-04030 ?  [new]
Camper
Member

Откуда:
Сообщений: 174
И еще одно.
Как-то исследовал, вообщем ора 4030 возникает именно во время выделения памяти (в принципе понятно из сообщения) т.е. именно при вызове функции malloc ( или calloc, тоже что и malloc, но заполняется область памяти нулями), а вызов функции malloc происходит при определении объявленной переменной.

Т.е. допустим в начале в коде была объявлена переменная типа varchar2

declare
   v_char varchar2(1024);
...
далее при определении объявленной переменной будет вызвана функция malloc и будет выделено именно 1024 байт, если даже мы этой переменной присвоим значение, для хранения которого достаточно 1 байта
...
v_char := '1';
...

В тогде, если бы мы определили изначально переменную v_char допустим как varchar2(2), то смогли бы снизить риск появления ора 4030.
13 дек 08, 12:41    [6566800]     Ответить | Цитировать Сообщить модератору
 Re: Как "остановить" выполнение запроса раньше появления ORA-04030 ?  [new]
work-sa
Member

Откуда: Сухум
Сообщений: 263
rolechka
Нужно даже при невозможности достать все записи достать хотя бы часть, которую можно достать.

По моему это не есть верно - но как вариант
rownum <MAX_LINE_FOR_THIS_QUERY
Естественно проверить, после выборки сколько строк получено.
Но сие есть скорее медвежья услуга, чем совет.
13 дек 08, 13:07    [6566846]     Ответить | Цитировать Сообщить модератору
 Re: Как "остановить" выполнение запроса раньше появления ORA-04030 ?  [new]
Camper
Member

Откуда:
Сообщений: 174
На счте SQLCODE и SQLERRM в pl\sql коде поторопился...не отображается там 4030.
13 дек 08, 13:25    [6566862]     Ответить | Цитировать Сообщить модератору
 Re: Как "остановить" выполнение запроса раньше появления ORA-04030 ?  [new]
Полугурок
Member [заблокирован]

Откуда: из гурдома
Сообщений: 56
Camper
На счте SQLCODE и SQLERRM в pl\sql коде поторопился...не отображается там 4030.
Ты и на счет почти всего другого поторопился :)
13 дек 08, 17:16    [6567250]     Ответить | Цитировать Сообщить модератору
 Re: Как "остановить" выполнение запроса раньше появления ORA-04030 ?  [new]
Просто мысли
Guest
Полугурок
Camper
На счте SQLCODE и SQLERRM в pl\sql коде поторопился...не отображается там 4030.
Ты и на счет почти всего другого поторопился :)
Вот неплохой в целом ресурс - sql.ru, но как-же раздражают такие вот сообщения. Полезной нагузки -ноль. Есть что сказать - скажи, но зачем воздух-то портить?
13 дек 08, 20:14    [6567512]     Ответить | Цитировать Сообщить модератору
 Re: Как "остановить" выполнение запроса раньше появления ORA-04030 ?  [new]
Полугурок
Member [заблокирован]

Откуда: из гурдома
Сообщений: 56
Просто мысли
Полугурок
Camper
На счте SQLCODE и SQLERRM в pl\sql коде поторопился...не отображается там 4030.
Ты и на счет почти всего другого поторопился :)
Вот неплохой в целом ресурс - sql.ru, но как-же раздражают такие вот сообщения. Полезной нагузки -ноль. Есть что сказать - скажи, но зачем воздух-то портить?
Чувак, раздражают "такие вот сообщения" - не читай. "Полная нагрузка" - не ноль, а толстый намек на то, что жонглирование недокументированными параметрами - это не признак знаний.

P.S. Сказать есть что, но не здесь. А если и здесь - то смотря кому.
14 дек 08, 14:54    [6568506]     Ответить | Цитировать Сообщить модератору
 Re: Как "остановить" выполнение запроса раньше появления ORA-04030 ?  [new]
rolechka
Member

Откуда:
Сообщений: 45
Серафимный Шестикрыл
Timm

и? как размер таблицы влияет на количество необходимой памяти для выполнения select ... from tab?


Я так мыслю, что там знаменитый SELECT BULK COLLECT INTO ...


нет, это просто селект документа...
15 дек 08, 15:11    [6572428]     Ответить | Цитировать Сообщить модератору
 Re: Как "остановить" выполнение запроса раньше появления ORA-04030 ?  [new]
rolechka
Member

Откуда:
Сообщений: 45
terrymoon
автор
Запрос все равно будет выбирать данные из большой таблицы....

Это еще не значит, что он будет жрать PGA до отвала.

автор
а в том как ее правльно словить до момента появления

Я думаю никак. Только мониторингом и тюнингом.



:( да уж
15 дек 08, 15:16    [6572463]     Ответить | Цитировать Сообщить модератору
 Re: Как "остановить" выполнение запроса раньше появления ORA-04030 ?  [new]
Серафимный Шестикрыл
Member [заблокирован]

Откуда: С луны свалился
Сообщений: 2922
andrey_anonymous

2) и что, с этим есть реальные проблемы?


С применением LIMIT в SELECT BULK COLLECT INTO ? Несомненно :))
15 дек 08, 15:25    [6572520]     Ответить | Цитировать Сообщить модератору
 Re: Как "остановить" выполнение запроса раньше появления ORA-04030 ?  [new]
Серафимный Шестикрыл
Member [заблокирован]

Откуда: С луны свалился
Сообщений: 2922
rolechka
нет, это просто селект документа...


Фраза эта имеет такой же примерно смысл, как "выйдя на двор шляпа слетела" :))

Пока не продемонстрируете собственно проблемную часть кода, дальнейший разговор
смысла просто не имеет.
15 дек 08, 15:27    [6572542]     Ответить | Цитировать Сообщить модератору
 Re: Как "остановить" выполнение запроса раньше появления ORA-04030 ?  [new]
rolechka
Member

Откуда:
Сообщений: 45
Серафимный Шестикрыл,

Ну извините - вы просите аккуратно написать селект, а сами неаккуратно читаете. Фраза "просто селект" - это ответ на вопрос не SELECT BULK COLLECT ли это. И я ответила что нет.
А запрос простой:

select * from big_table

В оригинале там еще есть лефтджойны, но, даже и убрав их, все равно рано или поздно возникает ора4030.
15 дек 08, 16:41    [6573191]     Ответить | Цитировать Сообщить модератору
 Re: Как "остановить" выполнение запроса раньше появления ORA-04030 ?  [new]
Серафимный Шестикрыл
Member [заблокирован]

Откуда: С луны свалился
Сообщений: 2922
rolechka

вы просите аккуратно написать селект, а сами неаккуратно читаете. Фраза "просто селект "


Нет, леди, это вы неаккуратно думаете.
"селект документа" - это рыдательно :))

rolechka

- это ответ на вопрос не SELECT BULK COLLECT ли это. И я ответила что нет.


ну, если вы считаете, что ответили, пусть будет так. :))

rolechka

В оригинале там еще есть лефтджойны, но, даже и убрав их, все равно рано или поздно возникает ора4030.


Вам уже выше предлагали подумать, каким образом SELECT может вызывать нехватку памяти.
Результаты SELECT надо куда-то передавать. Вот и подумайте, КУДА именно попадают результаты
вашего запроса, если уж вы не желаете нам об этом сообщать.
15 дек 08, 16:51    [6573261]     Ответить | Цитировать Сообщить модератору
 Re: Как "остановить" выполнение запроса раньше появления ORA-04030 ?  [new]
rolechka
Member

Откуда:
Сообщений: 45
селект передается, запускается и забирается компонентами dbexpress midas-а делфи. при выполнении видно как процесс оракла сжирает память до 2 гигов и валиться ошибка.
15 дек 08, 17:25    [6573495]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить