创建标识列需要多长时间?

4

我有一张拥有4000万条记录的表。

哪种方法更好(更快)?直接在该表中创建一个列,还是创建另一个带有标识列的表,并从第一个表中插入数据?

如果我在拥有4000万条记录的表中创建一个标识列,有可能估计需要多长时间来创建它吗?


我需要知道,因为我16小时前创建了身份列...但还没有完成... - Zanoni
22个小时已经过去了,还在继续... - Zanoni
哇。请告诉我们何时/是否完成。我很好奇这里会发生什么。 - user158017
我已手动停止执行(并重新启动服务器)。总共执行时间为1天17小时... - Zanoni
6个回答

2
这有点取决于具体情况。如果在表的末尾添加一个身份列,这并不会花费太长时间(好吧,相对于表的大小而言),假设您是这么做的。如果不是这样,服务器就必须创建一个带有身份列的新表,将所有行导出到新表中,然后更改表名。我猜这就是花费如此之久的原因。

很有道理,为什么根据我的经验时间的数量大致相同。感谢解释。 - user158017

1

我猜测它被阻止了 - 你是使用GUI还是查询窗口(你知道它正在运行的SPID吗?)

试试这些 - 如果它们给出结果并且你不确定该怎么做,请告诉我们:

USE master

SELECT * FROM sysprocesses WHERE blocked <> 0

SELECT * FROM sysprocesses WHERE status = 'runnable' AND spid <> @@SPID

两个查询都没有返回任何结果。 - Zanoni

0

这不是你只需要做一次的事情吗,因此花费多长时间并不是真正的问题?(假设它不需要花费数天时间...)


2
我需要知道,因为我16小时前创建了身份列...但还没有完成... - Zanoni

0

你能否创建一个测试数据库副本,并在其中创建该列,以查看需要多长时间吗?


它已经在运行了。他想知道它是否会完成,或者是否有什么问题。 - geowa4
我在我们都知道之前就回答了,所以是的,现在我们知道了。 - Mark Redman
这是一个棘手的问题,有可能取消/停止脚本并在测试数据库上尝试一下?或者再次并行测试,看看在测试中是否更快,以指示是否出现了问题?数据库是否仍在为应用程序运行? - Mark Redman
我正在测试数据库中操作。不过,数据库查询非常缓慢。 - Zanoni

0

我认为很多事情取决于硬件和你所使用的数据库管理系统。在我的环境中,创建一个新表并将旧数据复制到其中需要大约3到4个小时。根据其他经验,我预计添加一个标识列需要大约同样的时间。我使用的是Oracle,在SAN上有多个服务器,因此速度比单个服务器环境要快。你可能只需要坐下来等待。


这是一个使用Microsoft SQL Server 2005的测试服务器。处理器为Intel Core 2 DUO 2.20GHz,内存为4GB。 - Zanoni

0
如果您在查询窗口中使用了ALTER TABLE [...] ADD ...,那么速度非常快,实际上它早就完成了。如果您使用Management Studio表设计器,则会将表复制到新表中,删除旧表,然后将新表重命名为旧表。这需要一些时间,特别是如果您没有预先增加数据库和日志以容纳所需的额外空间。因为这是一个单一的事务,如果现在停止它,回滚需要大约另外16个小时。

查询是否被阻塞或正在进行中?看起来时间太长了。请检查 wait_time 和 wait_resource 是否在 sys.dm_exec_requests 中。 - Remus Rusanu
@Remus Rusanu => 查询仍在运行,但我不知道问题出在哪里。>>> 等待时间=0, 等待资源=31:1:1219931, 状态=SUSPENDED, 命令=ALTER TABLE, 等待类型=PAGEIOLATCH_EX 总经过时间=86053703 - Zanoni
所以只是等待IO获取页面来修改它们。看起来像一个真正缓慢的磁盘系统。查看托管mdf(s)和ldf的物理磁盘上的平均磁盘队列长度有多长,磁盘吞吐量,尽量避免在ALTER完成之前对这些驱动器进行任何不必要的I/O操作。sys.dm_exec_requests是否显示了完成百分比,以便您获得完成时间的估计? - Remus Rusanu
顺便问一下,你在添加列时是否也添加了约束条件,例如主键 PRIMARY KEY? - Remus Rusanu
@Remus Rusanu:不,sys.dm_exec_requests命令没有显示percent_complete列。该值一直为0。没有添加任何约束(主键)。完整的命令是:ALTER TABLE TABLE_TEST ADD UNIQUEID INT NOT NULL IDENTITY (1, 1)。 - Zanoni

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接