我的应用程序使用的视图必须保持通用(无过滤器),其中包括分析函数RANK
和DENSE_RANK
。例如,我有一个观点MYVIEW
:Oracle缓慢的RANK函数
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中的每个唯一条目创建分区?任何其他方式来避免这种情况?有关如何使这个更快的建议?
您是否试过查看查询计划? – mustaccio
我希望它首先应用过滤器(谓词推送)并将排名应用于匹配的行。但执行计划将揭示发生了什么。您是否得到您期望的排名值 - 即它们是否与结果集相邻,还是在应用过滤器之前有评估差距? (你想要什么?) –
@Alex Pole,谓词推动'FIELD3 IN('a','b','c');'在这种情况下条件不起作用,因为这是一种物化子查询: SELECT ... FROM(子查询/视图中的数字行)where FIELD3 IN('a','b','c');' - 此查询必须先将数字分配给所有行,然后选择一些行,但whithour改变数字。我想'table1(FIELD1,FIELD2)'上的一个简单的多列索引可以提高查询速度。 – krokodilko