相关疑难解决方法(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
查看次数

如何加快缓慢的UPDATE查询

我有以下UPDATE查询:

UPDATE Indexer.Pages SET LastError=NULL where LastError is not null;
Run Code Online (Sandbox Code Playgroud)

现在,此查询大约需要93分钟才能完成.我想找到方法让它更快一些.

Indexer.Pages表有大约506,000行,其中约490,000行包含值LastError,所以我怀疑我可以利用这里的任何索引.

该表(未压缩时)中包含大约46个数据,但大多数数据都在一个名为的文本字段中html.我相信只需加载和卸载那么多页面就会导致速度减慢.一个想法是做一个新表只是Idhtml现场,并保持Indexer.Pages尽可能小.但是,测试这个理论将是一项相当大的工作,因为我实际上没有硬盘空间来创建表的副本.我必须将它复制到另一台机器上,放下桌子,然后将数据复制回来,这可能需要整晚.

想法?我正在使用Postgres 9.0.0.

更新:

这是架构:

CREATE TABLE indexer.pages
(
  id uuid NOT NULL,
  url character varying(1024) NOT NULL,
  firstcrawled timestamp with time zone NOT NULL,
  lastcrawled timestamp with time zone NOT NULL,
  recipeid uuid,
  html text NOT NULL,
  lasterror character varying(1024),
  missingings smallint,
  CONSTRAINT pages_pkey PRIMARY KEY (id ),
  CONSTRAINT indexer_pages_uniqueurl UNIQUE …
Run Code Online (Sandbox Code Playgroud)

sql postgresql

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

标签 统计

postgresql ×2

hibernate ×1

jpa ×1

sql ×1

sql-execution-plan ×1