我正在使用MS SQL Server 2005.与SQL引擎之间有区别
SELECT * FROM MyTable;
和
SELECT ColA, ColB, ColC FROM MyTable;
当ColA,ColB和ColC代表表格中的每一列时?
如果它们是相同的,那么为什么你应该使用第二个呢?我有一个对LINQ很重的项目,我不确定它生成的标准SELECT*是不是很糟糕,或者我应该总是使用.Select()来指定我想要的cols.
编辑:更改"当ColA,ColB和ColC是表格的所有列?" "当ColA,ColB和ColC代表表格中的每一列?" 为清楚起见.
一般来说,最好是明确的,所以Select col1, col2 from Table
更好.原因是在某些时候,可能会向该表添加一个额外的列,并导致从查询中返回不需要的数据.
尽管如此,这不是一个硬性规定.
1)第二个更明确地返回哪些列.然后,第二个的值是您明确知道哪些列返回的值.
2)当列数多于明确使用的列数时,这可能会返回更少的数据.
3)如果通过添加新列更改表,则第一个查询将更改,而第二个查询不会更改.如果您的代码类似于"for all columns of do do ...",那么如果您使用的是第一个而不是第二个,则结果会发生变化.
我会让很多人对我感到不满,但特别是如果我稍后再添加列,我通常喜欢使用SELECT*FROM表.因为这个原因,我被称为懒惰,因为如果我对表进行任何修改,我不想追踪使用该表的所有存储过程,只需在我的应用程序中的数据访问层类中进行更改.在某些情况下我会指定列,但在我试图从数据库中获取完整"对象"的情况下,我宁愿只使用"*".而且,是的,我知道人们会因此而讨厌我,但它让我在为我的应用程序添加字段时更快,更少无bug.
问题的两个方面是:显式列规范在添加新列时提供更好的性能,但*规范不需要维护,因为添加了新列.
使用哪个取决于您希望添加到表中的列类型,以及查询的重点.
如果您使用表作为对象的后备存储(似乎可能在LINQ-to-SQL情况下),您可能希望添加到此表中的任何新列都包含在您的对象中,反之亦然.你正在并行维护它们.因此,对于这种情况,SELECT子句中的*规范是正确的.显式规范会在每次更改时为您提供额外的维护,如果您没有正确更新字段列表,则会出现错误.
如果查询将返回大量记录,那么出于性能原因,最好使用明确的规范.
如果两者都是真的,请考虑使用两个不同的查询.
您应该指定显式列列表.SELECT*将带回更多列,而不是创建更多IO和网络流量,但更重要的是,即使存在非群集覆盖索引(在SQL Server上),也可能需要额外的查找.
不使用第一个语句(select*)的一些原因是:
如果您稍后向该表添加一些大字段(BLOB列将非常糟糕),则可能会在应用程序中遇到性能问题
如果查询是包含两个或更多表的JOIN查询,则某些字段可能具有相同的名称.最好确保您的字段名称不同.
从编程美学的角度来看,查询的目的更清晰