为了账号安全,请及时绑定邮箱和手机立即绑定

哪个更快/最好?选择*或选择列1、列2、列3等

哪个更快/最好?选择*或选择列1、列2、列3等

智慧大石 2019-06-13 17:37:26
哪个更快/最好?选择*或选择列1、列2、列3等我听说过SELECT *在编写sql命令时使用通常是不好的做法,因为SELECT你特别需要的列。如果我需要SELECT表中的每一列,我是否应该使用SELECT * FROM TABLE或SELECT column1, colum2, column3, etc. FROM TABLE在这种情况下,效率真的很重要吗?我觉得SELECT *如果您真的需要所有的数据,那么在内部就会更理想,但我是说这一点并没有真正了解数据库。我很想知道这种情况下的最佳做法是什么。最新情况:我也许应该明确指出,我唯一能做到的就是想要做SELECT *当我从一个表中选择数据时,我知道所有的列都需要被检索,即使添加了新的列。然而,考虑到我所看到的回应,这似乎仍然是个坏主意,SELECT *不应该因为我想过的更多的技术原因而使用。
查看完整描述

3 回答

?
精慕HU

TA贡献1845条经验 获得超8个赞

选择特定列的一个更好的原因是,它提高了SQLServer可以从索引访问数据的可能性,而不是查询表数据。

这是我写的一篇文章:选择查询的真正原因是索引覆盖率不好。

更改也不那么脆弱,因为任何使用数据的代码都将得到相同的数据结构,而不管将来对表模式做什么更改。


查看完整回答
反对 回复 2019-06-13
?
Smart猫小萌

TA贡献1911条经验 获得超7个赞

给出你的说明你选择所有列,差别不大。此时..但是,要意识到数据库模式确实会发生变化。如果你用SELECT *您将获得添加到表中的任何新列,即使您的代码可能不准备使用或表示这些新数据。这意味着您将系统暴露在意外的性能和功能更改中。

您可能愿意将此视为一项小成本,但要意识到,您不需要的列仍然必须是:

  1. 从数据库读取
  2. 通过网络发送
  3. 编组到您的进程中
  4. (用于ado类型技术)保存在内存中的数据表中。
  5. 被忽视和丢弃/垃圾收集

第1项有许多隐藏成本,包括消除一些潜在的覆盖索引,导致数据页负载(和服务器缓存崩溃),产生行/页/表锁,否则可能会避免。

这与指定列相对于*唯一可能的节省是:

  1. 程序员不需要重新访问SQL来添加列
  2. SQL的网络传输更小/更快。
  3. SQLServer查询解析/验证时间
  4. SQLServer查询计划缓存

对于第1项,实际情况是,您将添加/更改代码,以使用您可能添加的任何新列,因此这是一次清洗。

对于第2项,这种差异很少足以将您推入不同的数据包大小或网络数据包数量。如果您到了SQL语句传输时间是主要问题的地步,那么您可能首先需要降低语句的速率。

对于第3项,由于*无论如何都必须发生,这意味着无论如何都要查阅表模式。实际上,列出列将导致相同的成本,因为它们必须根据模式进行验证。换句话说,这是一次彻底的清洗。

对于第4项,当指定特定列时,查询计划缓存可能会变大,但是如果您正在处理不同的列集(这不是您指定的)。在这种情况下,你不想不同的缓存条目,因为您需要不同的计划。

因此,由于您指定问题的方式,这一切都归结到了最终模式修改的问题弹性上。如果将此模式刻录到ROM中(发生这种情况),则*是完全可以接受的。

但是,我的一般指导原则是,您应该只选择所需的列,这意味着有时看起来您需要所有这些内容,但是DBA和模式演进意味着可能会出现一些新列,这些列可能会对查询产生很大影响。

我的建议是你应该始终选择特定列..记住,你一遍又一遍地做你所做的事情,所以要养成正确做好它的习惯。

如果您想知道为什么模式可能更改而不更改代码,请考虑审计日志记录、有效/过期日期以及DBA为系统地为遵从性问题添加的其他类似内容。另一个暗地更改的来源是系统或用户定义字段中其他地方的性能去或错误。


查看完整回答
反对 回复 2019-06-13
?
慕莱坞森

TA贡献1810条经验 获得超4个赞

只应选择所需的列。即使您需要所有的列,最好还是列出列名,这样SQL服务器就不必查询系统表中的列。

此外,如果有人向表中添加列,则应用程序可能会中断。您的程序将获得它没有预料到的列,而且它可能不知道如何处理它们。

除此之外,如果表中有一个二进制列,那么查询就会慢得多,并且使用更多的网络资源。


查看完整回答
反对 回复 2019-06-13
  • 3 回答
  • 0 关注
  • 436 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信