sql - 为什么并行运行一个简单的查询会使其更快?
问题描述
如果我们看一个像这样的简单查询:
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);
为什么会这样?
感谢您的帮助,我今天才了解并行执行,所以放轻松哈哈!
解决方案
关于关系数据库的一个非常重要的一点是表代表无序集。这意味着可以按任何顺序扫描为表扫描的页面。
Oracle 实际上利用这一点对单个表进行并行扫描。将结果重新组合在一起需要额外的开销,这就是为什么估计成本是 81 而不是 73 (581 / 8)。
我认为这个文档有很好的例子来解释这一点。有些非常接近您的查询。
请注意,并行性不仅适用于阅读表。事实上,它更常与其他操作相关联,例如连接、聚合和排序。
推荐阅读
- python - 如何将二维记录数组转换为由分隔符分隔的多行记录字符串?
- python - python数据框中行和列之间的公共元素
- go - Golang 严格的 nil 检查
- r - R:如何使用 R 使用 Bing 免费层网络搜索
- android - 从适配器中删除项目后,Recyclerview 获取现有数据并且未正确更新
- angular - 打字稿传播参数如何测试是否为空?
- c# - C# Selenium,登录后找不到任何元素
- python - 我的缓存函数抛出 TypeError(用 lru_cache 装饰)
- css - CSS | 如果太宽,则网格模板行流
- angular - 表单控制异步验证问题