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