由于特定表上的全表扫描,我的进程表现不佳.我已经计算了统计数据,重建了现有的索引,并尝试为此表添加新索引,但这还没有解决问题.
隐式类型转换可以停止使用索引吗?其他原因呢?全表扫描的成本比索引查找大1000左右.
编辑:
sql语句:
select unique_key from src_table where natural_key1 = :1 and natural_key2 = :2 and natural_key3 = :3;
> natural_key1的基数很高,但有一种类型转换.
>自然键的其他部分是低基数,并且未启用位图索引.
>表大小约为1,000,000条记录.
ps.setLong(1,oid);
这与列数据类型:varchar2冲突
解决方法
您可以使用基于函数的索引.
您的查询是:
select unique_key from src_table where natural_key1 = :1
在您的情况下,索引未被使用,因为natural_key1是varchar2并且:1是数字. Oracle正在将您的查询转换为:
select unique_key from src_table where to_number(natural_key1) = :1
所以…为to_number(natural_key1)添加一个索引:
create index ix_src_table_fnk1 on src_table(to_number(natural_key1));
您的查询现在将使用ix_src_table_fnk1索引.
当然,最好让Java程序员首先正确地完成它.