1

我知道这个问题已经在这里被问过不止一次。但我无法解决我的问题,因此再次发布求助。DB索引不被调用

我有一个表,称为交易在Oracle数据库(11克)与270万条记录。有一个包含数值的非空varchar2(20)txn_id)列。这不是表格的主键,并且大部分值都是唯一的。我的意思是大部分数值都可以在表格中出现3-4次。

如果我根据TXN_ID执行select的简单查询,则需要大约5秒或更长时间来返回结果。

Select * from Transaction t where t.txn_id = 245643 

我有这个列上创建的索引,但是当我检查上述查询的解释计划时,它使用全表扫描。此查询在应用程序中多次使用,导致应用程序变慢。

你能提供一些帮助,可能会导致此问题吗?

+3

发布查询计划(包括访问和过滤器谓词)将会很有帮助。如果该列是'varchar2',那么为什么要将它与一个数字而不是一个字符串进行比较?如果你的谓词是't.txn_id ='245643''会发生什么呢?你的应用程序是否真的使用了文字(我确定不希望)?如果它使用绑定变量,它绑定的是数值还是字符串值? –

+2

你可以发布索引定义吗? txn_id是索引中唯一的列吗? –

回答

3

您正在比较varchar列与数字文字(245643)。这迫使甲骨文转换平等的一方,而且,这似乎是选择了“错误”的一面。而不必猜测Oracle如何处理此转换,请使用字符文字:

SELECT * FROM Transaction t WHERE t.txn_id = '245643' 
+0

我明白你的观点。我测试了它,并且在比较两侧的varchar时使用了索引。我将检查为什么应用程序调用需要这么长时间。可能是类似的问题。谢谢。我接受你的回答:) – mehta