Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQL Server中删除列时会发生什么_Sql_Sql Server_Performance - Fatal编程技术网

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

在SQL Server中删除列时会发生什么,sql,sql-server,performance,Sql,Sql Server,Performance,如果我的理解是正确的,那么SQL Server中一页上存储的行数由表中的列数及其数据类型决定。一个I/O操作可以读取一个页面,因此一个页面中容纳的行越多,一个I/O操作可以返回的行越多,查询运行得越快 我想知道当你放下一个专栏时会发生什么?SQL Server是否返回内存并“重新存储”数据,也就是说,如果我删除足够多的列以便在一个页面上容纳更多数据,该怎么办?如果SQL Server没有自动执行此操作,我可以强制执行此过程吗 我正在删除大量使用的表上的许多文本列和一些ID,我希望删除这些列后I/

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

我想知道当你放下一个专栏时会发生什么?SQL Server是否返回内存并“重新存储”数据,也就是说,如果我删除足够多的列以便在一个页面上容纳更多数据,该怎么办?如果SQL Server没有自动执行此操作,我可以强制执行此过程吗


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

您可以重建聚集索引以强制SQL Server使用可用空间。否则,页面中会出现“漏洞”。

删除列是一种逻辑操作,而不是物理操作。没有数据被修改。列元数据被标记为“已删除”,将被忽略。记录大小不变。阅读更多详细的解释和清晰的例子来证明我的主张

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

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


使用索引来减少IO。对于不可索引的即席分析工作负载,请使用columnstores。阅读。

没那么简单。我想,原始I/O只有在进行完全扫描时才重要。大多数情况下,您应该使用索引。另外,sql server应该有压缩数据文件的命令。@SergioTulentsev非常感谢您的回复。根据经验,窄表的工作速度比宽表快得多。对于窄表,I/O成本要小得多(根据执行计划)。因此,我只是想知道是否有任何额外的步骤,我可以采取,以确保我得到我们的删除栏的最大收益非常感谢您的答复。不幸的是,我并不总是知道所使用的查询,因为我们有业务对象来生成查询。所以我不能一直使用索引。非常感谢,Stefan。我将把Remus的回复标记为答案,因为它提供了更多可能对其他人有用的信息。但是非常感谢你的帮助。真的很感激