sybase iq中的慢速SQL删除

我有一个庞大的表,其中有60亿行。

我的删除命令如下所示

delete from [table name] 
where ( [col1] = value1 and [col2] = value2 ) 
   or ( [col1] = value3 and [col2] = value4 )
... ~250 more such conditions 

即使我在col1和col2上都有HG指数,运行速度仍然太慢。

我们能够在15分钟内删除大约10万行。

关于如何改善删除性能的任何建议。

复合索引(col1,col2)会有所帮助吗?

zhongnancrack 回答:sybase iq中的慢速SQL删除

重复的OR条件会降低性能,您可以尝试降低性能,避免为此使用多个OR子句

如果您可以存储对(value1,value2),(value3,value4),... (valuen,valuen+1) 在临时table temp_table colA,colB上,且索引为colA,colB  您可以尝试通过内部联接使用delte

对于sybase,删除连接的sintax应该为

  DELETE
  FROM [table name]
  FROM [table name],temp_table
  WHERE [table name].col1 = temp_table.colA
  AND [table name].col2 = temp_table.colB

确保在[表名](col1,col2)上也有一个复合索引

,
  1. 首先,您在自己的条件下使用OR,innodb将不会使用 索引。

  2. 第二,更多索引将减慢删除命令的执行速度 时间。

  3. 第三,您的表太大,需要通过拆分对其进行优化 按日期或其他符号。

因此,如果要使用索引,可能是需要通过拆分或条件几次运行delete命令,这将使用索引。

PS:使用复合索引(col1,col2)会更快。

如果您想要的记录不多。

请参阅:http://dev.mysql.com/doc/refman/5.0/en/delete.html

  

如果要从大型表中删除许多行,则可能超出InnoDB表的锁定表大小。为避免此问题,或者只是为了最小化表保持锁定的时间,以下策略(根本不使用DELETE)可能会有所帮助:

# Select the rows not to be deleted into an empty table that has the same structure as the original table:
INSERT INTO t_copy SELECT * FROM t WHERE ... ;

# Use RENAME TABLE to atomically move the original table out of the way and rename the copy to the original name:
RENAME TABLE t TO t_old,t_copy TO t;

# Drop the original table:
DROP TABLE t_old;
,

删除操作很昂贵。 15分钟内10万行大约是每秒111行。根据许多因素,这不一定很糟糕,您在问题中没有对此进行解释:

  • 系统上有什么负载?
  • 其他查询是否干扰删除所需的锁?
  • 表上有多少个索引?
  • 该表是否有外键引用?
  • 是否有delete个触发器?

delete是一项昂贵的操作。除了delete所需的特定工作外,还需要锁定行/页,并需要记录结果。

尚不清楚查找行是导致您认为性能问题的原因。查找行将对索引有所帮助。当然,可能是 的问题。但这并不明显。

在许多数据库中,大规模删除的速度非常慢,以至于在没有所需行的情况下重新创建表的速度更快。也就是说,此序列可以更快:

  • 创建一个新表,使用where过滤行。
  • 截断原始表(首先创建备份副本!)。
  • 将数据重新插入表中。
本文链接:https://www.f2er.com/3161038.html

大家都在问