我最近遇到了这个。在 DB2 LUW(至少 9.5 或更高版本)中定义表时,可以将其定义为NOT LOGGED INITIALLY
.
我读过的书中的例子:
CREATE TABLE products (
productID INT,
product_Name VARCHAR(30)
)
NOT LOGGED INITIALLY;
我已阅读的文档指出,在执行INSERT
、UPDATE
、DELETE
、CREATE INDEX
、ALTER TABLE
或执行语句DROP INDEX
之前不会记录该表。COMMIT
之前的所有COMMIT
内容都没有记录。是之后的一切COMMIT
。
显然,只要您将表定义为NOT LOGGED INITIALLY
,您就可以随时发出 anALTER TABLE <table-name> ACTIVATE NOT LOGGED INITIALLY
将表恢复为非日志记录状态,直到COMMIT
再次发出 a 为止。
他们举了一个例子,我可以看到这在哪里有用。我读的书说你可以发出以下
ALTER TABLE <table-name> ACTIVATE NOT LOGGED INITIALLY WITH EMPTY TABLE;
这显然会删除表中的所有数据而不记录它。我可以理解这在您希望清除数据并重新测试而无需记录删除以进行回滚的性能开销的测试环境中是可取的。
但除此之外,我很困惑。您是否有任何理由不希望在测试环境之外登录表?这种桌子还有什么其他用途?
经典的真实示例是我创建的表是来自静态外部源的副本。如果数据库在初始加载期间发生故障,那么只删除部分加载的表并从头开始我的导入操作会比完全记录事务的开销要快。
例如,我正在使用我的事务环境备份文件中的客户列表加载我的报告环境。
也来自手册:
这在生产环境中也很有意义。
当您刚刚创建一个表并需要用大量数据填充它时,最初未记录很有用。您无需担心恢复数据,因为您已经在某个地方拥有它,因此不需要记录任何数据填充。如果您不需要记录数据,这可以大大加快数据填充时间。
由于尚未回答此问题的生产部分,因此我有一个有用的示例。我正在将生产表备份到我的用户空间。该表包含大量数据(约 850GB 压缩),无法通过正常方式进行备份,因为它生成的日志文件(在我终止插入之前超过 18GB)导致多个下游函数失败。NOT LOGGED INITIALLY 是我防止这种情况发生的唯一选择。