我的表有超过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条记录-但性能太慢。
如何改进它?
答案 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)
通常,以这种方式建立索引:
WHERE
针对常量进行测试的=
列。 (到目前为止,您的所有示例均符合该标准。)各列可以按任何顺序排列。SELECT
末尾添加INDEX
项,且顺序不限。这会使索引“覆盖”(除非它比描述的要复杂)。“复合” INDEX(col1, col2, col3, col4, col5, col6)
恰巧同时符合这两个“规则”。如果您有一些SELECT
,这有点不同,请向我们展示。我们也许可以帮助您为其建立另一个索引。