Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 2.选择a、b、c与选择*_Sql_Database - Fatal编程技术网

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;