从表格中选择*从表格中选择col1,col2,col3

时间:2013-01-21 17:58:23

标签: sql sql-server performance select benchmarking

  

可能重复:
  select * vs select column

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

所以我想知道哪一个比另一个更受欢迎,并说明背后的具体原因。

假设,我们确实有一个名为的表  员工(EmpName,EmpAddress)

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

  1. 从员工中选择*

  2. 从员工中选择EmpName,EmpAddress

  3. 所以我想知道上述查询中是否存在任何特定的差异或性能问题,或者它们只是等于SQL Server引擎。

    更新:

    1. 让我们说表架构不会再改变了。所以未来的维护没有意义。
    2. 性能方面,假设,使用率非常高,即数据库服务器上每秒数百万次点击。我希望两种方法都有明确而精确的性能评级。
    3. 没有对整个表格进行索引。

4 个答案:

答案 0 :(得分:8)

如果向表中添加一列,具体差异将显示其丑陋的头部。

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

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

我总是采用在处理数据库时尽可能具体的方法。如果表有两列,并且您只需要这两列,则具体。指定这两列。它将来会让你头疼不已。

答案 1 :(得分:7)

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

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

答案 2 :(得分:7)

我是一个狂热的人,尽可能具体。"规则也是。从长远来看,不遵循它会伤害到你。但是,你的问题似乎来自不同的背景,所以让我试着回答它。


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

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

    1. *查询缩短了几个字节,因此步骤更快
    2. *查询包含更少的"令牌"所以这应该(!)更快
    3. 在链接期间,需要将列表列入并与查询字符串进行比较。这里" *"得到解决的实际列引用。如果不访问代码,就不可能说哪个版本的周期更少,但访问的数据量大致相同,所以这应该是相似的。
    4. -6。在这些阶段中,两个示例查询之间没有区别,因为它们都会被编译到同一个执行计划中。
    5. 考虑到所有这些因素,使用*表示法时可能会节省几纳秒。但是,你的例子非常简单。在一个更复杂的示例中,在多表连接中指定为表的列子集可能会导致与使用*不同的计划。如果发生这种情况,我们可以非常肯定显式查询会更快。

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

      因此,与实际执行时间相比,我们所谈论的保存非常微小,不应该被用作“坏”的借口。编码实践。

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

答案 3 :(得分:1)

性能方面,我认为这两者之间没有区别。但是这两种情况在不同的情况下使用可能有什么不同。
考虑一个略大的表。如果你的表(Employees)包含10列,那么第一个查询将保留表的所有信息。但是对于第二个查询,你可以指定你需要哪些列信息。所以当你需要所有的时候1号员工的信息是最好的,而不是指定所有列名 当然,当你需要改变一个表时,那些2就不一样了。