select *会影响存储过程的性能吗?

时间:2013-07-07 13:37:26

标签: sql stored-procedures

我知道这可能是一个微不足道的问题,但我一直听到我老师的一个声音说

  

不要在存储过程中使用SELECT *,这会影响性能,并且如果模式发生更改导致未知的纹波,它会返回可能制动其客户端的数据

我找不到任何确认这个概念的文章,我认为如果这是真的那么应该引人注意。

2 个答案:

答案 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引擎的形式,但也可能适用于其他引擎。