我听说在编写SQL命令时使用SELECT *通常是不好的做法,因为选择您特别需要的列会更有效。

如果我需要选择表中的每一列,我应该使用

SELECT * FROM TABLE

or

SELECT column1, colum2, column3, etc. FROM TABLE

在这种情况下,效率真的重要吗?如果你真的需要所有的数据,我认为SELECT *在内部会更优,但我这么说并没有真正理解数据库。

我很好奇在这种情况下最好的做法是什么。

更新:我可能应该指定,我真正想要执行SELECT *的唯一情况是,当我从一个表中选择数据时,我知道总是需要检索所有列,即使添加了新列。

然而,鉴于我所看到的反应,这似乎仍然是一个坏主意,由于我曾经考虑过的许多技术原因,SELECT *不应该被使用。


当前回答

如果使用*或列,Select同样有效(就速度而言)。

区别在于内存,而不是速度。当您选择几个列时,SQL Server必须分配内存空间为您提供查询,包括您所请求的所有列的所有数据,即使您只使用其中一个列。

在性能方面真正重要的是执行计划,而执行计划又严重依赖于WHERE子句和JOIN、OUTER JOIN等的数量……

对于你的问题,只需使用SELECT *。如果你需要所有的列,那就没有性能差异了。

其他回答

嘿,实际一点。在创建原型时使用select *,在实现和部署时选择特定的列。从执行计划的角度来看,两者在现代系统中是相对相同的。但是,选择特定的列会限制必须从磁盘检索、存储在内存中并通过网络发送的数据量。

最终,最好的计划是选择特定的列。

选择特定列更好的一个原因是,它提高了SQL Server从索引访问数据的概率,而不是查询表数据。

这是我写的一篇关于它的文章:选择查询的真正原因是糟糕的索引覆盖

它也不太容易更改,因为任何消耗数据的代码都将获得相同的数据结构,而不管您将来对表模式做了什么更改。

如果使用*或列,Select同样有效(就速度而言)。

区别在于内存,而不是速度。当您选择几个列时,SQL Server必须分配内存空间为您提供查询,包括您所请求的所有列的所有数据,即使您只使用其中一个列。

在性能方面真正重要的是执行计划,而执行计划又严重依赖于WHERE子句和JOIN、OUTER JOIN等的数量……

对于你的问题,只需使用SELECT *。如果你需要所有的列,那就没有性能差异了。

如果你需要每一列,那么只需使用SELECT *,但记住,顺序可能会改变,所以当你消费的结果访问他们的名字,而不是通过索引。

我将忽略关于*需要如何获得列表的注释-解析和验证命名列的机会等于处理时间,如果不是更多的话。不要过早地优化;-)

这取决于你的指标和目的:

如果你有250列,并且想要全部选中,如果你想当天回家,请使用select *:) 如果您的编码需要灵活性,并且需要的表很小,那么选择*可以帮助您更快地编码并更容易地维护它。 如果你想要强大的工程和性能: 如果只有几个列名,就写出来,或者 编写一个工具,让您轻松地选择/生成列名

作为经验法则,当我需要选择所有列时,我会使用“select *”,除非我有非常具体的理由这样做(另外,我认为在有很多很多列的表上更快)

最后,但并非最不重要的是,您希望添加或删除表中的列如何影响您的代码或其维护?