2009-03-31 4 views
5

Solo parlando con un mio collega. Stava camminando con un salto nel suo passo, sulla strada per la macchina del caffè.Qual è stata la migliore ottimizzazione SQL, su una query con prestazioni lente?

Gli ho chiesto "che cos'ha la" brulicante "passeggiata?", Ha detto, "Ho ridotto una query lunga due ore a 40 secondi! È davvero bello".

Ha modificato una procedura memorizzata, che utilizzava i cursori e ha introdotto una tabella temporanea, che è stata rifattorizzata dal set di dati originale. Lo manderò presto via e-mail per ottenere maggiori informazioni sull'effettiva implementazione.

Ma alla fine, stava ronzando.

La domanda è, quale SQL, che ti rimane in testa e ti ha fatto vibrare ottimizzando le query a bassa esecuzione?

+0

Mi piacerebbe vedere questa query lunga due ore. – RavB

risposta

1

Scusate, non tendo a ottenere un ronzio da quel genere di cose, ma la maggior parte delle situazioni sono state piuttosto elementari, monitorando le prestazioni delle query e aggiungendo indici per velocizzarle.

Ora aumentando la velocità del codice "reale" che ho scritto modificando le strutture di dati e gli algoritmi all'interno della classe, è lì che ottengo il mio ronzio (e la reputazione di un uomo di riferimento per le correzioni delle prestazioni sul lavoro).

+0

codice "reale" in contrapposizione a sql? Questo è cattivo. – Learning

+0

relativo al ronzio, sono d'accordo, quando lo fai da molto tempo, la sensazione diventa meno. – Ferdeen

+0

@Learning, non intendeva screditare SQL, è solo che è composto principalmente da query one-liner in cui l'ottimizzazione è abbastanza semplice. Le grandi basi di codice complicate ("reali") mi danno più un senso di realizzazione. – paxdiablo

1

hey su iPhone che utilizza SQLite, ho subito ridotto del tempo di elaborazione del database da 40 secondi a 2 secondi con l'uso di operazioni di scrittura esclusivi ... ero super felice facendo questo

in quanto questo è stato il mio la prima esperienza di SQL su un dispositivo incorporato - molto diversa dalle solite cose relative al server (indici, normalizzazioni, ecc. ecc.)

--- per quanto riguarda i server, gli indici sono una vera benedizione. Inoltre, se si prende un po 'di dolore e si eliminano più null possibile nel proprio tavolo, si sarebbe sorpresi con i guadagni in termini di prestazioni - non molti sviluppatori si concentrano sui valori null, di solito utilizzano indici e altre cose documentate

pochi altri modi meno sfruttati - utilizzando xml per elaborare più inserimenti/aggiornamenti/eliminazioni batch a 1 go invece di fare 1 inserto alla volta - in sql 2005 questo può essere super cool

6

Devo dire quando ho imparato come per creare e utilizzare indici coperti. Ora, CHE era un aumento di prestazioni.

+0

+1 se usati correttamente, possono offrire incredibili miglioramenti nelle prestazioni –

+0

Non sapevo di indici coperti - Ho appena letto un articolo su di loro e non vedo l'ora di provare la tecnica! (Sono il 'collega con il salto del mio passo' nella domanda originale di Ferds ;-)) –

+0

Sì, sono fantastici, basta stare attenti con i tavoli grandi perché possono diventare piuttosto enormi e fare più male che bene se usati impropriamente. Come tutte le prestazioni, è necessario testare un carico di lavoro rappresentativo prima e dopo. –

3

È sempre piacevole prendere una query mal scritta, carica di cursore ed eliminare i cursori, tagliare il codice della metà e migliorare le prestazioni in molti modi.

Alcuni dei migliori miglioramenti sono in chiarezza (e spesso danno buoni risultati anche in termini di prestazioni).

+0

Pensavo a un'altra domanda: quando i cursori sono utili? tutti sembrano ricattarli in qualcosa di più ottimale. – Ferdeen

+0

ha trovato questo http://stackoverflow.com/questions/287445/why-do-people-hate-sql-cursors-so-much – Ferdeen

5

utilizzando SQL di BULKIMPORT per ridurre diverse ore di codice INSERT ereditato a meno di un minuto.

1

Si tratta di indici. Ed evitando cose stupide che li rendono inutili.

+0

il problema è tra la tastiera e la sedia! – Sam

0

Bene, abbiamo avuto una cosa simile in cui avevamo una query lenta su un sito di Open Freeway.La risposta non era tanto ottimizzare la query, ma ottimizzare il server su cui si trovava. Abbiamo aumentato il limite della cache e la dimensione della cache in modo che il server non eseguisse la query così spesso.

Questo ha aumentato enormemente la velocità del sistema e alla fine ha reso il cliente felice! :)

Non proprio il calibro delle competenze di ottimizzazione dei post originali, ma sicuramente ci ha fatto divertire!

0

Suddivisione di una procedura memorizzata incredibilmente lunga, che ha comportato una grande quantità di "se è dopo le 17:00, restituisce questo bit di SQL" e che ha impiegato più di 20 secondi per essere eseguito in un insieme di stored procedure chiamate da uno sp controllante, e ha ottenuto i tempi fino alle risposte sottocondensate.

1

Modifica dell'ordine delle condizioni all'interno della clausola WHERE in modo da filtrare prima la condizione più discriminante (mentre allo stesso tempo vengono rimossi gli indici da colonne non discriminanti come il genere).

+0

Query Optimizer dovrebbe fare questo per voi .. su quale motore era acceso? – Brimstedt

+0

Che tipo di DBMS stai usando? Non dovresti aver bisogno di riordinare manualmente WHERE le condizioni se il tuo ottimizzatore sta facendo il suo lavoro correttamente. – LukeH

+1

MS SQL 2000. Ad ogni modo, non si vede come il motore possa ottimizzarlo. Se vuoi una valutazione shor-circuit di qualche espressione contenente AND, dovresti scrivere il codice che lo fa. Anche quando non è shor-circuiting, in che modo il server può sapere quale campo è più discriminatorio se i campi sono dello stesso tipo? – Dan

0

One Word, Dynamic Query

Se serching con un gran numero di parametri è possibile sconto dalla stringa SQL. Questo ha velocizzato le mie domande in modo drammatico e con facilità risolutiva.

Create PROCEDURE dbo.qryDynamic 
( 

@txtParameter1 nvarchar(255), 
@txtParameter2 nvarchar(255), 

AS 
SELECT  qry_DataFromAView.* 
FROM   qry_DataFromAView 
BEGIN 

    DECLARE @SQL nvarchar(2500) 
    DECLARE @txtJoin nvarchar(50) 

    Set @txtJoin = ' Where ' 

    SET @SQL = 'SELECT  qry_DataFromAView.* 
       FROM   qry_DataFromAView' 

    IF @txtParameter1 is not null 
    Begin 
     SET @[email protected] + @txtJoin + ' Field1 LIKE N''%'' + @dynParameter1 + N''%'') ' 
     Set @txtJoin = ' And ' 
    end 


    IF @txtParameter2 is not null 
    Begin 
     SET @[email protected] + @txtJoin + ' Field2 LIKE N''%'' + @dynParameter2 + N''%'') ' 
     Set @txtJoin = ' And ' 
    end 

    SET @[email protected] + ' ORDER BY Field2' 


    Exec sp_executesql @SQL, N'@dynParameter1 nvarchar(255), @dynParameter2 nvarchar(255)', @dynParameter1 = @txtParameter1 ,@dynParameter2 = @txtParameter2 

END 
GO 
1

Nel corso della giornata, ho lavorato su un sistema CICS/DB2, scritto in COBOL. Molte delle nostre query eseguivano scansioni complete della tabella (e lente) anche se avevamo tutti gli indici appropriati e le clausole WHERE.

Si è scoperto (e forse ho questo al contrario, sono passati 15 anni) che il problema era che stavamo usando PIC S9(n) COMP in WORKING STORAGE per i parametri di query, ma DB2 voluto PIC S9(n) COMP-3. Usando il tipo di dati errato, DB2 ha dovuto eseguire una scansione completa della tabella per convertire i valori nel database al valore che stavamo passando. Abbiamo cambiato le nostre definizioni delle variabili e le query erano in grado di utilizzare gli indici ora, il che in modo drammatico migliorato le nostre prestazioni.

0

ho avuto una luce calda dopo essere stato in grado di utilizzare una query Tab Croce di rottamare una gran quantità (termine tecnico) di lavorazione e le ricerche ...

Di solito è le cose semplici come l'aggiunta di indici o solo ottenere i dati necessari , ma quando trovi un problema che si adatta a una risposta che hai visto prima ... bei tempi!

0

(A metà strada di argomento)

ho riscritto una stored procedure 3000 linea in LINQ2SQL/C#. La stored procedure ha destreggiato un sacco di dati tra una serie di tabelle temporanee non indicizzate. La versione LINQ2SQL leggeva i dati in un paio di dizionari e ILookups e quindi ho unito i dati manualmente con un semplice vecchio codice C#.

La stored procedure ha richiesto circa 20 secondi e la versione LINQ2SQL/C# ha impiegato 0,2 secondi.

1

ho avuto una query che è stato originariamente scritto per SQL Server 6.5, che non supportano il codice SQL 92 join sintassi, cioè

select foo.baz 
from foo 
    left outer join bar 
    on foo.a = bar.a 

è stato invece scritto come

select foo.baz 
from foo, bar 
where foo.a *= bar.a 

L'interrogazione era stata in giro per un po 'e i dati rilevanti si sono accumulati per rendere la query eseguita troppo lentamente, con una durata di 90 secondi.Nel momento in cui questo problema si è verificato, abbiamo eseguito l'aggiornamento a SQL Server 7.

Dopo aver parlato con gli indici e altri egg-egging, ho modificato la sintassi del join per essere conforme a SQL 92. Il tempo di interrogazione è sceso a 3 secondi.

Non credo che avrò mai più quella sensazione. Ero un f% $^di eroe.

+0

SQL Server 6.5 supportava il join esterno sinistro. Come citato da Ron Soukup (responsabile del programma SQL Server): "Prima della versione 6.5, SQL Server aveva un supporto di outer-join limitato sotto forma di operatori speciali * = e = *. Molte persone hanno assunto la sintassi LEFT OUTER JOIN di SQL Server 6.5 è semplicemente un sinonimo di * =, ma non è questo il caso: LEFT OUTER JOIN è semanticamente diverso da e superiore a * =. " –

+0

Questo è un caso ragionevole per l'adozione della sintassi SQL-92. Finalmente! – Sam