次のUPDATE
クエリがあります。
UPDATE Indexer.Pages SET LastError=NULL where LastError is not null;
現在、このクエリが完了するまでに約 93 分かかります。これをもう少し速くする方法を見つけたいと思います。
Indexer.Pages
テーブルには約 506,000 行あり、そのうち約 490,000 行に の値が含まれているため、LastError
ここでインデックスを利用できるとは思えません。
テーブル (非圧縮時) には約 46 GB のデータがありますが、そのデータの大部分は というテキスト フィールドにありますhtml
。多くのページをロードおよびアンロードするだけで、速度が低下していると思います。1 つのアイデアは、とフィールドだけで新しいテーブルを作成し、できるだけ小さく保つことです。ただし、テーブルのコピーを作成するためのハード ディスク領域が実際にはないため、この理論をテストするのはかなりの作業量になります。それを別のマシンにコピーし、テーブルをドロップしてから、データをコピーして戻す必要があり、おそらく一晩中かかります。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 )
);
また、2 つのインデックスがあります。
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 制約を持つ別のテーブルが 1 つありますPages.PageId
。