database – 由于类型转换而未使用的索引?

前端之家收集整理的这篇文章主要介绍了database – 由于类型转换而未使用的索引?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
由于特定表上的全表扫描,我的进程表现不佳.我已经计算了统计数据,重建了现有的索引,并尝试为此表添加新索引,但这还没有解决问题.

隐式类型转换可以停止使用索引吗?其他原因呢?全表扫描的成本比索引查找大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条记录.

Java代码(不易修改):

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程序员首先正确地完成它.

猜你在找的Oracle相关文章