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