Ho la seguente UPDATE
query:come accelerare una query UPDATE lento
UPDATE Indexer.Pages SET LastError=NULL where LastError is not null;
In questo momento, questa query richiede circa 93 minuti per completare. Mi piacerebbe trovare dei modi per rendere questo un po 'più veloce.
La tabella Indexer.Pages
ha circa 506.000 righe, e circa 490.000 di essi contengono un valore per LastError
, quindi dubito posso approfittare di tutti gli indici qui.
La tabella (quando non compressa) contiene circa 46 date di dati, tuttavia la maggior parte di tali dati si trova in un campo di testo denominato html
. Credo che semplicemente il caricamento e lo scaricamento di molte pagine stiano causando il rallentamento. Un'idea sarebbe quella di creare un nuovo tavolo con solo il Id
e il campo html
e mantenere Indexer.Pages
il più piccolo possibile. Tuttavia, testare questa teoria sarebbe una buona quantità di lavoro dal momento che in realtà non ho lo spazio su disco rigido per creare una copia del tavolo. Dovrei copiarlo su un'altra macchina, rilasciare la tabella, quindi copiare i dati che probabilmente richiederebbero tutta la sera.
Idee? Sto usando Postgres 9.0.0.
UPDATE:
Ecco lo schema:
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)
);
Ho anche due indici:
CREATE INDEX idx_indexer_pages_missingings
ON indexer.pages
USING btree
(missingings)
WHERE missingings > 0;
e
CREATE INDEX idx_indexer_pages_null
ON indexer.pages
USING btree
(recipeid)
WHERE NULL::boolean;
Non ci sono trigger su questa tabella e vi è un'altra tabella con un vincolo FK su Pages.PageId
.
L'aggiornamento di 500.000 righe non dovrebbe richiedere 93 minuti. Presumo che ci sia qualcosa di altro coinvolto. Puoi mostrarci la definizione del tavolo? Anche la copia di 500.000 righe dovrebbe essere eseguita in un paio di minuti (se non in secondi usando 'COPY') non la" serata intera ". –
A meno che l'html sia normalmente molto piccolo, verrà automaticamente memorizzato in una tabella TOAST separata dietro le quinte e non sarà significativo in questo aggiornamento. Eventuali trigger o definizioni di chiavi esterne potrebbero essere molto significative - ce ne sono? Esistono indici che fanno riferimento alla colonna LastError? Se è così, è probabile che sia un problema. Se è possibile organizzare l'aggiornamento in batch più piccoli (utilizzando intervalli di chiavi, ad esempio) e VACUUM tra un lotto e l'altro, si eviterà un aumento di volume della tabella. Infine, aggiorna: http://www.postgresql.org/support/versioning/ Una versione X.Y.0 non è un buon posto dove stare. – kgrittn
Pubblicherò più informazioni sullo schema più tardi oggi. Tuttavia, al momento posso dire che non ci sono trigger, e questo schema è stato progettato per gli inserimenti veloci, quindi non c'è molto in termini di indici. –