JDBC中的Java查询速度慢,但其他系统(TOAD)则不然

Tel*_*tar 5 java oracle performance jdbc

您好我有一个Oracle系统查询,它涉及一个视图,它通过将TO_NUMBER()与表主键相关联来连接其他表.

如果我使用TOAD进行查询,查询速度非常快(800 regs为1秒).如果我在JDBC程序中使用String文字(不是参数化查询)在java程序中执行相同的查询,那么时间也很好.

但是如果我使用PreparedStatement的参数化查询,则查询需要1分钟来获取相同的寄存器.我知道使用常量值会产生与使用参数不同的执行计划...但是如果我删除视图连接中的TO_NUMBER函数,则参数化查询也很快.

  • 参数/ TO_NUMBER()联合是否阻止使用连接表的PK索引?
  • 是否有解决方法(我需要查询参数和TO_NUMBER函数)?

PD sry我的英语不好

Vin*_*rat 2

如果没有其他信息,我们只能假设索引未与应用于该列的 to_number() 函数一起使用。如这个SO问题所示,类型转换可以阻止优化器使用索引。

一般来说:

  • 当您向列添加函数时(即:),to_number(id)优化器将无法使用该列上的常规索引,
  • 如果可能,您应该使用原始列。例如:WHERE trunc(col) = DATE '2009-08-27'您应该使用:WHERE col >= DATE '2009-08-27' AND col < DATE '2009-08-28'
  • 如果确实必须对列应用函数,则可以使用基于函数的索引