Tengo el siguiente UPDATE
consulta:Cómo acelerar una consulta UPDATE lenta
UPDATE Indexer.Pages SET LastError=NULL where LastError is not null;
En este momento, esta consulta se lleva unos 93 minutos para completar. Me gustaría encontrar formas de hacer esto un poco más rápido.
La tabla Indexer.Pages
tiene alrededor de 506,000 filas, y alrededor de 490,000 de ellas contienen un valor de LastError
, por lo que dudo que pueda aprovechar los índices aquí.
La tabla (cuando se descomprime) tiene alrededor de 46 gigas de datos, sin embargo, la mayoría de esos datos se encuentra en un campo de texto llamado html
. Creo que simplemente cargar y descargar tantas páginas está causando la desaceleración. Una idea sería crear una nueva tabla con solo el campo Id
y html
, y mantener Indexer.Pages
lo más pequeño posible. Sin embargo, probar esta teoría sería una buena cantidad de trabajo ya que en realidad no tengo espacio en el disco duro para crear una copia de la tabla. Tendría que copiarlo en otra máquina, dejar caer la mesa y luego copiar los datos nuevamente, lo que probablemente demore toda la noche.
Ideas? Estoy usando Postgres 9.0.0.
ACTUALIZACIÓN:
He aquí el esquema:
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)
);
También tengo dos índices:
CREATE INDEX idx_indexer_pages_missingings
ON indexer.pages
USING btree
(missingings)
WHERE missingings > 0;
y
CREATE INDEX idx_indexer_pages_null
ON indexer.pages
USING btree
(recipeid)
WHERE NULL::boolean;
No hay disparadores en esta tabla, y hay otra tabla que tiene una restricción FK en Pages.PageId
.
La actualización de 500,000 filas no debería tomar 93 minutos en primer lugar. Supongo que hay algo más involucrado. ¿Puedes mostrarnos la definición de la tabla? También se deben copiar 500,000 filas en un par de minutos (si no en segundos usando 'COPY') y no en" toda la tarde ". –
A menos que el html sea normalmente muy pequeño, se almacenará automáticamente en una tabla TOSTADA separada detrás de las escenas y no será significativo en esta actualización. Cualquier desencadenante o definición de clave externa podría ser muy significativo, ¿hay alguno? ¿Hay algún índice que haga referencia a la columna LastError? Si es así, es probable que sean un problema. Si puede organizar la actualización en lotes más pequeños (utilizando rangos de teclas, por ejemplo) y VACÍO entre lotes, evitará la saturación de la tabla. Finalmente, actualice: http://www.postgresql.org/support/versioning/ Una versión X.Y.0 no es un buen lugar para estar. – kgrittn
Voy a publicar más información de esquema más adelante hoy. Sin embargo, en este momento puedo decir que no hay factores desencadenantes, y este esquema fue diseñado para inserciones rápidas, por lo que no hay mucho en el camino de los índices. –