簡體   English   中英

Oracle 在程序和 sql 開發人員中的行為不同

[英]Oracle behave differently in program and sql developer

我有一個 spring 批處理程序,用於檢查文件中的數據是否存在於 oracle 數據庫中。 通過在 SQL Developer 中調整的推薦步驟,我為表 a 和表 b 添加了 2 個索引。 從 SQL Developer 開始,沒有索引,加載需要 0.5 秒,而索引只有 0.03 秒。 但是,在運行程序時,查詢需要 0.5 秒才能加載。 我嘗試添加提示,使用hash joinindex 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;

嘗試為以下內容創建索引:

  • table_a.internal_trace_number
  • table_b.tabla_a_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM