Gla*_*zed 7 sql-server sql-server-2014
我在 Windows NT 6.3 (Build 9600:) 上使用 Microsoft SQL Server 2014 - 12.0.4100.1 企业版(64 位)
我有一个 491 GB 的表,其中有 36 亿行没有主键。我希望添加的主键仅涵盖bigint
包含唯一值的单个列。数据库有 477 GB 的可用空间,但这似乎还不够。
尝试添加它失败并出现以下错误:
无法为数据库 '[Redacted]' 中的对象 'dbo.SORT 临时运行存储:424251614560256' 分配空间,因为 'PRIMARY' 文件组已满。通过删除不需要的文件、删除文件组中的对象、向文件组添加其他文件或为文件组中的现有文件设置自动增长来创建磁盘空间。
错误中的数据库名称是我尝试添加 PK 的数据库,而不是“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
Run Code Online (Sandbox Code Playgroud)
起初,该命令在 8-9 分钟后失败,然后我的 DBA 将另一个数据文件添加到具有大约 150 GB 可用空间的驱动器上的数据库中。24 分钟后再次运行它失败。这是进步,但我不知道需要多少可用空间,或者添加此索引实际需要多长时间。此数据库中目前有 477 GB 可用空间,但似乎仍不足以运行此类。
有什么方法可以计算在 36 亿个bigint
值上运行此命令需要多少空间?或者是否有其他技巧可以帮助此命令成功?这个大数字在错误中意味着什么?
小智 4
我还要补充一点,创建聚集索引时不仅会移动数据页,而且所有非聚集索引都必须重建,因为非聚集索引中的每一行都包含聚集键值。所有这些数据移动都需要记录下来,并且排序过程将大量使用 tempDb,因为您可能没有 500 GB 的可用内存,对吧?;)
您会发现关于使用堆的大量争论和不同意见,我当然在这里进行推测,但很可能有一个原因为什么这么大的表还没有在其顶部定义聚集索引。这并不完全是最佳实践,但有时定义一个没有聚集索引(快速、最少记录的插入)的表,并使用一些涵盖频繁查询的窄非聚集索引确实有意义。
关于添加任何类型的索引(主索引、聚集索引、非聚集索引、XML、空间索引……)的决定当然取决于您要解决的问题。在 OLTP 系统中,您通常会优化索引以提高写入性能,而在 OLAP 等报告系统中,您通常需要处理读取类型的工作负载。
还有一些建议来总结这一点: - 主键不必聚集 - 如果表没有分区,你绝对应该考虑对其进行分区 - 如果你的目标是使某些类型的查询更快(并且不试图强制唯一性)您的 bigint 列)您应该考虑创建额外的(或修改现有的)非聚集(可能已过滤)索引或索引视图(非常适合聚合查询)
希望它有帮助,祝你好运!
归档时间: |
|
查看次数: |
1569 次 |
最近记录: |