1

我在 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不会使用索引,因为在语句编译时它不知道参数是'something%'(能够从索引中获得性能优势)还是'%something%'(不能从索引中获得性能优势)。

所以,我的问题是:

  1. 我应该改用 aStatement吗?如果是这样,转义输入参数的最佳方法是什么(因为它将来自 AJAX 请求)
  2. 有什么我可以用来制作PreparedStatement使用索引的吗?
4

1 回答 1

1

我认为准备好的语句更好,因为您将在服务器端进行更少的解析,从而减少“闩锁:库缓存”。

SELECT /*+ INDEX suppliers(supplier_name_upper_idx) */ * from suppliers ....应该使语句使用索引“supplier_name_upper_idx”。

于 2012-12-01T15:33:17.900 回答