Задавайте вопросы, мы ответим
Вы не зашли.
Добрый вечер, скажите если запрос объявленый для курсора DECLARE cur1 CURSOR FOR SELECT a,b FROM table WHERE c=1;возратит пустую строку, то курсор все равно создаться и начнется процесс по открытию курсора, чтение из него и.т.д.и.т.п? Или процедура завершится так и не успев начаться? Или нужно принудительно писать обработчик EXIT HANDLER FOR NOT FOUND?
Неактивен
Создастся, всё будет работать, как положено. Ошибку Вы получите на этапе
FETCH, разумеется.
Неактивен
Ребят, подскажите по такой ситуации.
Прогоняю курсор по всей таблице с почти 200 миллионов записей, у меня всё повисло на несколько минут, результата работы курсора я не увидел (результататы заносятся в другую таблицу), в процессах в статусе запроса было "Sending data", в итоге я процесс убил. Сделал лимит для курсора до 10 тысяч строк, он отработал пулей.
Собственно вопрос, курсор сначала пытался прочитать все 200кк записей и уже потом по ним шагал бы или почему он так долго соображал? Какое-то время на ициниализацию нужно может? Он же вроде и должен как раз вытягивать по одной записи, но в моём случае почему-то за несколько минут ничего не сделал.
Неактивен
Странно, курсор должен работать последовательно и не тратить времени на подготовку. Курсор по сути выполняет элементарную операцию поиска по ключу. Может быть все было в транзакции и она откатилась после того, как запрос был убит?
Неактивен
Таблицы myisam, транзакциями не пахнет, если я правильно понял вопрос. Собственно наличие записей во второй таблице я мониторю во время выполнения курсора.
Ставлю в запросе курсора WHERE `id`<=1000000, курсор отрабатывает за несколько секунд и вторая таблица заполняется значениями. Убрал WHERE, курсор запущен уже 3000 секунд, а во второй таблице нет ни одной записи. Вот решил подождать пару дней пока он завершит работу, может он все изменения вносит по факту закрытия курсора, хотя вроде не логично это.
Неактивен
Не логично, надо попробовать помониторить ситуацию как-то еще. id - индекс?
Неактивен
Естественно, PRIMARY С триггерами проще, все запросы попадают в лог, а вот с процедуркой не сложилось, кроме CALL в лог запросов ничего не попадает, трудно понять что происходит в конкретный момент времени.
Неактивен
Может что в самой процедуре не так, опыта работы с курсорами почти нет, хотя он мне в наследство достался)))
Неактивен
Пробуйте вставлять что-то в отдельную таблицу после каждой команды. Тогда станет понятно на чем висит. Скорее всего проблема из-за JOIN и курсор создает в начале временную таблицу с копией всех данных.
Откажитесь от курсоров.
Неактивен
Что интересно, прошло вот чуть более часа пока работал курсор и теперь таблица начала заполняться, а в PROCESSLIST отображаются запросы процедуры, это не может не радовать. Получается, что час с лишним всё же были какие-то подготовки, вот только не понятно какие и почему. Но в логах запросы процедуры так и не отображаются.
Вот словил такой запрос в процессах:
Неактивен
rgbeast написал:
Скорее всего проблема из-за JOIN и курсор создает в начале временную таблицу с копией всех данных.
Изначально запрос был без JOIN, поведение было такое же.
Неактивен