|
|
|
| Всем привет.
Вопрос в следующем, есть процедура, которая производит расчёт цен (2 столбца - цена сумма) в таблице. В процедуре запрос к таблице, отбирается порядка 10 столбцов, используется курсор, затем запускается цикл.
При запуске процедуры на удалённом сервере происходит останов сервера, клиент теряет связь. В таблице порядка 60000 строк, запрос отбирает порядка 2000 строк. На локальной базе процедура выполняется нормально.
В чём может быть проблема? Какой-то параметр сервера? | |
|
|
|
|
|
|
|
для: ronin80
(04.06.2008 в 07:52)
| | Да, закомментировал в процедуре все действия с базой, оставил только открытие и закрытие курсора, всё равно зависает, т.е. ошибка открытия курсора.
Как лечить? | |
|
|
|
|
|
|
|
для: ronin80
(04.06.2008 в 07:55)
| | В Eplain plan показывает что запрос отбирает 15000 строк, после выполнения процедуры на локальной базе память на ПК забивается под завязку (1 Гб)
Что за ерунда? Причём при выполнении такой же процедуры но с другой таблицей, где отбирается также порядка 2000-3000 строк всё проходит нормально, таких глюков не наблюдается. Правда отбор в этой таблице происходит по ключевому полю без дополнительных where. | |
|
|
|
|
|
|
|
для: ronin80
(04.06.2008 в 08:40)
| | Запрос многотабличный? Можете его привести? | |
|
|
|
|
|
|
|
для: cheops
(04.06.2008 в 10:56)
| | DECLARE nal_lines CURSOR FOR
SELECT control_acc.CA_ID, control_acc.RAZMER, control_acc.FORMA,
control_acc.COLOR, control_acc.DEFECT, control_acc.MASSA, control_acc.KOLVO,
control_acc.GRUPPA, dic_cuts.dfm_id
FROM jevel.dic_cuts, central.control_acc
WHERE (control_acc.FORMA = dic_cuts.DC_ID)
AND (control_acc.priznak=1)
AND (control_acc.MASSA>0)
AND (control_acc.KOLVO>0);
в таблице control_acc 60000 записей, в dic_cuts - 8 (это справочник) | |
|
|
|
|
|
|
|
для: ronin80
(04.06.2008 в 11:01)
| | закомментировал открытие курсора, процедура работает, только раскомментирую, сервер виснет | |
|
|
|
|
|
|
|
для: ronin80
(04.06.2008 в 11:01)
| | Всё правильно, в двухтабличном запросе может запросто выбираться до 15000 записей, так как выбирается декартово произведение таблиц (т.е. выбираемые строки уножаются). У вас данные в основном выбираются из таблицы control_acc - нельзя ли этот запрос свести к нескольким однотабличным - всё должно выбираться быстрее и с меньшим потреблением памяти? | |
|
|
|
|
|
|
|
для: cheops
(04.06.2008 в 11:06)
| | ответ понятен, тогда такой вопрос - раз объём данных влияет на результат, значит если я даже сделаю однотабличный запрос, настанет момент когда процедура всё равно перестанет выполняться? в связи с ростом объёмов данных? пробовал увеличить параметры сервера (буферы и т.п.) - не помогло. | |
|
|
|
|
|
|
|
для: ronin80
(04.06.2008 в 11:12)
| | >ответ понятен, тогда такой вопрос - раз объём данных влияет на результат, значит если я даже
>сделаю однотабличный запрос, настанет момент когда процедура всё равно перестанет
>выполняться? в связи с ростом объёмов данных? пробовал увеличить параметры сервера
>(буферы и т.п.) - не помогло.
Не факт, что перестанет, особенно, если таблица индексирована и не происходит полного скана таблицы. | |
|
|
|