关于索引的Oracle性能

时间:2016-02-18 17:01:10

标签: sql oracle indexing query-optimization sql-execution-plan

我在表col_log_actionrequest上执行下面的查询。它在列szorgcodecstatusszpartitionfieldszactioncode上有索引。列szpartitionfield是分区列。假设此表有两个分区'MH''BIH''BIH'只有10%的'MH'数据。

执行此查询时:

select *
  from prodcoll.col_log_actionrequest ab
 where  szorgcode = '001'
   and cstatus ='D'
-- and szactioncode = 'UBAR'
   and szpartitionfield = 'BIH';

它提供全表扫描。但是,当我使用szpartitionfield='MH'时,它会在cstatus列的索引上进行索引范围扫描。我可以知道为什么吗?

如果我执行以下查询而不管分区域,

select *
  from prodcoll.col_log_actionrequest ab
 where szorgcode = '001'
   and cstatus = 'D'
   and szactioncode = 'UBAR'
   and szpartitionfield = 'BIH';

它为szactioncode上的索引提供索引范围扫描。为什么会这样?

为什么优化器不使用其他索引?

1 个答案:

答案 0 :(得分:0)

看起来每个字段都有单个索引,只需创建一个复合索引。

CREATE INDEX comp_ind 
ON prodcoll.col_log_actionrequest(szorgcode, cstatus, szactioncode, szpartitionfield);

也许是3个领域的另一个。

优化器选择何时使用索引的原因取决于表的大小和每种类型的元素数量,有时使用索引成本而不仅仅是完全扫描。

在这种情况下使用4分离索引太贵了。因为优化器可以一起使用,并且需要在每次搜索后查找表。