给出你的说明你是选择所有列,差别不大。此时..但是,要意识到数据库模式确实会发生变化。如果你用SELECT *
您将获得添加到表中的任何新列,即使您的代码可能不准备使用或表示这些新数据。这意味着您将系统暴露在意外的性能和功能更改中。
您可能愿意将此视为一项小成本,但要意识到,您不需要的列仍然必须是:
- 从数据库读取
- 通过网络发送
- 编组到您的进程中
- (用于ado类型技术)保存在内存中的数据表中。
- 被忽视和丢弃/垃圾收集
第1项有许多隐藏成本,包括消除一些潜在的覆盖索引,导致数据页负载(和服务器缓存崩溃),产生行/页/表锁,否则可能会避免。
这与指定列相对于*
唯一可能的节省是:
- 程序员不需要重新访问SQL来添加列
- SQL的网络传输更小/更快。
- SQLServer查询解析/验证时间
- SQLServer查询计划缓存
对于第1项,实际情况是,您将添加/更改代码,以使用您可能添加的任何新列,因此这是一次清洗。
对于第2项,这种差异很少足以将您推入不同的数据包大小或网络数据包数量。如果您到了SQL语句传输时间是主要问题的地步,那么您可能首先需要降低语句的速率。
对于第3项,由于*
无论如何都必须发生,这意味着无论如何都要查阅表模式。实际上,列出列将导致相同的成本,因为它们必须根据模式进行验证。换句话说,这是一次彻底的清洗。
对于第4项,当指定特定列时,查询计划缓存可能会变大,但是只如果您正在处理不同的列集(这不是您指定的)。在这种情况下,你不想不同的缓存条目,因为您需要不同的计划。
因此,由于您指定问题的方式,这一切都归结到了最终模式修改的问题弹性上。如果将此模式刻录到ROM中(发生这种情况),则*
是完全可以接受的。
但是,我的一般指导原则是,您应该只选择所需的列,这意味着有时看起来您需要所有这些内容,但是DBA和模式演进意味着可能会出现一些新列,这些列可能会对查询产生很大影响。
我的建议是你应该始终选择特定列..记住,你一遍又一遍地做你所做的事情,所以要养成正确做好它的习惯。
如果您想知道为什么模式可能更改而不更改代码,请考虑审计日志记录、有效/过期日期以及DBA为系统地为遵从性问题添加的其他类似内容。另一个暗地更改的来源是系统或用户定义字段中其他地方的性能去或错误。