2013-03-21 63 views
0

在單個事務中,我將可能的行插入到表中,然後插入行我執行查詢以查看是否已有一行包含關鍵字插入。在單個事務中插入多行時,Oracle查詢性能下降

我看到的是檢查密鑰的查詢在我的事務中變得非常緩慢,但是從另一個事務處理它是快速的,並且在下一個事務中它很快。

我無法將這項工作分解爲更小的事務,因爲我正在處理的請求需要在單個事務中。

有什麼我可以做的,使這個交易中的選擇查詢快?

+3

爲什麼你檢查行是否已經存在?創建一個唯一的約束(或索引),並簡單地處理錯誤。 – 2013-03-21 10:54:04

+0

是的,a_horse_with_no_name是對的。爲什麼要複製內置的功能,效率要高出數十億倍! – Rachcha 2013-03-21 10:55:00

+0

使用'merge'來避免插入重複項。 – 2013-03-21 10:56:09

回答

0

所以,請添加約束/主鍵。這將允許您刪除所有選擇。 可能會考慮使用MERGE,建議使用@ Egor_Skriptunoff。

或爲您所選擇的列添加索引。

+0

我在我選擇的列上有索引。我無法等待約束違規異常,因爲我正在使用休眠,並且一旦出現數據庫錯誤,我必須將事務回滾並重新開始。 – Greg 2013-03-21 11:07:51

+0

你嘗試合併? – evgenyl 2013-03-21 11:14:56

+0

我不認爲我可以使用合併,因爲Hibernate正在生成SQL。 – Greg 2013-03-21 11:20:09

0

如果插入數以百萬計的記錄第一件事是做增量提交,因爲您很可能觸及臨時空間碎片或導致速度減慢的限制。可在開始結束塊 也可以做,這可以讓你通過

create index b indexName on table_name(col1, col2, col3); 

合併更快添加索引前面的回答狀態。
可選地添加所有忽略重複然後刪除重複 這可以通過
來完成例如

begin 
    insert into table_name select * from table_name; [ if pulling from another table]or[use values and column maps] 
    delete from table_name A where rowid >(select min(rowid) from table_name B where A.key_value=B.key_value); 
end 

如果在過程中,這也將需要 查詢和刪除可以在開始端塊並執行即時( '你在這裏陳述';');