【问题标题】:Performance tuning - Query on partitioned vs non-partitioned table性能调优 - 查询分区表与非分区表
【发布时间】:2012-09-24 12:49:47
【问题描述】:

我有两个查询,其中一个涉及查询中的分区表,而另一个查询是相同的,只是它涉及非分区等效表。原始(非分区表)查询比分区对应部分执行得更好。我不确定如何为此隔离问题。查看执行计划,我发现两个查询使用的索引是相同的,并且新查询在其执行计划中显示了 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。

【问题讨论】:

    标签: performance oracle partitioning


    【解决方案1】:

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

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

    您是否尝试收集统计数据?

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

    【讨论】:

    • 我注意到的一个区别是非分区表访问是通过 PK 上的非唯一索引,而在分区表上,访问是通过唯一索引(本地索引)在PK。
    【解决方案2】:

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

    分区查询会变慢有几个潜在原因,即使它正在读取相同的数据。 (假设分区查询没有正确修剪,而是从整个表中读取。)

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

    【讨论】:

    • 它是分区范围单。而对于 Pstart 和 PStop 来说都是 51。如果这是一个问题,如何推断以及如何纠正?
    • 哦,那我的想法都不适用。 :) 这听起来像一个棘手的问题,它可能有助于发布尽可能多的信息;解释计划、DDL、示例数据等。
    猜你喜欢
    • 2016-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-22
    • 2020-03-03
    • 2015-01-06
    相关资源
    最近更新 更多