1

在生产中,我面临这个问题。

有一个delete需要很长时间才能执行并最终抛出 SQL 错误-243
我使用onstat -g.

有什么方法可以找出导致它花费这么多时间并最终出错的原因?

它使用COMMITTED READ隔离。

这也会导致高 Informix cpu 使用率。

编辑

环境- Solaris 上的 Informix 9.2

我没有看到任何与索引或应用程序逻辑相关的问题,但我怀疑存在一些 informix 损坏。执行此查询
时,会话在不同的表上持有 8 个锁。 但是,我在执行 的表上看不到任何锁。DELETE
delete

会不会是,informix 无法锁定表?

4

2 回答 2

1

DELETE 不关心您的隔离级别。您得到 243 是因为在您尝试运行删除操作时另一个进程正在锁定表。

我会将您的删除放入 SP 并提交每条第 X 条记录:

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;

那里有一些语法问题,但这对您来说是一个很好的起点。请记住,当您使用更多逻辑日志时,插入和更新会逐渐变慢。

于 2013-03-07T05:37:05.807 回答
0

Informix 多次不正常重启,导致 Informix 不稳定。
这是根本原因。

于 2013-04-04T07:31:26.800 回答