您好,我有一个对 Oracle 系统的查询,其中涉及一个视图,该视图通过将 TO_NUMBER() 应用于表主键来连接其他表。
如果我使用 TOAD 进行查询,查询速度非常快(800 个寄存器 1 秒)。如果我通过 JDBC 使用字符串文字(不是参数化查询)在 java 程序中执行相同的查询,时间也很好。
但是,如果我通过PreparedStatement 使用参数化查询,则查询需要 1 分钟才能获取相同的寄存器。我知道使用常量值会比使用参数产生不同的执行计划...但是如果我删除视图连接中的 TO_NUMBER 函数,参数化查询也很快。
- 参数 / TO_NUMBER() 联合是否阻止使用连接表的 PK 索引?
- 有没有解决方法来解决这个问题(我需要查询上的参数以及 TO_NUMBER 函数)?
P.D.抱歉我的英语不好
如果没有其他信息,我们只能假设索引未与应用于该列的 to_number() 函数一起使用。如图所示这个问题 https://stackoverflow.com/questions/1158188/index-not-used-due-to-type-conversion,类型转换可以阻止优化器使用索引。
一般来说:
- 当您向列添加函数时(即:
to_number(id)
)优化器将无法使用该列上的常规索引,
- 如果可能,您应该使用原始列。例如:而不是
WHERE trunc(col) = DATE '2009-08-27'
你应该使用:WHERE col >= DATE '2009-08-27' AND col < DATE '2009-08-28'
- 如果您确实必须将函数应用于列,您可以使用基于函数的索引 http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_5010.htm#i2078649
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)