SQL 1查询返回3列,或者3个查询返回1列,这实际上对速度有影响吗


Is there actually any speed impact in SQL 1 query returning 3 columns, or 3 queries returning 1 column?

我想知道一些事情。我已经建立了一个大量使用PHP和SQL(Oracle)的网站。

执行一个查询返回多个列,然后执行多个查询返回一列,这实际上对速度有影响吗。

示例

Customer Name:     <?= dbq("select customer_name from customers where customer_no = $session"); ?>
Customer No:       <?= dbq("select customer_no from customers where customer_no = $session"); ?>
Customer Type:     <?= dbq("select customer_type from customers where customer_no = $session"); ?>

一个SQL查询返回3列,然后使用它们:

Customer Name:     $row1
Customer No:       $row2
Customer Type:     $row3

一个查询应该更快。解析查询、搜索表和将结果返回给客户端会产生大量的每次查询开销。如果所有值都来自同一行,那么如果将它们组合到一个查询中,则只会执行一次。

是的,有

  • 这3个单独的查询肯定会在网络上进行3次,因此会导致3倍的网络流量
  • 它们也不同,因此不会使用查询缓存。您最好在所有3个查询中请求所有3列(但代码看起来会很奇怪,不是吗)
  • 它们也可能命中磁盘3次,尽管我希望相同的数据已经被缓冲。当然,缓冲器可能处于压力之下。如果查询是联接或更复杂的,则肯定会出现这种情况
  • 代码也不那么可读——它只是有更多的字符,而且不清楚是否使用了同一行数据

如果您已经收集了最新的STATISTICS,并且在适当的位置需要INDEXES,请遵循NORMALIZATION规则。那么,我的朋友,只需要一个SQL,现在就不用担心性能了。

如果您确实遇到任何性能问题,请发布execution plan,在此基础上可以提供进一步的建议。

如果你想要一个ROT,即经验法则,那么一个查询比多个查询分割来执行同一任务要好。

注意:性能调优完全是关于基数的。基数不是列数,而是行数。

更新:请记住,SQLPL/SQL之间存在巨大差异。大多数情况下,前端应用程序调用PL/SQL程序,CONTEXT SWITCHING加起来就是EXECUTION TIME