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.

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top