性能调优 - 查询分区与非分区表

时间:2012-10-03 14:52:15

标签: performance oracle partitioning

我有两个查询,其中一个查询涉及查询中的分区表,而另一个查询是相同的,除了它涉及非分区的等效表。原始(非分区表)查询的性能优于分区的计数器部分。我不知道如何解决这个问题。查看执行计划,我发现使用的索引与两个查询的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。

2 个答案:

答案 0 :(得分:2)

PARTITION RANGE ITERATOR并不一定意味着正在进行分区修剪。 您还需要查看解释计划中的PstartPstop,以查看正在使用的分区。

分区查询速度较慢有几个可能的原因,即使它正在读取相同的数据。 (假设分区查询未正确修剪,并且正在从整个表中读取。)

  1. 从多个本地索引读取的效率可能远低于从单个较大索引读取的效率。
  2. 从较大的初始段大小,大量分区等可能会浪费大量空间。将段大小与此进行比较:select * from dba_segments where segment_name in ('PARTTABA', 'TABA');如果这是问题,您可能需要查看表空间设置,或者使用延期分段创建。

答案 1 :(得分:1)

我相信你正在处理分区开销,如果你有分区表,那么oracle必须先找到要扫描的分区。

你能在这里粘贴两个执行计划吗?桌子有多大?这里使用索引的选择性如何?

您是否尝试收集统计信息?

您也可以尝试查看跟踪文件,看看发生了什么。