Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Ошибка выполнения процедуры
 
 автор: ronin80   (04.06.2008 в 07:52)   письмо автору
 
 

Всем привет.

Вопрос в следующем, есть процедура, которая производит расчёт цен (2 столбца - цена сумма) в таблице. В процедуре запрос к таблице, отбирается порядка 10 столбцов, используется курсор, затем запускается цикл.

При запуске процедуры на удалённом сервере происходит останов сервера, клиент теряет связь. В таблице порядка 60000 строк, запрос отбирает порядка 2000 строк. На локальной базе процедура выполняется нормально.

В чём может быть проблема? Какой-то параметр сервера?

   
 
 автор: ronin80   (04.06.2008 в 07:55)   письмо автору
 
   для: ronin80   (04.06.2008 в 07:52)
 

Да, закомментировал в процедуре все действия с базой, оставил только открытие и закрытие курсора, всё равно зависает, т.е. ошибка открытия курсора.

Как лечить?

   
 
 автор: ronin80   (04.06.2008 в 08:40)   письмо автору
 
   для: ronin80   (04.06.2008 в 07:55)
 

В Eplain plan показывает что запрос отбирает 15000 строк, после выполнения процедуры на локальной базе память на ПК забивается под завязку (1 Гб)

Что за ерунда? Причём при выполнении такой же процедуры но с другой таблицей, где отбирается также порядка 2000-3000 строк всё проходит нормально, таких глюков не наблюдается. Правда отбор в этой таблице происходит по ключевому полю без дополнительных where.

   
 
 автор: cheops   (04.06.2008 в 10:56)   письмо автору
 
   для: ronin80   (04.06.2008 в 08:40)
 

Запрос многотабличный? Можете его привести?

   
 
 автор: ronin80   (04.06.2008 в 11:01)   письмо автору
 
   для: 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)
 

закомментировал открытие курсора, процедура работает, только раскомментирую, сервер виснет

   
 
 автор: cheops   (04.06.2008 в 11:06)   письмо автору
 
   для: ronin80   (04.06.2008 в 11:01)
 

Всё правильно, в двухтабличном запросе может запросто выбираться до 15000 записей, так как выбирается декартово произведение таблиц (т.е. выбираемые строки уножаются). У вас данные в основном выбираются из таблицы control_acc - нельзя ли этот запрос свести к нескольким однотабличным - всё должно выбираться быстрее и с меньшим потреблением памяти?

   
 
 автор: ronin80   (04.06.2008 в 11:12)   письмо автору
 
   для: cheops   (04.06.2008 в 11:06)
 

ответ понятен, тогда такой вопрос - раз объём данных влияет на результат, значит если я даже сделаю однотабличный запрос, настанет момент когда процедура всё равно перестанет выполняться? в связи с ростом объёмов данных? пробовал увеличить параметры сервера (буферы и т.п.) - не помогло.

   
 
 автор: cheops   (04.06.2008 в 11:26)   письмо автору
 
   для: ronin80   (04.06.2008 в 11:12)
 

>ответ понятен, тогда такой вопрос - раз объём данных влияет на результат, значит если я даже
>сделаю однотабличный запрос, настанет момент когда процедура всё равно перестанет
>выполняться? в связи с ростом объёмов данных? пробовал увеличить параметры сервера
>(буферы и т.п.) - не помогло.
Не факт, что перестанет, особенно, если таблица индексирована и не происходит полного скана таблицы.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования