首页 > 解决方案 > 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 中运行这些。

标签: sqloracleperformanceself-join

解决方案


第一个版本是您应该在这里使用的版本:

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

如果没有WHEREorHAVING子句,在这里添加索引可能没有太大帮助,因为 Oracle 基本上必须触及表中的每条记录才能进行聚合。至于为什么第二个版本看起来更快,我推测您使用的基准测试并不具有代表性,因为它们基于相当小的表大小。如果您将表数据扩展到数万行,我预测第一个版本会快得多。


推荐阅读