Sql 2.选择a、b、c与选择*
在您编写并投入生产的代码中,Sql 2.选择a、b、c与选择*,sql,database,Sql,Database,在您编写并投入生产的代码中,SELECT*的有效用法很少。想象一个包含Bluray电影的表(是的,电影作为blob存储在此表中)。因此,您将抽象层拼凑在一起,并将SELECT*FROM movies where id=?放在getMovies(movie\u id)方法中。我不想解释为什么从电影中选择名称通过网络传输的速度会快一点。当然,在大多数现实情况下,它不会产生明显的影响 关于性能的最后一点是,当查询中的所有引用列(选中、筛选)都作为索引(称为覆盖索引)存在时,数据库根本不需要接触表。仅通
SELECT*
的有效用法很少。想象一个包含Bluray电影的表(是的,电影作为blob存储在此表中)。因此,您将抽象层拼凑在一起,并将SELECT*FROM movies where id=?
放在getMovies(movie\u id)
方法中。我不想解释为什么从电影中选择名称
通过网络传输的速度会快一点。当然,在大多数现实情况下,它不会产生明显的影响
关于性能的最后一点是,当查询中的所有引用列(选中、筛选)都作为索引(称为覆盖索引)存在时,数据库根本不需要接触表。仅通过扫描索引即可完全解决此问题。通过选择所有列,可以从优化器中删除此选项
关于SELECT*
的另一件事比任何事情都严重得多,那就是它创建了对表的特定物理布局的隐式依赖。让我解释一下。考虑下面的表格:
table T1(name, id)
table T2(name, id)
以下声明
insert into t1 select * from t2;
。。。如果发生以下任何情况,将中断或产生不同的结果:
- 任何表格列都会重新排列,例如T1(id、名称)
- T1获取一个额外的NOTNULL列
- T2得到另一列
2。TL;博士如果可能,显式指定所需的列(最终,您还是必须这样做)。此外,选择更少的列比选择更多的列更快。显式选择的一个积极的副作用是它给优化器带来了更大的自由。一些数据库引擎将使用索引优化
计数(*)
,因为列中的实际值被忽略。我永远不会使用的一件事是存储过程中的选择*
。很多时候,我不得不找出我的代码被破坏的原因,这是因为数据库现在返回一个新列。@Gabe:几乎正确:…通过使用PK,因为…它起到了作用!小贴士:如果你强调几乎每一个单词,它就失去了意义。如果StackOverflow有一个“19世纪俄罗斯小说家”徽章,你就赢得了它:)。@tom。我不明白这是赞美还是侮辱,但徽章就是徽章;)哇,这就是为什么选择是个坏主意!感谢您提供的信息。在我看来,插入t1 select*from t2
实际上是select*
的一个很好的用途,如果由于其他原因,这两个表需要相同的格式。您的“中断条件”应该是“T1得到一个非空列,T2没有”和“T2得到另一个列,T1没有”。它将正确处理将同一列添加到两个表中的情况,而显式列出要使用的列的代码将中断。
table(
pk not null
,color not null
,nullable null
,unique(pk)
,index(color)
);
1) select count(*) from table;
2) select count(1) from table;
3) select count(pk) from table;
4) select count(color) from table;
table T1(name, id)
table T2(name, id)
insert into t1 select * from t2;