SQL查询-从视图中选择*或者从视图中选择col1,col2,... colN
我们正在使用SQL Server 2005,但是这个问题可能适用于任何RDBMS。
从视图中选择所有列时,以下哪一项更有效?
Select * from view
或者
Select col1, col2, ..., colN from view
解决方案
如果我们确实选择了所有列,那么无论我们要*还是明确要求都不会有任何明显的不同。 SQL Server将在几乎相同的时间内以相同的方式解析请求。
最佳做法是按名称选择每一列。将来,数据库模式可能会更改为添加一些特定查询不需要的列。我建议按名称选择每一列。
始终从视图中选择col1,col2等。我知道这两种方法之间没有效率差异,但是使用" select *"可能很危险。如果修改视图定义以添加新列,则可以使用" select *"中断程序,而选择一组预定义的列(甚至所有已命名的列)仍然可以使用。
我想这全都取决于查询优化器的功能。
如果要获取该行中的每条记录,通常将使用" SELECT * ..."选项,因为这样我不必担心是否应该更改基础表结构。同样,对于维护代码的人,看到" SELECT *"告诉他们该查询旨在返回每一列,而单独列出这些列并不能传达相同的意图。
永远不要使用"选择*" !!!!
这是查询设计的基本规则!
这有多种原因。其中之一是,如果表上只有三个字段,并且我们使用了调用查询的代码中的所有三个字段,则很有可能会随着应用程序的增长向该表添加更多字段,select *查询仅旨在返回调用代码的这3个字段,那么我们从数据库中提取的数据量远远超出了需要。
另一个原因是性能。在查询设计中,不要像此口头禅那样考虑可重用性:
尽我们所能,但尽我们所能。
选择*是较差的编程习惯。导致事物破坏的可能性与拯救事物免受破坏的可能性一样。如果仅查询一个表或者视图,则效率提升可能不存在(尽管如果我们不打算实际使用每个字段,则可能会提高效率)。如果我们具有内部联接,则至少有两个返回相同数据的字段(联接字段),因此,我们浪费了网络资源,无法将冗余数据发送回应用程序。起初我们不会注意到这一点,但是随着结果集变得越来越大,我们很快就会拥有一个已满且不需要的网络管道。我想不出select *能给我们带来什么好处的任何情况。如果添加了新列,而我们无需转到代码中进行任何处理,则查询不应该按定义返回该列。如果有人删除并重新创建带有不同顺序的列的表,则所有查询将显示错误信息或者给出不好的结果,例如将价格放入新记录的零件号字段中。
此外,还可以快速将列名从对象浏览器中拖出,因此这仅仅是纯粹的惰性而不是编码效率。
为了提高性能,请查看查询计划(应该没有区别)。
为了可维护性。始终提供一个字段列表(也适用于INSERT INTO)。
只是为了澄清几个人已经提出的观点,Select *效率低下的原因是因为必须先对DB进行一次调用,以准确找出可用的字段,然后再调用一次,使用显式列。
在调试,运行临时查询或者处于开发查询的早期阶段时,可以随时使用Select *,但是一旦知道了所需的列,就应明确声明它们。
这取决于。视图的继承可以很方便并且易于维护(SQL Anywhere):
create view v_fruit as select F.id, S.strain from F key join S; create view v_apples as select v_fruit.*, C.colour from v_fruit key join C;