java - 从 java 运行查询时不使用 oracle 中日期类型列的索引

标签 java oracle date jdbc indexing

我在 Oracle 中有一个包含 15+ 百万条记录的表。它是一种日志表,它有一个类型为“date”的 created_ts 列。我在 created_ts 列上有一个简单的“非唯一”类型索引。

我有一个简单的范围查询:

select * from table1 where created_ts >= ? and created_ts <= ?; 

当我像这样从 SQLPlus 或 SQL Developer 等运行此查询时:

select * from table1 
where created_ts >= TO_DATE( '2009-11-10 00:00:00', 'YYYY-MM-DD HH24:MI:SS') 
and created_ts <= TO_DATE( '2009-11-10 23:59:59', 'YYYY-MM-DD HH24:MI:SS'); 

查询最多在 1-2 秒内返回。

但是当我通过 JDBC 在 java 中运行完全相同的查询并设置相应的“?”时使用 java.sql.Timestamp 对象的参数。查询需要很长时间。分析它进行全表扫描并且不使用索引的oracle进程。

我使用的jdbc驱动是ojdbc5 11.1.0.7.0

任何人都可以帮助..如何正确创建索引以便它使用索引。


当我使用“oracle.sql.DATE”对象而不是“java.sql.timestamp”来设置绑定(bind)变量时,我的问题得到了解决。查询使用索引并几乎在 1-2 秒内执行。

感谢所有回复和帮助的人。

但这对我来说有问题,因为此解决方案依赖于数据库,我的应用程序接收数据库连接和查询作为参数,并以通用方式加载和处理数据。 DB 连接可以是任何 RDBMS,如 oracle、mysql 等。

最佳答案

这是隐式数据类型转换的典型行为。因为数据库必须转换列的数据类型,所以它不能在该列上使用任何索引。

在您的情况下,我怀疑这是由于您使用了 java.sql.Timestamp。是否可以使用 the Oracle datatypes package 中的等效类型? , oracle.sql.Timestamp?显然,这可能会产生一些链式 react ,但我认为您至少应该对其进行测试,看看是否能解决您的问题。

关于java - 从 java 运行查询时不使用 oracle 中日期类型列的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1713248/

相关文章:

java - 如何动态创建SWT按钮及其 Action ?

java - 如何将不断变化的 JTextArea 放到 JScrollPane 中?

oracle - 对象和记录类型的区别

c - 多个进程访问单个表进行插入

sql - 在没有连接预言机的情况下填充最大值

java - 如何将完整的日期格式拆分为日期和时间?

java - android布局获取framelayout总是在tabwidget之上

java - 数据未插入 MySQL 数据库

java - 如何解决java.text.ParseException

java - 计算两次android之间的差异