在非常大的数据库中设置主键

时间:2011-11-15 20:19:31

标签: sql-server

我有一个非常大的表(大约1300万行),我想设置表的主键。问题是,考虑到数据库的大小,当我尝试为表设置主键时,我的计算机崩溃了。

我认为SQL Server会尝试在找到的每一行中设置此密钥,因此内存消耗达到了我的计算机的限制(6gb的内存)。是否有任何有效和替代的方法来设置主键而没有这些问题?

3 个答案:

答案 0 :(得分:6)

以下是一些可能有用的选项:

  1. 创建一个包含相同列和主键的新表,然后从另一个表中选择它。
  2. 创建更改脚本并在SSMS中禁用执行超时
  3. 这是一个指向正确方向的更改脚本:

    ALTER TABLE tableName WITH NOCHECK 
    ADD CONSTRAINT PK_tableName PRIMARY KEY CLUSTERED (columnName)
    WITH (FILLFACTOR = 75, ONLINE = ON, PAD_INDEX = ON)
    

答案 1 :(得分:0)

另一种选择是使用适当的主键创建新表。编写除了初始表中基本表结构之外的任何关系。在确保您具有当前备份之后,将数据库设置为单用户模式(因此在您处理传输过程中没有人可以更改记录)。

然后将旧表中的记录一次插入10000个浴缸中。它将花费比一个基于集合的插入更长的时间,但不太可能超时。您可能需要经验才能找到最佳批量大小。完成后,删除旧表,重命名新表并再次设置任何pk / fk关系。然后走出单用户模式。

这是一项只能在非繁忙时段进行生产的任务,作为数据库维护任务,在发生数据库时不应允许任何其他人访问数据库。

请注意,您可能没有关于表的自然键的唯一信息。在这种情况下,如果您将其用作pk,则可能会出现问题,并且可能需要将某些记录移动到异常表以进行修复。即使您使用surogate键作为新PK,我强烈建议尽可能使用表的自然键上的唯一索引。

答案 2 :(得分:0)

我看到的原因之一是SQL Server可以分配的内存量远远大于机器愿意提供的内存量,因此最终导致崩溃。尝试将分配给SQL Server的内存更改为较小的内存占用量,并查看是否是原因。 SQL Server应该能够处理那么多记录,但是如果它试图同时将它们全部加载到内存中来完成可能导致问题的工作。