我知道这可能是一个微不足道的问题,但我一直听到我的一位老师的声音说
不要在存储过程中使用 SELECT *,这会影响性能,并且如果架构更改导致未知波纹,它返回的数据可能会阻碍其客户端
我找不到任何文章证实这个概念,我认为如果属实的话应该很明显。
我知道这可能是一个微不足道的问题,但我一直听到我的一位老师的声音说
不要在存储过程中使用 SELECT *,这会影响性能,并且如果架构更改导致未知波纹,它返回的数据可能会阻碍其客户端
我找不到任何文章证实这个概念,我认为如果属实的话应该很明显。
在大多数现代专业 SQL 实现(Oracle、SQL Server、DB2 等)中,使用仅在顶级 SELECT中SELECT *
具有负面影响。在所有其他情况下,SQL 编译器无论如何都应该执行列优化,消除任何未使用的列。
而*
在顶层的负面影响几乎完全与在您可能不需要SELECT
所有列时返回所有列有关。
恕我直言,在所有其他情况下(**),包括大多数临时情况,使用*
都非常好,没有任何决定性影响(以及明显的有益便利)。在大多数 SQL 编译器没有有效的列消除优化技术*
时(10 到 15 年前),广泛使用的反对使用的普遍声明在很大程度上是一个古老的保留。
(** - VIEW
SQL Server 的定义中有一个例外,因为它不会自动注意到绑定的列列表是否更改。)
您有时会看到不使用的另一个原因SELECT *
不是因为任何性能问题,而是因为编码实践问题。也就是说,通常最好将 SQL 代码编写为明确说明您(或您的客户端代码)期望并因此依赖的列。如果您使用*
,那么它是隐式的,阅读您的 SQL 代码的人无法轻易判断您的应用程序是否真正依赖于某个列。(恕我直言,这是更合理的理由。)
当我们使用 SELECT * 指令时,我在一篇论文中找到了这句话:
“[…] 真正的伤害发生在需要排序时。每个 SELECTed 列,以及重复的排序列,使排序工作文件的宽度变宽。文件越宽越长,排序就越慢。” 在http://www.quest.com/whitepapers/10_SQL_Tips.pdf
本文是 DB2 引擎,但也可能适用于其他引擎。