当我在SQL Server中删除列时会发生什么

时间:2014-11-26 11:40:07

标签: sql sql-server performance

如果我的理解是正确的,那么SQL Server中一个页面上存储的行数由表中的列数及其数据类型决定。一个I / O操作可以读取一个页面,因此一行中可以容纳的行数越多,一次I / O操作就可以返回更多的行,并且查询运行得更快。

我想知道当你放弃一个列时会发生什么? SQL Server是否会返回内存并“重新存储”数据,即如果我删除足够的列以使更多数据适合一个页面,该怎么办?如果SQL Server不自动执行此操作,我可以强制执行该过程吗?

我在大量使用的表上删除了很多文本列和一些ID,我希望在删除列后I / O会有所改善。

2 个答案:

答案 0 :(得分:6)

删除列是一种逻辑操作,而不是物理操作。没有数据被修改。列元数据标记为'已删除'并将被忽略。记录大小不变。请阅读SQL Server table columns under the hood以获取更多详细说明,并清楚说明我的主张。

正如Stefan所说,你必须重建表(堆或聚集索引)以回收'回收'空间。

  

我在大量使用的表上删除了很多文本列和一些ID,我希望在删除列后I / O会有所改善。

使用索引来减少IO。对于不可索引的临时分析工作负载,请使用columnstores。阅读How to analyse SQL Server performance

答案 1 :(得分:4)

您可以重建聚集索引以强制SQL Server使用可用空间。否则你就会出现'#34; hole"在页面中。