-2

可能重复:
选择 * 与选择列

我刚刚和我的一位同事讨论了在存储过程中指定查询命令的 SQL Server 性能。

所以我想知道哪一个比另一个更受欢迎,这背后的具体原因是什么。

假设,我们确实有一张名为 Employees (EmpName,EmpAddress) 的表

我们想从表中选择所有记录。所以我们可以用两种方式编写查询,

  1. 从员工中选择 *

  2. 从员工中选择 EmpName、EmpAddress

所以我想知道上述查询中是否存在任何特定差异或性能问题,或者它们是否与 SQL Server 引擎相同。

更新:

  1. 可以说表模式不会再改变了。所以以后的维护没有意义。
  2. 性能方面,可以说,使用率非常高,即数据库服务器上每秒数百万次点击。我希望对这两种方法都有一个清晰准确的性能评级。
  3. 没有对整个表进行索引。
4

4 回答 4

8

如果您在表格中添加一列,具体的区别将显示其丑陋的头部。

突然,您希望返回两列的查询现在返回三列。如果您专门为这两列编码,那么您的其余代码现在已损坏。

在性能方面,应该没有区别。

在处理数据库时,我总是采用尽可能具体的方法。如果表格有两列,而您只需要这两列,请具体说明。指定这两列。它将为您节省未来的头痛。

于 2013-01-21T18:00:25.420 回答
7

您应该始终明确引用列。这样,如果表结构发生更改(并且此类更改是以智能、向后兼容的方式进行的),您的查询将继续工作并且可以随着时间的推移进行修改。

此外,除非您实际上需要表中的所有列(不是典型的),否则使用 SELECT * 会为您的应用程序带来不必要的数据,并且可能会强制进行聚集索引扫描,而不是可能通过更窄的覆盖来满足指数。

于 2013-01-21T18:02:02.613 回答
7

我也是“尽可能具体”规则的狂热拥护者。从长远来看,不遵循它会伤害你。但是,您的问题似乎来自不同的背景,所以让我尝试回答一下。


当您向 SQL Server 提交查询时,它会经历几个阶段:

  1. 通过网络传输查询字符串。
  2. 解析查询字符串,生成解析树
  3. 将解析树中的引用对象链接到现有对象
  4. 基于统计数据和行数/大小估计进行优化
  5. 执行
  6. 通过网络传输结果数据

让我们来看看每一个:

  1. * 查询短了几个字节,所以这一步会更快
  2. * 查询包含更少的“令牌”,所以这应该(!)更快
  3. 在链接期间,需要提取列列表并与查询字符串进行比较。这里“*”被解析为实际的列引用。如果不访问代码,就不可能说哪个版本需要更少的周期,但是访问的数据量大致相同,因此应该是相似的。
  4. -6。在这些阶段,两个示例查询之间没有区别,因为它们都将编译为相同的执行计划。

考虑到所有这些,您可能会在使用该*符号时节省几纳秒。但是,您的示例非常简单。在更复杂的示例中,在多表连接中指定为表的列的子集可能会导致与使用*. 如果发生这种情况,我们可以确定显式查询会更快。

上述比较还假设 SQL Server 进程单独运行在单个处理器上,并且没有同时提交其他查询。如果该过程必须在编译期间产生,那么这些额外的周期将远远超过我们试图保存的周期。

因此,与实际执行时间相比,我们所说的节省量是非常微小的,不应作为“糟糕”编码实践的借口。

我希望这回答了你的问题。

于 2013-01-21T19:01:44.970 回答
1

性能方面,我认为这两个之间没有区别。但是这两个在不同的情况下使用,可能有什么区别。
考虑一个稍微大一点的表。如果您的表(Employees)包含 10 列,那么第一次查询将保留该表的所有信息。但是对于第二次查询,您可以指定您需要哪些列信息。所以当您需要所有1号员工的信息是最好的,而不是指定所有的列名。
当然,当您需要 ALTER 表时,这两个表将不相等。

于 2013-01-21T18:10:13.563 回答