我有两个查询,其中一个查询涉及查询中的分区表,而另一个查询是相同的,除了它涉及非分区的等效表。原始(非分区表)查询的性能优于分区的计数器部分。我不知道如何解决这个问题。查看执行计划,我发现使用的索引与两个查询的b / w相同,并且新查询在其执行计划中显示PARTITION RANGE子句,这意味着正在进行分区修剪。该查询具有以下形式: -
Select rownum, <some columns>
from partTabA
inner join tabB on condition1
inner join tabC on condition2
where partTabA.column1=<value> and <other conditions>
and partTabA.column2 in (select columns from tabD where conditions)
其中partTabA是分区表,partTabA.column1是分区键(范围分区)。在原始查询中,它将被同一个表的非分区等效项替换。我应该查看哪些参数来找出新查询执行得很糟糕的原因。我拥有的工具是Oracle SQL Developer。
答案 0 :(得分:2)
PARTITION RANGE ITERATOR
并不一定意味着正在进行分区修剪。
您还需要查看解释计划中的Pstart
和Pstop
,以查看正在使用的分区。
分区查询速度较慢有几个可能的原因,即使它正在读取相同的数据。 (假设分区查询未正确修剪,并且正在从整个表中读取。)
select * from dba_segments where segment_name in ('PARTTABA', 'TABA');
如果这是问题,您可能需要查看表空间设置,或者使用延期分段创建。答案 1 :(得分:1)
我相信你正在处理分区开销,如果你有分区表,那么oracle必须先找到要扫描的分区。
你能在这里粘贴两个执行计划吗?桌子有多大?这里使用索引的选择性如何?
您是否尝试收集统计信息?
您也可以尝试查看跟踪文件,看看发生了什么。