【问题标题】:Is there actually any speed impact in SQL 1 query returning 3 columns, or 3 queries returning 1 column?返回 3 列的 SQL 1 查询或返回 1 列的 3 个查询实际上对速度有影响吗?
【发布时间】:2014-09-30 16:09:39
【问题描述】:

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

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

示例

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 次通过 sql 解析器,等等等等。一个包含三个字段的查询效率更高。

标签: php sql oracle


【解决方案1】:

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

【讨论】:

  • 谢谢。那么我应该在页面顶部完成所有查询,然后在整个过程中使用变量吗?还有比这更好的做法吗?
  • 使用 MVC 模型设置是您所建议的更正式的方法,但原则上,是的,这是最佳实践。
  • @user3973427 它不必在页面顶部,它可以在您使用变量之前。无论哪种方式,您都应该避免重复查询。考虑到每次调用数据库都是您可能做的最慢的事情(可能除了 Web API)。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

    如果您想要ROT,即经验法则,那么单个查询比划分多个查询来执行相同任务要好。

    注意:性能调优与基数有关。基数不是列数,而是行数。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-18
      • 1970-01-01
      • 2020-03-03
      • 2021-02-02
      • 2016-12-18
      相关资源
      最近更新 更多