我有一个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)
答案 0 :(得分:3)
分析函数根据一组计算聚合值 行。它们与聚合函数的不同之处在于它们返回 每组多行。
...
分析函数是最后一组 在查询中执行的操作除了最终的ORDER BY之外 条款。所有连接以及所有WHERE,GROUP BY和HAVING子句都是 在处理分析函数之前完成。
你的内部选择是从表中提取所有行,因为它没有where
子句;因为它必须获取每一行索引没有帮助,它也可以进行全表扫描。使用datestamp
上的索引会更糟糕 - 它必须对索引进行全面扫描,然后无论如何都要访问每个数据行,从而增加IO。如果你自己运行内部选择,你会看到它返回很多行,而不只是一行。
然后外部选择匹配内部选择的特定行(或行)。由于在处理过程中计算分析值,因此无法将该比较推送到内部选择中。