我在一个 sql server 数据库中有 3000 万行,我在其中添加了一个简单的标记列。一个字符允许为空。我确实为该列添加了一个索引。
我用它来跟踪哪些行已被处理以进行数据提取。在初始开发期间,我将从头开始(多次)重新启动提取过程,并且需要将值重置为“1”。
作为新手数据库开发人员(我在跟谁开玩笑……),我的第一次尝试是使用一个简单的更新脚本将“2”(我已经处理过这一行)的值重置为“1”。我第一次运行脚本时,它在大约 5 分钟内执行完毕。我最后一次执行 - 花了 45 分钟。一定有更好的方法。
我是否可以通过完全删除该列并使用默认值“1”重新创建它来加快速度?速度会保持一致吗?
- 更新 - -
下次我需要这样做时,我将尝试以下操作:
ALTER TABLE acmewidgets DROP COLUMN LegacyExtract;
ALTER TABLE acmewidgets
ADD LegacyExtract CHAR NOT NULL DEFAULT (1);
使用以下内容并在 41 秒内执行!
取决于您拥有的数据类型以及它是否是写入密集型的,但我已经经常使用这种方法。
您还可以选择:ALTER TABLE TABLEX_2 DISABLE/ENABLE KEYS在大插入之前和之后。
这种方法的好处是 RENAME 是原子的
使用数据库快照。对于单个列,这可能过多。对于多个可能很复杂的还原,它可以很好地工作。
当数据库处于所需的初始状态时拍摄快照。这对消费者来说是一个新的数据库。它将是创建快照时数据的只读副本。最初它没有自己的页面,因此创建速度快且占用空间小。随着基础数据库发生变异,页面的“之前”图像被写入快照。因此,快照数据库始终具有创建时的数据,而基础数据库具有新数据。快照的大小取决于写入的更改量。在会话结束时,在基础数据库上恢复快照,从而重新初始化数据。
由于快照是可读的,因此它对于通过比较“之前”(快照)数据和“之后”(基础数据库)数据来验证更改也很有用。