我的表有超过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条记录-但是性能太慢。
如何改善呢?
您可以在添加索引(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;
这将只扫描表一次,从而提高了性能。
好的,但是如果要选择2列,语法将如何?
它真的很复杂,请您详细说明一下?
@osfar虽然比典型的选择要复杂一些,但它非常有用。但是,您确实确实需要正确的索引。正确的索引可以使速度提高数百倍。过去,我看到在10M +表上创建索引可以将查询时间从1小时以上减少到1秒以下。
@osfar。。。如果要选择两列,则会有一个不同的问题。但是您可以轻松地将更多列添加到横向连接中。
@ Aleks G如何为我的案例制作完美的索引?