我在 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 正在缓存 Prepared Statements 的执行计划,而不是使用索引。我们尝试了几次重新启动 Java 服务器(其他服务使用 Sybase 服务器,因此更难反弹),但没有任何区别。
另一种可能性是我们使用的是非常旧版本的 Sybase 驱动程序:
jConnect (TM) for JDBC(TM)/7.00(Build 26502)/P/EBF17993/JDK16/Thu Jun 3 3:09:09 2010
此版本的 JConnect 是否可能不支持功能索引?
有谁知道这些理论中的任何一个是否正确,或者是否还有其他我错过的东西?