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