Oracle SQL自连接性能

让我说我有一个叫做订单的表格,其中包含以下数据。我需要获得customer_name以及编号。他们下的订单。

表名:订单

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中运行它们。

yjyyjywww 回答:Oracle SQL自连接性能

第一个版本是您应该在此处使用的版本:

SELECT customer_name,COUNT(customer_name) AS no_of_orders
FROM "order"
GROUP BY customer_name;

在缺少WHEREHAVING子句的情况下,在此处添加索引可能并没有太大帮助,因为Oracle必须基本触摸表中的每个记录才能进行聚合。至于第二个版本为什么看起来更快的原因,我推测您使用的基准测试没有代表性,因为它们基于相当小的表大小。如果您将表数据缩放到成千上万的行,我预计第一个版本的速度会大大提高。

本文链接:https://www.f2er.com/3083434.html

大家都在问