【问题标题】:Analytic function performance costly解析函数性能代价高昂
【发布时间】: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


【解决方案1】:

来自documentation

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

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

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

【讨论】:

  • 谢谢 Alex 所以你说要从日常事务表中获取最新数据,我们应该使用传统的 sub qry 概念(上面示例中的 QRY 1)分析不会有效地工作。
  • @Avi - 在这种情况下,根据索引值提取单个记录,然后是的,您的测试表明它更有效。
猜你喜欢
  • 2014-08-28
  • 1970-01-01
  • 2020-05-21
  • 2012-03-21
  • 2011-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多