L'aggiornamento lento di SQL potrebbe essere di aiuto
-
07-07-2019 - |
Domanda
Un mio ex collega ha scritto il seguente AGGIORNAMENTO
come parte di uno script di importazione dei dati e ci vogliono quasi 15 minuti per completarlo su una tabella di 92k righe.
UPDATE table
SET name = (
SELECT TOP 1 old_name FROM (
SELECT
SUM(r) rev,
number,
name,
intermediate_number,
intermediate_name,
old_number,
old_name
FROM table
GROUP BY
number,
name,
intermediate_number,
intermediate_name,
old_number,
old_name
) t
WHERE t.name = table.name
ORDER BY rev DESC
);
Sono sicuro che può essere riscritto per essere più efficiente, ma tutti i miei tentativi sono falliti o non hanno prodotto gli stessi risultati.
Inoltre, nessun indice è definito nella tabella. Suggerimenti apprezzati. Sono su Sybase iAnywhere 11 se questo è importante.
Soluzione
Metti un indice su old_Name e guarda quanto tempo impiega ...
Secondo, nell'analizzare la tua query, sembra che ci possa essere un difetto. se guardi la versione riformattata di seguito,
UPDATE table SET
name = (SELECT TOP 1 old_name
FROM (SELECT SUM(r) rev, number, name,
intermediate_number, intermediate_name,
old_number, old_name
FROM table
GROUP BY number, name, intermediate_number,
intermediate_name, old_number, old_name) t
WHERE t.old_name = table.old_name -- HERE
ORDER BY rev DESC);
La penultima riga DOVE t.old_name = table.old_name farà sì che la sottoquery interna abbia solo righe con t.oldname = al valore dell'esterno query table.old_name. Quindi, non importa se fai uno dei primi 1 o meno, poiché tutte le righe avranno lo stesso valore per old_name, imposterai sempre il valore esattamente su quello che è già, no ??
EDIT: (basato sulla modifica della clausola Where) prova questo:
UPDATE table SET
name = (SELECT Top 1 old_name
FROM table it
Where it.name = table.old_name
GROUP BY number, intermediate_number,
intermediate_name, old_number, old_name
Order By SUM(r) Desc);
Altri suggerimenti
Non sono una persona Sybase, tuttavia lo farei nel modo seguente.
Pseudo Sql Questo dovrebbe eliminare il tuo SELECT ricorsivo