我有一张有 4000 万条记录的表。
什么是最好的(更快)?直接在该表中创建一个列或创建另一个具有标识列的表并从第一个插入数据?
如果我在有 4000 万条记录的表中创建一个标识列,是否可以估计创建它需要多长时间?
我有一张有 4000 万条记录的表。
什么是最好的(更快)?直接在该表中创建一个列或创建另一个具有标识列的表并从第一个插入数据?
如果我在有 4000 万条记录的表中创建一个标识列,是否可以估计创建它需要多长时间?
这种取决于。假设您将其附加到表的末尾,创建标识列不会花费那么长时间(好吧,这与表的大小有关)。如果没有,服务器必须在所需位置创建一个带有标识列的新表,将所有行导出到新表,然后更改表名。我猜这就是需要这么长时间的原因。
我猜它被阻止了——你使用的是 GUI 还是查询窗口(你知道它运行的 SPID 吗?)
试试这些——让我们知道他们是否给出了结果,而您不确定该怎么做:
USE master
SELECT * FROM sysprocesses WHERE blocked <> 0
SELECT * FROM sysprocesses WHERE status = 'runnable' AND spid <> @@SPID
这不是您只需要做一次的事情,因此需要多长时间真的不是问题吗?(假设不需要几天......)
您不能创建数据库的测试副本并在其上创建列以查看需要多长时间吗?
我认为很大程度上取决于硬件和您所在的 DBMS。在我的环境中,创建一个新表并将旧数据复制到其中大约需要 3 或 4 个小时。仅基于其他经验,我预计添加标识列将花费大约相同的时间。我在使用 SAN 上的多台服务器的 Oracle 上,因此事情可以比在单个服务器环境中运行得更快。您可能只需要坐下来等待。
如果你ALTER TABLE [...] ADD ...
在查询窗口中使用,它是相当快的,事实上它早就完成了。如果您使用 Management Studio 表设计器,它会将表复制到新表中,删除旧表,然后将新表重命名为旧表。这将需要一段时间,特别是如果您没有预先增长数据库和日志以容纳所需的额外空间。因为都是一个单一的事务,如果你现在停止它,大约需要 16 个小时才能回滚。