关于oracle和索引用法的PreparedStatement

时间:2012-12-01 15:27:13

标签: performance oracle indexing escaping prepared-statement

我在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%'(无法从索引中获得性能优势)。

所以,我的问题是:

  1. 我应该使用'%something%'吗?如果是这样,那么退出输入参数的最佳方式是什么(因为它将来自AJAX请求)
  2. 我可以使用什么来使Statement使用索引吗?

1 个答案:

答案 0 :(得分:1)

我认为准备好的声明更好,因为你在服务器端会有更少的解析,因此更少的锁存器:库缓存'。

SELECT /*+ INDEX suppliers(supplier_name_upper_idx) */ * from suppliers ....应该使用索引" supplier_name_upper_idx"。