У меня есть следующий UPDATE
запроса:Как ускорить медленный UPDATE запрос
UPDATE Indexer.Pages SET LastError=NULL where LastError is not null;
Сейчас этот запрос занимает около 93 минут. Я хотел бы найти способы сделать это немного быстрее.
Таблица Indexer.Pages
имеет около 506 000 строк, и около 490 000 из них содержат значение для LastError
, поэтому я сомневаюсь, что я могу использовать любые индексы здесь.
Таблица (при несжатом состоянии) содержит около 46 гигабайт данных, однако большинство этих данных находится в текстовом поле html
. Я считаю, что просто загрузка и разгрузка приводит к замедлению многих страниц. Одна из идей заключалась бы в том, чтобы создать новый стол с толькоId
и поле html
, и держать Indexer.Pages
как можно меньше. Однако тестирование этой теории было бы достойной работой, поскольку на самом деле у меня нет места на жестком диске для создания копии таблицы. Мне пришлось бы скопировать его на другую машину, вынуть таблицу, а затем скопировать данные, которые, вероятно, будут проходить весь вечер.
Идеи? Я использую Postgres 9.0.0.
UPDATE:
Вот схема:
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
.
Обновление 500 000 строк не должно занять 93 минуты. Я предполагаю, что есть что-то другое. Можете ли вы показать нам определение таблицы? Также копирование 500 000 строк должно выполняться через пару минут (если не секунды, используя 'COPY'), а не« весь вечер ». –
Если html обычно невелик, он автоматически будет храниться в отдельной таблице TOAST за кулисами и не будет значительным в этом обновлении. Любые триггеры или определения внешнего ключа могут быть очень значительными - есть ли какие-либо? Существуют ли какие-либо индексы, которые ссылаются на столбец LastError? Если это так, они, вероятно, будут проблемой. Если вы можете организовать обновление в меньших партиях (например, диапазонов клавиш, например) и VACUUM между партиями, вы избежите раздувания таблицы. Наконец, обновите: http://www.postgresql.org/support/versioning/. Выпуск X.Y.0 не является хорошим местом. – kgrittn
Опубликовать более подробную информацию о схемах позже. Однако сейчас я могу сказать, что триггеров нет, и эта схема была разработана для быстрых вставок, поэтому индексов не так много. –