2012-02-23 90 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