Performance 解析函数性能代价高昂

Performance 解析函数性能代价高昂,performance,oracle,analytical,Performance,Oracle,Analytical,我有一张a表(C1,C2,C3,…,Cn,邮戳) 注:列日期戳已编制索引 QRY1 select * from (select max(datestamp) dates from table_A) t, table_A where a.datestamp = t.dates QRY2 解释使用索引扫描(1秒内执行)的QRY1计划成本非常低 但对于QRY2,进行全表扫描(在8秒内执行)的成本非常高 只是想知道为什么分析函数会忽略索引 谢谢 (我正在使用PL/SQL Oracle 10g)来自:

我有一张a表(C1,C2,C3,…,Cn,邮戳)

注:列日期戳已编制索引

QRY1

select * from 
(select max(datestamp) dates from table_A) t,
table_A
where a.datestamp = t.dates
QRY2

解释使用索引扫描(1秒内执行)的QRY1计划成本非常低

但对于QRY2,进行全表扫描(在8秒内执行)的成本非常高

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

谢谢 (我正在使用PL/SQL Oracle 10g)

来自:

分析函数基于一组 排。它们与聚合函数的不同之处在于它们返回 每组有多行。

解析函数是最后一组 在查询中执行的操作的集合,但按的最终顺序除外 条款所有联接和所有WHERE、GROUP BY和HAVING子句都是 在处理分析函数之前完成

您的内部select正在从表中提取所有行,因为它没有
where
子句;因为它必须获取每一行,所以索引没有帮助,它还不如进行一次完整的表扫描。使用
日期戳上的索引将更糟糕-它必须对索引进行完整扫描,然后访问每个数据行,从而增加IO。如果单独运行内部select,您将看到它返回很多行,而不仅仅是一行


然后,外部选择与内部选择匹配一行或多行。由于在处理过程中计算了分析值,因此无法将该比较推到内部选择中。

谢谢Alex,所以您说要从每日交易表中获取最新数据,我们应该使用传统的子qry概念(上例中为qry 1),分析将无法有效地进行。@Avi-在这种情况下,基于索引值拉取单个记录,那么是的,您的测试表明它更有效。这实际上是一个有趣的例子。如果您有一个日期索引,那么QRY1中的第一个子查询可能会执行
MIN/MAX
扫描(向下树的成本,可能是~3),然后使用相同的索引获取行-一行。我假设它不是唯一的,所以距离扫描(可能要花费约4美元)非常快。另一方面,分析函数-可能会对导致全表扫描的数据进行排序,因此成本要高得多。在对部分数据使用聚合函数(partitionby子句)的情况下,应该使用分析函数。
   select * from (
   select a.* , max (datestamp) over() dates from table_A a))
   where datestamp = dates