使用`select table_name。*`有什么优缺点?

时间:2012-02-01 17:33:19

标签: sql

我听说这是一般编写查询的错误方法,但我想知道人们对SQL的新用户说些什么。

这是非常糟糕的形式还是只是懒惰?

所以,不要对此征求太多意见,除了不必输入每个字段名称之外,在查询中使用它有什么好的理由。另外,这些原因是否超过了它的使用危害?

4 个答案:

答案 0 :(得分:11)

当您的程序在编译时或通过配置了解表的结构时,使用select *并不是一个好主意:表结构的任何更改都可能会破坏返回结果的结构从查询中,最终导致运行时错误。

但是,有些情况*是必不可少的。具体来说,如果您的程序通过读取从查询返回的元数据动态“学习”表结构,则使用“所有列”请求可让您的程序动态地获取对表的更改。

毫无疑问,在您最喜欢的SQL Studio / SQLPlus / etc中使用*进行即席查询。是非常普遍和方便的。

答案 1 :(得分:3)

使用通配符*时,系统必须处理该表的所有列名称,并将其返回。

因此,使用*对于性能的影响要比实际手动输入它们更糟糕。

一般规则是,如果您不必使用它,请避免使用它,而是指定您实际需要的列。

答案 2 :(得分:1)

使用select *依赖于要保留的列的顺序。从关系的角度来看,列的顺序是无关紧要的。对它们进行操作时,以下两个表是相同的:

create table alpha (int id, int value);
create table beta (int value, int id);

它们之间唯一不同的是列的顺序。专栏名称&类型是相同的。在所有情况下,列的顺序应作为内部实现细节处理,因此永远不应编程为。

偶尔会有一些情况,您只想选择所有列,而不考虑订单。 (例如,数据分析程序可能会执行某些类型的查询来确定表的结构 - 但同样,结构是列的名称/数据类型,而不是它们的顺序。

不要使用它。

答案 3 :(得分:1)

本书SQL Antipatterns在“隐式列”一章中深入探讨了这一主题。

查询中字段名最常用的通配符是编写即席查询时。键入'*'比键入要返回的每个字段名称更快。程序员时间相当昂贵,因此在运行即席查询时不要担心性能略有提高是有道理的,在这种情况下,您将浪费更多时间输入名称。

但是,您仍然应该对数据库模式有一些了解,因为等待大量行上的blob列中的值也会浪费大量时间,尤其是如果您想要的只是主键值。

使用SELECT *,您可能会在特定查询上获得良好的性能,因为它返回的结果集可能只有几百个字节,但是,为了其他一些函数,可以在表中添加几个blob字段,也许现在结果集是数百万字节,突然你的查询很慢,即使你实际使用的数据非常小。要避免此问题,请在查询中命名列。

如果您正在使用SELECT *,那么在添加新列时会自动获得新列的值,您仍将成为上述方案的受害者。这是一种权衡,你必须选择。

只要您有理由,使用SELECT *是有效的,但懒惰不是有效理由。