2013-03-07 4 views
1

В производстве, я столкнулся с этой проблемой.Informix DELETE запрос занимает много времени

Существует delete, который занимает много времени для выполнения и, наконец, бросает ошибку SQL -243.
Я получил запрос, используя onstat -g.

Есть ли способ узнать, что заставляет его занять много времени и, наконец, выйти из системы?

Он использует COMMITTED READ изоляция.

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

EDIT

Environment - Informix 9.2 на Solaris

Я не вижу никакой проблемы, связанные с индексами или логики приложения, но я подозреваю, что некоторые Informix коррупции.
Сессия содержит 8 блокировок на разных таблицах при выполнении этого запроса DELETE.
Но, я не вижу никаких замков на столе, на котором выполняется delete.

Будет ли что-то вроде, informix не может получить блокировку на столе?

+0

Вы пытались запустить 'УДАЛИТЬ ОТ таблицы WHERE ...' как 'SELECT * FROM Table WHERE ...' (для любого подходящего подмножества всех столбцов) и рассмотрели план запроса? Как быстро это работает? Имеются ли в таблице столбцы blob или столбцы smart blob? Каков план запроса для DELETE; как он сравнивается с планом SELECT? Есть ли недостаток в индексе, который ускорит это? Сколько индексов находится на столе? Существует ли так много, что сокращение числа индексов приведет к повышению производительности? Какая версия Informix? Запуск на платформе? –

+0

Таблица имеет индекс группы по 2 столбцам, а удаление также основано на двух столбцах. – cppcoder

ответ

1

DELETE не заботится о вашем уровне изоляции. Вы получаете 243, потому что другой процесс блокирует таблицу, когда вы пытаетесь запустить операцию удаления.

Я бы поставил вашего удаления в SP и совершить каждый XTH запись:

CREATE PROCEDURE tmp_delete_sp (
    p_commit_records INTEGER 
) 
RETURNING 
    INTEGER, 
    VARCHAR(64); 

DEFINE l_current_count INTEGER; 

SET LOCK MODE TO WAIT 5; -- Wait 5 seconds if another process is locking the table. 

BEGIN WORK; 

FOREACH WITH HOLD 
    SELECT ..... 

    DELETE FROM table WHERE ref = ^^ Ref from above; 

    LET l_current_count = l_current_count + 1; 

    IF (l_current_count >= p_commit_records) THEN 
    COMMIT WORK; 
    BEGIN WORK; 
    LET l_current_count = 0; 
    END IF; 

END FOREACH; 

COMMIT WORK; 

RETURN 0, 'Deleted records'; 
END PROCEDURE; 

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

0

Informix был перезапущен несравненно много раз, что привело к неустойчивости Informix.
Это была основная причина.

Смежные вопросы