2012-02-23 44 views
1

我需要從表中刪除基於密鑰的條目,這些條目可能會達到500萬左右。有兩種方法可以解決這個問題。一個使用Hibernate,另一個使用直接SQL查詢。休眠或SQL刪除操作?

休眠:

List<Employee> empList = 
      getHibernateTemplate() 
      .findByNamedParam("from Employee emp where emp.Id=:empId","empId",employeeId); 


     Iterator<Employee> empIter = empList .iterator(); 

     while(empIter.hasNext()) { 
      Employee empTran = empIter.next(); 
      getHibernateTemplate().delete("Employee", empTran); 

SQL:

delete from Employee where Id = employeeId"; 

這兩個之間將得到的結果更快? Hibernate查詢可以進一步調整嗎?

(請忽略語法錯誤如果有的話)

+0

我想你是通過主鍵刪除?如果是,那麼你爲什麼使用列表? – kingpin 2012-02-23 13:08:30

+0

No. Id不是主鍵 – Chillax 2012-02-23 13:13:04

+0

請注意,因爲SQL語句不會從第一級和第二級緩存中刪除條目!您最終可能會遇到數據不一致的情況。 – 2012-02-23 14:04:43

回答

2

第二個絕對會是一個顯著差異快,因爲在第一個執行一個查詢每刪除,但在第二隻發送一個查詢和你的DBMS處理剩下的事情。

您可以通過Hibernate,HSQL執行第二個。

編輯: 順便說一句,如果你運行你的「DELETE FROM」查詢每一個ID將是緩慢的,幾乎是第一個,但你不會迭代整個員工記錄,這是更好的:) 使用SQL的IN()操作

"delete from Employee where Id IN(3,5,8,...);" 
"delete from Employee where Id IN(SELECT Id FROM table...);" 

儘量減少你的SQL查詢執行,如果你還不滿意的表現後,嘗試以改善由提高查詢本身,而不是編程部分的性能。

+0

謝謝。你認爲使用HSQL執行第二個比使用SQL更好嗎? – Chillax 2012-02-23 13:12:03

+1

通過Hibernate或JDBC執行該查詢語句實際上並沒有帶來實際的區別。唯一的區別是Hibernate可能會慢1-2毫秒,因爲它也解析查詢本身,然後將查詢發送到JDBC,所以這是多一層和多個函數調用。但它是值得的,而且它是不變的,這意味着無論您是刪除1條記錄還是1條100萬條記錄,其中包含10條記錄的集合/表格或10億條記錄,但時間不會改變,但只有您的DBMS進行刪除的時間將會減少更改。你也應該讓你的ID主鍵,這是非常重要的。 – 2012-02-23 13:26:41

+0

謝謝。這對我幫助很大。將在HSQL中實現它。不能讓它成爲主鍵。你沒有一百萬條記錄和相同的主鍵!其實我有另一個主鍵。不管怎麼說,十億感謝 – Chillax 2012-02-23 13:32:48