检索所有列和多个列的性能

时间:2018-08-11 11:41:24

标签: sql

我正在按照“ 10分钟内使用SQL”学习

使用通配符检索所有记录的参考,它指出:

  

通常,最好不要使用*通配符,除非您确实确实需要表中的每一列。即使使用通配符可以节省您显式列出所需列所需的时间和精力,但检索不必要的列通常会降低检索和应用程序的性能。

但是,检索所有记录比检索多个字段要花费更少的时间:

enter image description here

结果表明,通配符表示V.S.为0.02秒。 0.1秒

我测试了几次,通配符比指定的多个列始终更快,即使每次使用的时间各不相同。

2 个答案:

答案 0 :(得分:5)

在尝试验证您从书中获得的建议时,向您表示敬意!单个测试既不会使建议无效,也不会使测试无效。值得进一步潜水。

SQL In 10 Minutes中提供的建议是合理的建议,它明确指出目的与绩效有关。 (另一个考虑因素是,当数据库更改时,它会使代码不稳定。)注意:我经常对临时查询使用select t.*

为什么结果不同?可能有多种原因:

  • 数据库没有确定性的性能,因此其他考虑因素(例如计算机上运行的其他进程或资源争用)可能会影响性能。
  • 如评论中所述,缓存可能是原因。具体来说,运行第一个查询可能需要从磁盘加载数据,并且第一个查询已经在内存中。
  • 另一种形式的缓存用于执行计划,因此也许第一个执行计划被缓存,而第二个则没有。
  • 您没有提到数据库,但也许您的数据库的编译器速度非常慢,并且编译第一个要比第二个花费更长的时间。

从常识的角度来看,建议是合理的。移动较少的数据应该更有效。忠实于此。

无论如何,10毫秒和2毫秒之间的差值非常短。我不会将这种性能推广到更大的数据,而是说第二个通常比第一个快5倍。无论出于何种原因,在一个非常小的数据集上,它要短8毫秒,这太小了,以至于无论如何都不会考虑性能。

答案 1 :(得分:3)

要手动测试一个或多个表中的数据?

然后使用*还是使用列名都没关系。

当然,如果表有100列,而您只对其中几列感兴趣?然后显式添加列名将给您带来更少的困扰。
另外,您可以选择它们在结果中出现的顺序。

在子查询中使用*会将所有字段拖到结果集中。
如果仅选择列,则可以提高性能。
对于手动测试,通常没什么关系。
无论测试SQL运行1秒钟还是2秒钟,如果它是测试或临时查询,它都不会打扰您。

该建议的主要目的是关于在生产环境中使用的SQL编码。

在SQL中使用*时,这意味着当查询中使用的表中发生某些更改时,这可能会影响该查询的输出。
可能导致错误。你的老板会对此皱眉!

例如,一年前编写的带有select * from tableA union select * from tableB的SQL突然崩溃,因为在tableB中添加了列。哎呀。

但是通过显式地放置列名,将列添加到表的1个中不会对该SQL产生任何影响。

换句话说。
在生产中,稳定性和性能比高尔夫编码重要得多。

要记住的另一件事是caching的效果。
一些数据库可以临时将元数据甚至数据存储在内存中。
这样可以加快查询的检索速度,该查询获得的查询结果与其之前运行的查询的结果相同。

因此,请尝试运行以下SQL。
顺序与问题顺序不同。
并检查是否仍然存在速度差异。

select * from products;
select prod_id, prod_name, prod_price from products;