DB索引不被调用
问题描述:
我知道这个问题已经在这里被问过不止一次。但我无法解决我的问题,因此再次发布求助。DB索引不被调用
我有一个表,称为交易在Oracle数据库(11克)与270万条记录。有一个包含数值的非空varchar2(20)
(txn_id
)列。这不是表格的主键,并且大部分值都是唯一的。我的意思是大部分数值都可以在表格中出现3-4次。
如果我根据TXN_ID
执行select的简单查询,则需要大约5秒或更长时间来返回结果。
Select * from Transaction t where t.txn_id = 245643
我有这个列上创建的索引,但是当我检查上述查询的解释计划时,它使用全表扫描。此查询在应用程序中多次使用,导致应用程序变慢。
你能提供一些帮助,可能会导致此问题吗?
答
您正在比较varchar
列与数字文字(245643
)。这迫使甲骨文转换平等的一方,而且,这似乎是选择了“错误”的一面。而不必猜测Oracle如何处理此转换,请使用字符文字:
SELECT * FROM Transaction t WHERE t.txn_id = '245643'
+0
我明白你的观点。我测试了它,并且在比较两侧的varchar时使用了索引。我将检查为什么应用程序调用需要这么长时间。可能是类似的问题。谢谢。我接受你的回答:) – mehta
发布查询计划(包括访问和过滤器谓词)将会很有帮助。如果该列是'varchar2',那么为什么要将它与一个数字而不是一个字符串进行比较?如果你的谓词是't.txn_id ='245643''会发生什么呢?你的应用程序是否真的使用了文字(我确定不希望)?如果它使用绑定变量,它绑定的是数值还是字符串值? –
你可以发布索引定义吗? txn_id是索引中唯一的列吗? –