[英]Oracle behave differently in program and sql developer
我有一个 spring 批处理程序,用于检查文件中的数据是否存在于 oracle 数据库中。 通过在 SQL Developer 中调整的推荐步骤,我为表 a 和表 b 添加了 2 个索引。 从 SQL Developer 开始,没有索引,加载需要 0.5 秒,而索引只有 0.03 秒。 但是,在运行程序时,查询需要 0.5 秒才能加载。 我尝试添加提示,使用hash join
和index hint
,但没有区别。 oracle 似乎没有选择索引。 你能帮我解决这个问题吗?
SQL:
SELECT
pi.PAYMENT_INSTRUCTION_ID,
cft.CFT_FILE_DETAIL_ID
FROM
table_a pi
LEFT JOIN
table_b cft ON pi.id = cft.tabla_a_id
WHERE
pi.internal_trace_number = :traceNumber
AND cft.payer_account_no like :payerAccountNo
AND cft.transaction_amount = :amount;
暗示
SELECT /*+ use_hash */
-- /*+ INDEX(pi IDX$$_0A0F0001) INDEX(cft DX$$_0A0F0002)*/
pi.PAYMENT_INSTRUCTION_ID
, cft.CFT_FILE_DETAIL_ID
FROM table_a pi
LEFT JOIN table_b cft
ON pi.id = cft.tabla_a_id
WHERE pi.internal_trace_number = :traceNumber
AND cft.payer_account_no like :payerAccountNo
AND cft.transaction_amount = :amount;
create index TABLE_A_ID on
TABLE_A (TO_NUMBER("INTERNAL_TRACE_NUMBER"), "CFT_FILE_DETAIL_ID",
"PAYMENT_INSTRUCTION_ID");
create index TABLE_B_ID on
TABLE_B ("PAYER_ACCOUNT_NO", "TRANSACTION_AMOUNT", "CFT_FILE_DETAIL_ID");
create bitmap index join_pi_cft
on TABLE_A(CFT_FILE_DETAIL_ID)
from TABLE_A PI, TABLE_B_ID CFT
WHERE PI.CFT_FILE_DETAIL_ID = CFT.CFT_FILE_DETAIL_ID;
尝试为以下内容创建索引:
创建这些索引后,查看SQL语句的解释计划和运行时间。
删除您现有的三个索引。
运行以下 SQL 语句:
create index table_a_i1 on table_a (internal_trace_number);
create index table_b_i1 on table_b (table_a_id);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.