【发布时间】:2016-10-18 10:49:41
【问题描述】:
我的应用程序使用的视图必须保持通用(无过滤器),并且包括分析函数 RANK 和 DENSE_RANK。例如我有一个视图MYVIEW:
SELECT
RANK() OVER (PARTITION BY FIELD1 ORDER BY FIELD2) RANK,
FIELD2,
FIELD3
FROM TABLE1;
然后我的应用程序在运行时应用必要的过滤器,即
SELECT * FROM MYVIEW WHERE FIELD3 IN ('a','b','c');
我的查询在没有 RANK 功能的情况下非常快,但使用它时速度非常慢(2 分钟以上)(我得到了正确的结果,只是速度很慢)。基础表有 250,000 多行,我无法控制它的设计。我无法进一步划分它。那么它是否很慢,因为每次调用视图时它都会为 FIELD1 中的每个唯一条目创建分区?还有什么办法可以避免吗?有关如何加快速度的任何建议?
【问题讨论】:
-
您是否尝试过查看查询计划?
-
我有点期待它首先应用过滤器(谓词推送)并将排名应用于匹配的行。但执行计划将揭示正在发生的事情。您是否获得了您期望的排名值 - 即它们是否在结果集上是连续的,或者在应用过滤器之前它们是否存在被评估的差距? (你想要哪个?)
-
@Alex Pole,
FIELD3 IN ('a','b','c');条件的谓词推送在这种情况下不起作用,因为这是一种物化子查询:SELECT ... FROM (subquery/view that numbers rows ) WHERE FIELD3 IN ('a','b','c');- 此查询必须首先为所有行分配数字,然后选择一些行,但会改变数字。我猜table1( FIELD1, FIELD2 )上的简单多列索引可以加快查询速度。 -
@kordiko - 我的期望经常是错误的 *8-) 我不确定排名是否总是首先出现(部分是我所要求的)所以你已经保存了我的测试来找出答案。
-
物化视图?不知道这是否可能,因为我正在使用的 RDBMS 不允许在物化视图中使用分析功能。 :(
标签: sql oracle performance rank dense-rank