相关疑难解决方法(0)

更新语句中的冗余数据

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"未经优化"和"优化"查询版本的计划完全相同!

postgresql hibernate jpa sql-execution-plan

7
推荐指数
1
解决办法
4614
查看次数

每次更新一行时运行10,000个查询会更快,或者每次更新100行会运行100个查询吗?

假设我有一个主键列表,每行需要更新一个值.运行是否更好:

-- 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个查询怎么样?

mysql postgresql performance sql-update

3
推荐指数
1
解决办法
3126
查看次数