最近使用delete from删除较多记录时,由于日志文件小,系统报错无法删除。所以想寻求一种不写日志文件的删除方法。
在网上查了一下,Oracle提供一种叫trancate的函数,可以清空表中记录而不写日志文件。而db2提供一种NLI(not logged initially)模式,但是需要在建表时加not logged initially属性。如对表进行insert、update或delete操作不想写入日志文件时,先ALTER TABLE <name> ACTIVATE NOT LOGGED INITIALLY,然后在执行sql语句,执行完后最好commit一下,恢复原设置。
但是这样做有缺点(摘至ibm网站):
1,如果有一条语句失败,那么这个表将被标记为不可访问的,并且需要被删除掉。这与其他恢复问题(请参阅 SQL Reference 关于 Create Table 的讨论)一起使得 NLI 在很多情况下不能成为可行的方法。
2,在工作单元最后进行的提交,必须等到在此工作单元内涉及的所有脏页都被写到磁盘之后才能完成。这意味着这种提交要占用大量的时间。实际上, test 6 和 7已表明,如果没有积极地进行页清除,那么在使用 NLI 的情况下,Insert 加上提交所耗费的总时间要更长一些。不过,test 8 表明,将 NLI 与积极的页清除一起使用的时候,可以大大减少耗时。如果使用 NLI,就要瞪大眼睛盯紧提交;操作所耗费的时间。