Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/403.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Sybase为什么不使用函数索引?_Java_Prepared Statement_Sybase_Functional Index - Fatal编程技术网

Java Sybase为什么不使用函数索引?

Java Sybase为什么不使用函数索引?,java,prepared-statement,sybase,functional-index,Java,Prepared Statement,Sybase,Functional Index,我已经在sybase表上创建了一个函数索引 create index acadress_codpost_lower on acadress(LOWER(l5_codpost)) 然后,我运行一个使用索引的复杂查询。如果没有索引,则需要17.086秒。对于索引,它需要0.076秒 我从两个不同的SQL客户机以及开发和预生产Sybase服务器上运行了它。在所有情况下,我都能从索引中看到加速度 但是,当我们从Java运行相同的查询时(我知道这是相同的,因为我已经记录了生成的SQL并直接在SQL客户机

我已经在sybase表上创建了一个函数索引

create index acadress_codpost_lower on acadress(LOWER(l5_codpost))
然后,我运行一个使用索引的复杂查询。如果没有索引,则需要17.086秒。对于索引,它需要0.076秒

我从两个不同的SQL客户机以及开发和预生产Sybase服务器上运行了它。在所有情况下,我都能从索引中看到加速度

但是,当我们从Java运行相同的查询时(我知道这是相同的,因为我已经记录了生成的SQL并直接在SQL客户机中使用了它),那么性能与添加索引之前完全相同

当从ACE和SQuirreL而不是从Java运行时,相同的SQL查询使用索引可能有什么原因

我的第一个想法是,Sybase可能正在缓存准备语句的执行计划,而不是使用索引。我们已经多次尝试重新启动Java服务器(其他服务使用Sybase服务器,因此很难恢复),但都没有效果

另一种可能性是,我们使用的是非常旧版本的Sybase驱动程序:

jConnect (TM) for JDBC(TM)/7.00(Build 26502)/P/EBF17993/JDK16/Thu Jun 3 3:09:09 2010
此版本的JConnect是否可能不支持函数索引


有人知道这些理论中的任何一个是否正确,或者我是否还遗漏了其他什么吗?

在过去一周左右的时间里,我断断续续地研究了这个问题,虽然我仍然没有一个明确的答案,但我确实有一个似是而非的理论

我尝试了评论中的建议,感谢他们,如果我有疑问,我能够将原因缩小到一个单一的变化:

"where LOWER(aca.l5_codpost) like '"+StringEscapeUtils.escapeSql("NG179GT".toLowerCase())+"'"
然后,查询使用索引并以极快的速度返回

另一方面,如果我有:

where LOWER(aca.l5_codpost) like :postcode

query.setString("postcode", "NG179GT".toLowerCase());
然后它不使用索引

其原理是Sybase在优化查询计划时没有关于
:postcode
内容的信息,因此它没有使用索引。一旦知道查询的内容,它就不会重新编译查询,因此它从不使用索引

我尝试过使用
(index acadress\u codpost\u lower)
强制索引,但没有任何区别

我试过
关闭forceplan
关闭literal\u autoparam
,但都没有效果

我能找到的唯一改变行为的方法是直接将选项嵌入到查询计划中,而不是将其作为参数


因此,解决方法是将参数嵌入查询字符串中,尽管我仍然希望知道实际发生的情况并正确解决问题。

可能相关:您有什么确切版本的Sybase?这些问题是相同的吗?(只是一个猜测,语句缓存可能区分大小写)还可以看看以下提示:“其他”系统的查询与基于Java的查询有多相同?准备好的语句也可能是问题所在,有没有参数化的值?一个好的测试是从控制台中提取运行的相同SQL,并将其从Java中输入到一个常规JDBC语句中,然后“按原样”运行。我对Sybase几乎一无所知,但在SQL Server中,如果客户端具有某些与对象定义不匹配的
SET
选项,则查询优化器会对计算列和索引视图进行索引。也许Sybase对基于函数的索引有一些类似的规则,ACE使用的客户端选项与Java不同?谢谢你的建议,明天早上我回到办公室时,我会仔细研究它们。。。