UPDATE无论我是否更改了列中的值,Hibernate都会生成包含所有列的语句,例如:
tx.begin();
Item i = em.find(Item.class, 12345);
i.setA("a-value");
tx.commit();
Run Code Online (Sandbox Code Playgroud)
发表此UPDATE声明:
update Item set A = $1, B = $2, C = $3, D = $4 where id = $5
Run Code Online (Sandbox Code Playgroud)
因此列B,C,D会更新,而我没有更改它们.
比如,项目经常更新,所有列都被编入索引.问题是:将Hibernate部分优化为这样的事情是否有意义:
tx.begin();
em.createQuery("update Item i set i.a = :a where i.id = :id")
.setParameter("a", "a-value")
.setParameter("id", 12345)
.executeUpdate();
tx.commit();
Run Code Online (Sandbox Code Playgroud)
最让我困惑的是,EXPLAIN"未经优化"和"优化"查询版本的计划完全相同!
假设我有一个主键列表,每行需要更新一个值.运行是否更好:
-- run 10,000 of these queries
UPDATE mytable SET myflag = 1 WHERE id = [each_id]
Run Code Online (Sandbox Code Playgroud)
或者将更新组合成批量查询,如下所示:
-- run 100 of these queries, where the IN () list contains about 100 elements
UPDATE mytable SET myflag = 1 WHERE id IN (3, 4, 5, 9, 99, ... 7887 )
Run Code Online (Sandbox Code Playgroud)
100个IN()项目的100个查询怎么样?