我正在按照“ 10分钟内使用SQL”学习
使用通配符检索所有记录的参考,它指出:
通常,最好不要使用*通配符,除非您确实确实需要表中的每一列。即使使用通配符可以节省您显式列出所需列所需的时间和精力,但检索不必要的列通常会降低检索和应用程序的性能。
但是,检索所有记录比检索多个字段要花费更少的时间:
结果表明,通配符表示V.S.为0.02秒。 0.1秒
我测试了几次,通配符比指定的多个列始终更快,即使每次使用的时间各不相同。
答案 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;