我在WindowsNT6.3上使用MicrosoftSQLServer2014-12.0.4100.1企业版(64位) (Build 9600:)
我有一个491 GB的表,它有36亿行,没有主键。我希望添加的主键只包含一个包含唯一值的bigint列。该数据库有477 GB的空闲空间,但这似乎还不够。
试图添加它会失败,但会出现以下错误:
无法为数据库“编校”中的对象“dbo.SORT临时运行存储:424251614560256”分配空间,因为“主”文件组已满。通过删除不需要的文件、删除文件组中的对象、向文件组添加其他文件或为文件组中的现有文件设置自动增长,创建磁盘空间。
错误中的数据库名是我试图添加PK的DB,而不是'tempdb',这是我在这类错误中经常看到的。
我使用的命令:
ALTER TABLE REDACTED ADD CONSTRAINT [PK_REDACTED] PRIMARY KEY CLUSTERED
(
[RedactedId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO一开始,命令在8-9分钟后失败,然后我的DBA在一个拥有150 GB空闲空间的驱动器上向DB添加了另一个数据文件。24分钟后第二次运行失败。这是进步,但我不知道需要多少空闲空间,也不知道添加这个索引需要多长时间。目前这个数据库中有477 GB的空闲,但这似乎还不足以运行这类数据库。
有没有办法计算在36亿bigint值上运行此命令所需的空间?或者还有其他的技巧可以帮助这个命令成功?那么大的数字在误差中意味着什么?
发布于 2016-08-09 13:00:40
我还要补充的是,不仅在创建聚集索引时数据页将被移动,而且所有非聚集索引都必须重建,因为非聚集索引中的每一行都包含聚集的键值。所有这些数据移动都需要记录,排序过程将大量使用tempDb,因为您可能没有500个GBs的内存,对吗?)
你会发现很多关于使用堆的争论和不同的观点,我当然在这里推测,但最有可能的原因是为什么这么大的表还没有在上面定义一个聚集索引。这并不是最好的实践,但有时定义一个没有聚集索引的表(快速的、最少日志记录的插入)和一些包含频繁查询的狭窄的非聚集索引是有意义的。
关于添加任何索引的决定(主索引、聚集索引、非聚集索引、XML索引、空间索引、.)当然要看你想要解决的问题了。在OLTP系统中,您通常优化索引以提高写入性能,而在OLAP这样的报表系统中,通常需要处理读取类型的工作负载。
并且很少有建议来总结这一点:-主键不需要集群--如果表没有分区,那么绝对应该考虑分区它--如果您的目标是使某些类型的查询更快(而不是试图强制执行bigint列的唯一性),您应该考虑创建额外的(或修改现有的)非聚集(可能是经过过滤的)索引或索引视图(对于聚合查询来说非常适合)。
希望能帮上忙,祝你好运!
https://dba.stackexchange.com/questions/143136
复制相似问题