sql - Oracle SQL 自联接性能
问题描述
假设我有一个名为 order 的表,其中包含以下数据。我需要得到 customer_name 和 no。他们下的订单。
表名:订单
id | customer_name | item
1 | Siddhant | TV
2 | Siddhant | Mobile
3 | Sankalp | Football
期望的输出:
customer_name | no_of_orders
Siddhant | 2
Sankalp | 1
我尝试了以下 2 个查询以获得结果:
select customer_name, count(customer_name) as no_of_orders
from order
group by customer_name;
这给了我正确的结果,但运行大约需要 10.5 秒
select ord.customer_name, count(ord1.customer_name) as no_of_orders
from order ord
inner join order ord1 on ord1.customer_name = ord.customer_name
group by ord.customer_name;
这给了我结果中的平方(正确计数),但运行时间约为 2 秒。我可以得到平方根来得到实际计数。
我理解为什么第二个查询给出了输出中实际计数的平方,但有人可以解释为什么它与第一个查询相比运行得如此之快吗?
PS:我在 Oracle SQL Developer 中运行这些。
解决方案
第一个版本是您应该在这里使用的版本:
SELECT customer_name, COUNT(customer_name) AS no_of_orders
FROM "order"
GROUP BY customer_name;
如果没有WHERE
orHAVING
子句,在这里添加索引可能没有太大帮助,因为 Oracle 基本上必须触及表中的每条记录才能进行聚合。至于为什么第二个版本看起来更快,我推测您使用的基准测试并不具有代表性,因为它们基于相当小的表大小。如果您将表数据扩展到数万行,我预测第一个版本会快得多。
推荐阅读
- python - 如何测量我的 python 脚本使用的数据量(互联网数据)?
- mysql - 包含属性或值的 json 对象的路径
- javascript - 如何在 gatsbyJs (React) 中制作一个显示卡片内下一个数组项的按钮
- node.js - 如何使用 node.js 发送短信
- javascript - 防止用户在 html 相机中切换捕获模式
- python-3.x - 向函数生成的图形添加子图
- azure-cdn - 我们如何将端点从一个 CDN 配置文件移动到另一个?
- javascript - Monster Admin Template 中的 emulateTransitionEnd JQuery 自定义函数原型使 Bootstrap 不适用于某些 Windows 操作系统
- python - 熊猫转型
- python - 如何在使用 setuptools (data_files) 安装的 Python 用户配置文件中包含路径?