【发布时间】:2013-04-10 15:05:15
【问题描述】:
我有一个 table_A (C1,C2,C3,.....,Cn, datestamp)
注意:列日期戳已编入索引
QRY1
select * from
(select max(datestamp) dates from table_A) t,
table_A
where a.datestamp = t.dates
QRY2
select * from (
select a.* , max (datestamp) over() dates from table_A a))
where datestamp = dates
使用索引扫描(1 秒内执行)解释 QRY1 的 Paln 成本非常低。
但是对于 QRY2 进行全表扫描(在 8 秒内执行)成本非常高。
只是想知道为什么分析函数会忽略索引。
谢谢 (我用的是PL/SQL Oracle 10g)
【问题讨论】:
-
这实际上是一个有趣的例子。如果您有日期索引,那么 QRY1 中的第一个子查询可能会执行
MIN/MAX扫描(下树的成本,可能约为 3),然后使用相同的索引获取行 - 单行。我假设它不是唯一的,所以范围扫描(可能花费约 4 美元)所以它非常快。另一方面,分析功能 - 可能对导致全表扫描的数据进行排序,因此它的成本要高得多。您应该在对数据的部分(partition by 子句)使用聚合函数的情况下使用分析函数。
标签: performance oracle analytical