我想知道一些事情。我已经建立了一个大量使用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
,即经验法则,那么一个查询比多个查询分割来执行同一任务要好。
注意:性能调优完全是关于基数的。基数不是列数,而是行数。
更新:请记住,SQL
和PL/SQL
之间存在巨大差异。大多数情况下,前端应用程序调用PL/SQL程序,CONTEXT SWITCHING
加起来就是EXECUTION TIME
。