“SELECT * FROM ...”VS“SELECT ID FROM ...”性能

时间:2014-01-24 04:48:33

标签: asp.net sql .net sql-server database

作为一个对SQL很多的人来说,因为我没有太多使用它,我确信这个问题有一个答案,但我不知道要搜索什么来找到它,所以我道歉。

问题:如果我在一个包含许多列的数据库中有一堆行,但只需要获取更快或者速度相同的ID?

SELECT * FROM...

VS

SELECT ID FROM...

4 个答案:

答案 0 :(得分:3)

你特别询问了表现与避免SELECT *的所有其他原因的关系:所以我会限制我的答案。

在我的系统上,SQL Profiler最初为仅ID查询指示较少的CPU开销,但是涉及较小的#或行,每个查询花费的时间相同。

我认为这实际上只是因为首先运行了仅限ID的查询。在重新运行时(按相反的顺序),它们的CPU开销同样很小。

以下是SQL事件探查器中的事物视图:

SQL Profiler Results - *, ID-Only, ID-Only, *

由于列数和行数极高,行数极宽,数据库引擎可能存在明显的差异,但这里没什么明显的。

您将真正看到差异是通过网络发回结果集的地方!当然,仅ID的结果集通常会小很多 - 即少发送回来。

答案 1 :(得分:2)

永远不要使用*来返回表中的所有列 - 它是懒惰的。您应该只提取所需的数据。 所谓>选择字段来得更快

答案 2 :(得分:1)

长答案简短,只选择您需要的列将始终更快。 SELECT *需要扫描整个表格。这是你应该尽早采用的最佳实践。

对于第二部分,你应该发布一个单独的问题,而不是捎带这个问题。可以轻松区分您的要求。

答案 3 :(得分:1)

您应该永远(从未)在生产代码中使用SELECT *有几个原因:

  1. 由于您未向数据库提供有关所需内容的任何提示,因此首先需要检查表的定义以确定该表上的列。该查找将耗费一些时间 - 在单个查询中不会太多 - 但随着时间的推移会增加。

  2. 在SQL Server中
  3. (不确定其他数据库),如果需要列的子集,非聚集索引总是有可能覆盖该请求(包含所需的所有列)。使用SELECT *,你就可以从一开始就放弃这种可能性。在这种特殊情况下,数据将从索引页面中检索(如果它们包含所有必需的列),因此与执行SELECT * ....查询相比,磁盘I / O和内存开销会少得多。