我们正在使用SQL Server 2005,但这个问题适用于任何RDBMS。
从视图中选择所有列时,以下哪项更有效?
Select * from view
或
Select col1, col2, ..., colN from view
答案 0 :(得分:37)
永远不要使用“SELECT *”!!!!
这是查询设计的基本规则!
这有多种原因。其中之一是,如果您的表上只有三个字段并且您在调用查询的代码中使用了所有三个字段,那么随着应用程序的增长,您很可能会在该表中添加更多字段,如果你的select *查询只是为了返回调用代码的那3个字段,然后你从数据库中提取的数据远远超过你需要的数据。
另一个原因是表现。在查询设计中,不要像这个口头禅那样考虑可重用性:
吃所有你可以吃,但吃掉所有你吃的。
答案 1 :(得分:11)
最佳做法是按名称选择每列。将来,您的数据库架构可能会更改,以添加您不需要特定查询的列。我建议按名称选择每一列。
答案 2 :(得分:3)
选择*是一种糟糕的编程习惯。它可能会导致事情破裂,因为它可以避免破坏事物。如果您只查询一个表或视图,那么效率增益可能不存在(尽管如果您不打算实际使用每个字段,这是可能的)。如果您有内部联接,那么您至少有两个字段返回相同的数据(连接字段),因此您浪费网络资源将冗余数据发送回应用程序。您最初不会注意到这一点,但随着结果集变得越来越大,您很快就会拥有一个已满且不需要的网络管道。我可以想到没有选择*获得任何东西的实例。如果添加了一个新列,并且您不需要使用该代码对其执行某些操作,则根据定义,查询不应返回该列。如果有人丢弃并以不同的顺序重新创建包含列的表,那么您的所有查询都将显示错误的信息或将产生错误结果,例如将价格放入新记录中的部件号字段。
另外,它可以快速地从对象浏览器中拖动列名,这样只是纯粹的懒惰而不是编码效率。
答案 3 :(得分:3)
只是为了澄清几个人已经提出的观点,Select *效率低下的原因是因为必须先对数据库进行初始调用,以确切了解哪些字段可用,然后再进行第二次调用查询是使用显式列。
在调试,运行临时查询或处于开发查询的早期阶段时,请随意使用Select *,但只要您知道所需的列,请明确说明。
答案 4 :(得分:1)
这取决于。视图的继承可以是一个方便的东西,易于维护(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;
答案 5 :(得分:0)
如果您真的选择了所有列,那么无论您要求*还是明确,都不应该有任何显着差异。 SQL服务器将在几乎相同的时间内以相同的方式解析请求。
答案 6 :(得分:0)
始终从视图中选择col1,col2等。我所知道的两种方法之间没有效率差异,但使用“select *”可能很危险。如果您修改视图定义添加新列,则可以使用“select *”来中断程序,而选择一组预定义的列(甚至所有列,也可以命名)仍然有效。
答案 7 :(得分:0)
我猜这一切都取决于查询优化器的功能。
如果我想获取行中的每条记录,我通常会使用“SELECT * ...”选项,因为我不必担心我是否应该更改基础表结构。同样,对于维护代码的人来说,看到“SELECT *”告诉他们这个查询是为了返回每一列,而单独列出这些列并没有表达相同的意图。
答案 8 :(得分:0)
对于性能 - 查看查询计划(应该没有区别)。
可维护性。 - 始终提供一个字段列表(也适用于INSERT INTO)。
答案 9 :(得分:0)
select
column1
,column2
,column3
.
.
.
from Your-View
这个比使用
更优化select *
from Your View