首页 > 解决方案 > 为什么并行运行一个简单的查询会使其更快?

问题描述

如果我们看一个像这样的简单查询:

SELECT * FROM CUSTOMER2;

我们可以通过查看它来判断它只做一件事,从 CUSTOMER2 检索所有内容。

现在我的问题是,为什么当我们这样运行它时:

SELECT/*+ PARALLEL(CUSTOMER2, 8) */ * FROM CUSTOMER2;

它的成本(根据执行计划)从 581 到 81?由于它只有一个任务,它不只是在同一个线程上执行吗?

我可以理解是否需要进行两次全表扫描,因为您可以在并行线程中运行这两个,以便它们同时执行。但在我们的例子中,只有一次全表扫描。

那么,当没有什么可以“并行”运行它时,如何并行运行它使其更快呢?

最后,当我更改我的个人集群和一个表以在对其执行任何操作时并行运行时,我没有看到任何成本变化,就像我对小语句所做的那样。

这是我个人的:

SELECT AVG(s.sellprice), s.qty, s.custid   
FROM CUSTOMER_saracl c, sale_saracl s 
WHERE c.custid = s.custid  
GROUP BY (s.qty,  s.custid)  
HAVING AVG(s.sellprice) >  
  (SELECT MIN(AVG(price))    
   FROM  product_saracl    
   WHERE pname  
   LIKE 'FA%'   
GROUP BY price);

为什么会这样?

感谢您的帮助,我今天才了解并行执行,所以放轻松哈哈!

标签: sqloracleparallel-processingoracle-sqldeveloper

解决方案


关于关系数据库的一个非常重要的一点是表代表无序集。这意味着可以按任何顺序扫描为表扫描的页面。

Oracle 实际上利用这一点对单个表进行并行扫描。将结果重新组合在一起需要额外的开销,这就是为什么估计成本是 81 而不是 73 (581 / 8)。

我认为这个文档有很好的例子来解释这一点。有些非常接近您的查询。

请注意,并行性不仅适用于阅读表。事实上,它更常与其他操作相关联,例如连接、聚合和排序。


推荐阅读