2014-12-27 13 views
6

C'è un modo per capire quando una query SQL sarà fine dopo l'avvio? In altre parole, esiste un modo per capire quanto tempo impiegherà una query prima dell'esecuzione della query? (ruvida stima è bene!)Come capire quando finirà una query SQL?

ALTER IGNORE TABLE mytbl ADD UNIQUE (c); 

mi sono imbattuto questa query sulla tabella InnoDB che ha 35 milioni di dischi. c è varchar (255)

Questo comando è in esecuzione da 10 ore ed è ancora in esecuzione. Non voglio cancellare se sono vicino alla fine.

Apprezzo qualsiasi aiuto. Grazie!

+0

http://dev.mysql.com/doc/refman/5.6/en/show-processlist.html –

+1

@ ÁlvaroG.Vicario Mi mostra la durata dall'avvio della query. La mia domanda è completamente diversa. Non capisco perché lo menzioni? – mmswe

+1

No.Non c'è modo di vederlo, perché il tempo di esecuzione della query dipende da molti altri fattori oltre a mysql stesso (come risorse della CPU gratuite, RAM gratuita, ecc.). – bksi

risposta

4

Estratto dalla soluzione ServerFault:

La soluzione era di misurare la velocità della query scansione righe nella scansione di tabella della tabella fatto. Questo è mostrato dalla variabile di stato Handler_read_rnd_next. Ecco un modo semplice per guardarlo (innotop è un altro modo utile):

mysqladmin extended -r -i 10 | grep Handler_read_rnd_next 
-- ignore the first line of output... 
| Handler_read_rnd_next    | 429224  | 

Quindi il server stava leggendo circa 43K righe al secondo, e ci sono stati 150 milioni di righe della tabella. Un po 'di matematica più tardi, e ottieni 3488 secondi per il completamento, o poco meno di un'ora. E infatti la query è stata completata in circa 55 minuti.

+0

è più vicino a 430K righe al secondo, non 43K. –

+1

'-i 10' fornisce un aggiornamento ogni 10 secondi. Quindi è 430k per 10 secondi o 43k al secondo. – jkgeyti

3

Il grosso problema qui è che il fattore più importante (di gran lunga) nel determinare quanto tempo richiederà una query è il che non fa nulla con la query stessa. Piuttosto, il più grande fattore nel determinare la risposta è il carico collocato sul database mentre la query è in esecuzione, specialmente includendo il carico da altre query. Per query complesse su sistemi attivi, questo carico può anche cambiare significativamente nel corso della query.

Quello che puoi fare è ottenere un piano di esecuzione per la tua query, usando la parola chiave EXPLAIN. È possibile utilizzare questo per ottenere un'idea relativa, a parità di tutti gli altri, per quanto potrebbe costare una determinata query. Anche qui, però, MySql non lo rende facile, in quanto non ti darà solo un buon costo del piano o numeri di tempi di esecuzione che puoi utilizzare, come fa SQL Server. È necessario dedurre quei numeri in base alle righe e alle letture del disco.

Anche in questo caso, anche se si genera un costo stimato e quindi si esegue la query, è possibile ottenere risultati in un tempo notevolmente più lungo o più breve del previsto poiché il carico cambia sul server dopo la creazione del preventivo e l'esecuzione della query .


In questo caso, dopo 10 ore, suona come si potrebbe avere un/problema di blocco di blocco. Se hai un'altra query attiva (probabilmente di lunga durata o ricorrente) che utilizza questa tabella, prova a eliminarla e ci sono buone probabilità che la tua query termini naturalmente pochi minuti dopo.

1

Utilizzare dabatabase di prova, set di dati più piccolo.
Questo produrrà una stima molto approssimativa. Ma credo che nel tuo caso il tempo sarà non lineare es: esponenziale. Forse puoi rielaborare il comando in modo da avere garantito un unico c.