2008-09-24 67 views

回答

35

从不,一直使用“选择*”!

这是查询设计的基本规则!

有多种原因。其中之一是,如果你的表只有三个字段,并且你在调用查询的代码中使用了所有三个字段,那么随着应用程序的增长,你很可能会在表中添加更多的字段,如果您的select *查询只是为了返回调用代码的这3个字段,那么您将从数据库中获取比您需要更多的数据。

另一个原因是性能。在查询设计中,不要像这个咒语那样考虑可重用性:

带着所有你可以吃,但吃掉你所有的东西。

+1

您应该尝试使用“select *”的唯一时间是在exists()中,但不要!改为使用“选择1”。 – 2008-09-25 01:11:53

0

如果你真的选择所有列,不应做出任何明显的区别你是否要求*或者如果你是明确的。 SQL服务器将以几乎相同的时间以相同的方式解析请求。

11

最好的做法是按名称选择每一列。将来,您的数据库模式可能会更改,以添加您不需要特定查询的列。我会建议按名称选择每一列。

0

总是从视图中选择col1,col2等。我知道的两种方法之间没有效率差别,但使用“select *”可能很危险。如果修改视图定义添加新列,则可以使用“select *”分解程序,而选择一组预定义的列(即使所有列都已命名)仍然可以工作。

0

我想这一切都取决于查询优化器的功能。

如果我想获得行中的每条记录,我通常会使用“SELECT * ...”选项,因为我不必担心是否应该更改基础表结构。同样,对于维护代码的人来说,看到“SELECT *”告诉他们这个查询是为了返回每一列,而单独列出这些列并不表达同样的意图。

2

Select *是一种不好的编程习惯。它可能会导致事情中断,因为它可以避免中断事件。如果您只查询一个表或视图,那么效率增益可能不在那里(尽管如果您不打算实际使用每个字段,则可能会有这种效果)。如果您有一个内部联接,那么至少有两个字段返回相同的数据(联接字段),因此您正在浪费网络资源将冗余数据发送回应用程序。您一开始不会注意到这一点,但随着结果集越来越大,您很快就会拥有一个完整且不需要的网络管道。我可以想到没有任何情况下,select *会带给你什么。如果添加了新列,并且不需要转到代码中对其执行任何操作,那么按照定义,列不应该由您的查询返回。如果有人以不同的顺序删除并重新创建表格,那么所有的查询都会显示错误的信息,或者会导致错误的结果,例如将价格放入新记录中的零件编号字段中。

再加上从对象浏览器拖动列名很快,所以这只是懒惰而不是编码效率。

0

对于性能 - 查看查询计划(应该没有区别)。

可维护性。 - 始终提供一个字段列表(也适用于INSERT INTO)。

3

只是为了澄清一些人已经提出的观点,Select *效率低下的原因是因为必须先向数据库发出一个初始呼叫,以确定哪些字段可用,然后进行第二次呼叫,查询是使用显式列进行的。

随意使用当您正在调试,运行临时查询或处于开发查询的早期阶段时,请选择*,但只要您知道所需的列,请明确说明它们。

0

这取决于。视图继承可以是一个方便的事情,易于维护(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; 
0
select 
column1 
,column2 
,column3 
. 
. 
. 
from Your-View 

这一个比使用HTTP的

select * 
from Your View