如果我的理解是正确的,那么SQL Server中一个页面上存储的行数由表中的列数及其数据类型决定。一个I / O操作可以读取一个页面,因此一行中可以容纳的行数越多,一次I / O操作就可以返回更多的行,并且查询运行得更快。
我想知道当你放弃一个列时会发生什么? SQL Server是否会返回内存并“重新存储”数据,即如果我删除足够的列以使更多数据适合一个页面,该怎么办?如果SQL Server不自动执行此操作,我可以强制执行该过程吗?
我在大量使用的表上删除了很多文本列和一些ID,我希望在删除列后I / O会有所改善。
答案 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"在页面中。