如何提高10M +记录表中的选择查询性能?

时间:2019-07-03 15:15:35

标签: sql oracle database-performance

我的表有超过1000万行,并且我使用带有绑定变量的简单查询(在我的情况下,我无法按主键ID搜索)。

该表如下所示:

Col1   Col2   Col3   Col4   Col5   Col6

查询就像

select distinct col1  
from table ;

select distinct col2 
where col1 = :bind ;

select distinct col3 
where col1 = :bind1 and col2 = :bind2 ;
.
.

select distinct col6 
where col1 = :bind1 and col2 = :bind2 and col3 = :bind3
  and col4 = :bind4 and col5 = :bind5 

所有这些查询的结果都不大-小于MAX的100条记录-但性能太慢。

如何改进它?

2 个答案:

答案 0 :(得分:2)

您可以在(col1, col2, col3, col4, col5)上添加索引。这可以用于所有查询:

create index idx_t_5 on t(col1, col2, col3, col4, col5);

如果这不可能并且列具有相同的类型,则可以在Oracle 12c +中使用横向联接将其组合为单个查询:

select distinct which, col
from t cross apply
     (select 'col1' as which, t.col1 as col from dual union all
      select 'col2', t.col2 from dual where t.col2 = :bind2 union all
      . . .
     ) t
where col1 = :bind1;

这将只扫描表一次,这可以提高性能。

答案 1 :(得分:0)

通常,以这种方式建立索引:

  1. 包括所有用WHERE针对常量进行测试的=列。 (到目前为止,您的所有示例均符合该标准。)各列可以按任何顺序排列。
  2. (这是最佳选择。)在SELECT末尾添加INDEX项,且顺序不限。这会使索引“覆盖”(除非它比描述的要复杂)。
  3. 请注意,最后增加一些列会带来一点负担,但不会造成伤害。

“复合” INDEX(col1, col2, col3, col4, col5, col6)恰巧同时符合这两个“规则”。如果您有一些SELECT,这有点不同,请向我们展示。我们也许可以帮助您为其建立另一个索引。