1

我有一个 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)

4

1 回答 1

3

文档中:

分析函数根据一组行计算聚合值。它们与聚合函数的不同之处在于它们为每个组返回多行。
...
分析函数是查询中执行的最后一组操作,除了最后的 ORDER BY 子句。在处理分析函数之前,所有连接和所有 WHERE、GROUP BY 和 HAVING 子句都已完成。

您的内部选择正在从表中提取所有行,因为它没有where子句;因为它必须获取每一行,所以索引没有帮助,它还不如进行全表扫描。使用索引datestamp会更糟——它必须对索引进行全面扫描,然后无论如何都要访问每个数据行,从而增加 IO。如果您自己运行内部选择,您会看到它返回很多行,而不仅仅是一个。

然后,外部选择匹配内部选择的特定行(或行)。由于在处理中计算分析值时,该比较无法推送到内部选择中。

于 2013-04-10T07:05:15.560 回答