我在Informix DB的表中有大约300万行。 在加载新数据之前,我们必须将其删除。 它的一个列上有一个主键。 为了删除它,我想到了使用rowid。但是当我尝试
时select rowid from table
它响应-857错误[Rowid不存在]。
所以,我不确定,如何删除。我不喜欢使用主键,因为与rowid删除相比,主键删除成本高。
对上述内容的任何建议都会有所帮助。
答案 0 :(得分:2)
如果您收到错误-857,表格可能会碎片化,并且是在没有WITH ROWIDS
选项的情况下创建的。
您使用的是哪个版本的Informix,以及在哪个平台上使用?
您拥有TRUNCATE TABLE语句的可能性很高,该语句旨在非常快速地从表中删除所有行。
如果做不到这一点,你可以直截了当地使用:
DELETE FROM TableName;
只要您有足够的逻辑日志空间可用。如果这不起作用,那么你需要根据主键(或任何其他方便的列)的范围重复执行DELETE语句。
或者您可以考虑删除表然后重新创建它,可能使用WITH ROWIDS子句(虽然我不特别建议使用WITH ROWIDS子句 - 它变成一个带索引的物理列而不是虚拟列,因为它在一个非碎片表中)。删除和重建表的一个缺点是必须恢复引用约束,并且在删除表时会自动删除构建在表上的任何视图,因此它们也必须恢复。
答案 1 :(得分:1)
我假设这是IDS?..将加载多少新行以及此过程重复多久?尽管不得不重新建立参考约束和视图,但在我看来,它要好得多删除表,从头创建它,加载数据然后创建索引,因为如果你只是删除所有行,删除的行仍然在物理上保留在表中,行的末尾有一个NULL \ 0标志,因此在新行中加载时,表大小会更大,性能也会受到影响!这也是创建新索引的好机会,如果可能的话,预先对加载数据进行排序,使其按照最理想的顺序排序(如创建一个CLUSTERED INDEX)。如果你要在表达式或其他类型上对表进行分段,那么ROWID会离开窗口,但是如果你确定该表永远不会被分段,则使用WITH ROWIDS。如果您的表有一个串行列,是否还有其他表使用串行列作为外键?