分析功能性能代价高昂

时间:2013-04-10 06:45:35

标签: performance oracle analytical

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

使用索引扫描解释QRY1的Paln(在1秒内释放)成本非常低。

但是对于QRY2进行全表扫描(在8秒内出现),成本非常高。

只是想知道为什么分析函数会忽略索引。

由于 (我是usig PL / SQL Oracle 10g)

1 个答案:

答案 0 :(得分:3)

来自documentation

  

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

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

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