我有以下UPDATE
查询:
UPDATE Indexer.Pages SET LastError=NULL where LastError is not null;
目前,此查询大约需要 93 分钟才能完成。我想找到让这更快一点的方法。
该Indexer.Pages
表有大约 506,000 行,其中大约 490,000 行包含 的值LastError
,所以我怀疑我可以利用这里的任何索引。
该表(未压缩时)包含大约 46 gigs 的数据,但大部分数据位于名为html
. 我相信简单地加载和卸载这么多页面会导致速度变慢。一个想法是创建一个只有Id
和字段的新表html
,并保持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 (url )
);
我也有两个索引:
CREATE INDEX idx_indexer_pages_missingings
ON indexer.pages
USING btree
(missingings )
WHERE missingings > 0;
和
CREATE INDEX idx_indexer_pages_null
ON indexer.pages
USING btree
(recipeid )
WHERE NULL::boolean;
此表上没有触发器,并且还有另一个表具有 FK 约束Pages.PageId
。