我在Oracle中有一个像这样的表:
create table suppliers(name varchar2(100));
在upper(name)
上有相应的索引:
create index supplier_name_upper_idx on suppliers(upper(name));
我想通过AJAX填充自动填充,从运行JDBC查询的Servlet获取信息。
这有效:
PreparedStatement ps =
conn.prepareStatement(
"select * from suppliers where upper(name) like ?"
);
ps.setString(1, 'something%');
问题是,据我所知,PreparedStatement
不会使用索引,因为在语句编译时它无法知道参数是否为{{1} (能够从索引中获得性能优势)或'something%'
(无法从索引中获得性能优势)。
所以,我的问题是:
'%something%'
吗?如果是这样,那么退出输入参数的最佳方式是什么(因为它将来自AJAX请求)Statement
使用索引吗?答案 0 :(得分:1)
我认为准备好的声明更好,因为你在服务器端会有更少的解析,因此更少的锁存器:库缓存'。
SELECT /*+ INDEX suppliers(supplier_name_upper_idx) */ * from suppliers ....
应该使用索引" supplier_name_upper_idx"。