【发布时间】:2021-11-03 06:02:38
【问题描述】:
SELECT SUM(C_QUANTITY)
FROM CARS JOIN ORDERS
ON C_ORDERKEY = O_ORDERKEY;
我有这个查询从 JOIN 表中聚合 L_QUANTITY 的总和。使用EXPLAIN PLAN 的查询成本为12147。目标是通过实现更高效的SELECT 语句来改进此SELECT 语句,从而获得相同的结果。
我试过了
SELECT SUM(C_QUANTITY)
FROM CARS
它返回了相同的结果,但查询成本与原始的完全相同。我认为通过删除JOIN,SELECT 查询将会改进。
有没有办法通过只修改SELECT 语句来降低成本?
编辑:
原始查询计划
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 2287326370
-------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 3 | 12147 (1)| 00:00:01 |
| 1 | SORT AGGREGATE | | 1 | 3 | | |
| 2 | TABLE ACCESS FULL| CARS | 1800K| 5273K| 12147 (1)| 00:00:01 |
-------------------------------------------------------------------------------
9 rows selected.
使用第二个查询
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 2287326370
-------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 3 | 12147 (1)| 00:00:01 |
| 1 | SORT AGGREGATE | | 1 | 3 | | |
| 2 | TABLE ACCESS FULL| CARS | 1800K| 5273K| 12147 (1)| 00:00:01 |
-------------------------------------------------------------------------------
9 rows selected.
【问题讨论】:
-
我同意这很奇怪。第一个查询当然比第二个查询复杂得多。你确定你没有看错? (顺便说一句,查询或数据模型看起来也很奇怪。一辆汽车有一个数量,每个订单都订购该数量,所以你将汽车的数量乘以它的订单数量?真的吗?)
-
您好,Thorsten,感谢您的回复。语义从原来的改变也许这就是为什么你觉得数据模型很奇怪。我在两个查询处理中都没有弄错 - 我已经运行了几次,结果是一样的。因此,在这里发布这个问题,希望得到一些反馈。
-
解释计划看起来和我一模一样。两个查询之间的性能可能不相同,但非常接近。
-
谢谢蒂姆。我认为仅通过修改
SELECT来改进上述查询是不可能的。我会将您的答案标记为正确的答案,因为index确实改善了此类查询。 -
我花了一些时间才明白这一点。订单表是父表。汽车始终是一个订单的一部分。因此,为了汇总汽车数量,Oracle 不必读取订单表。所有需要的信息都在汽车表中。所以优化器决定根本不读取订单表。这很好,因此无论如何都是最好的计划。您的查询尽可能简单,无法优化。使用包含数量的索引,Oracle可以决定进行全索引扫描而不是读取表,从而减少读取驱动器扇区/块。
标签: sql oracle performance query-optimization sql-execution-plan