【问题标题】:"SELECT * FROM..." VS "SELECT ID FROM..." Performance [duplicate]“SELECT * FROM ...” VS “SELECT ID FROM ...” 性能 [重复]
【发布时间】:2014-02-14 23:22:59
【问题描述】:

作为一个对许多 SQL 事物比较陌生的人,因为我不经常使用它,我确信这个问题有一个答案,但我不知道要搜索什么才能找到它,所以我很抱歉。

问题:如果我在数据库中有一堆行,有很多列,但只需要取回更快的 ID 还是相同的速度?

SELECT * FROM...

SELECT ID FROM...

【问题讨论】:

  • 毫无疑问SELECT field FROM... 更快更干净。
  • 当您使用任何聚合函数(如 MaxMin 等)时,您需要在该列上进行分组。
  • 将第二个问题拆分为自己的帖子。你会得到更好的回应。
  • Wow tnx 获得了所有出色的答案。我的下一个重点是返回并更新所有已完成的 SQL Select 语句。
  • @zezba9000 如果对您有帮助,请标记某人的答案,以便将来对某人有用

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


【解决方案1】:

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

对于第二部分,您可能应该发布一个单独的问题,而不是捎带这个问题。让您可以轻松区分您所询问的内容。

【讨论】:

  • 好吧,知道了。并将在第二部分进行。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

      您特别询问了性能与避免SELECT * 的所有其他原因:所以我将限制我的回答。

      在我的系统上,SQL Profiler 最初表明仅 ID 查询的 CPU 开销较小,但由于涉及的 # 或行数较小,每个查询花费的时间相同。

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

      这是 SQL Profiler 中事物的视图:

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

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

      【讨论】:

      • 将此标记为答案,因为它清楚地证明了 CPU 性能提升。
      猜你喜欢
      • 2014-01-27
      • 2014-06-17
      • 1970-01-01
      • 1970-01-01
      • 2014-12-12
      • 1970-01-01
      • 2011-04-06
      • 2017-09-27
      • 2014-01-20
      相关资源
      最近更新 更多