Tempo di esecuzione lunghissimiiiiiiii, come mai ?

lunedì 19 gennaio 2009 - 16.05

stuzzo Profilo | Junior Member

Ciao a tutti!
Vi chiedo di darmi un consiglio....
Sto lavorando ad una stored procedure un po' laboriosa che impiegava moltissimo tempo nell'esecuzione...allora con buona calma ho cominciato ad apportare alcune modifiche, tipo farmi restituire solo le colonne che mi servono, eliminare la union all e utilizzare la union, eliminare un join inutile, ecc.., ecc....
In locale i risultati sono stati eccellenti, adesso impiega appena 1 secondo, mentre prima eravamo nell'ordine dei 15-20 secondi....benissimo ho detto.
Ho postato le migliorie sul server che gestisce l'applicazione online e adesso la query impiega sempre intorno ai 25 secondi, ho controllato bene ed è proprio la stored procedure che impiega tanto tempo.
Secondo voi, da cosa può dipendere??
L'unica differenza che ho tra locale e online e che online ci sono quasi 155000 entries nelle tabella più grande, meno della metà in locale, ma non penso che tutto questo ritardo sia conseguenza della mole di dati...Ah una cosa ancora più particolare è che ho provato ad utilizzare il Query Analiser sul server online e addirittura impiega il doppio del tempo se provassi a lanciare l'applicazione.

Vi ringrazio di tutto.
Ciao
Alfredo Aiello

ma_di Profilo | Junior Member

Ciao,
sicuramente nel forum ci sono persone più esperte di me; ovviamente bisognerebbe saperne un po' di più della stored di cui parli.
Hai verificato la memoria? Noti swap molto lunghi? Memoria virtuale?
Ciao.

Dainesi Profilo | Senior Member

Così su due piedi è difficile fare una diagnosi. I problemi potrebbero risiedere nell'assenza (o scarsità) di indici nelle tabelle interessate. In un uso non ottimizzato delle clausole where così come in ridondanze nelle join.

Se vuoi posta qualche stralcio e vediamo.
Autore del libro sul FOREX, MetaTrader e creazione dei trading system http://ilmiolibro.kataweb.it/schedalibro.asp?id=115872

lbenaglia Profilo | Guru

>Sto lavorando ad una stored procedure un po' laboriosa che impiegava
>moltissimo tempo nell'esecuzione...allora con buona calma ho
>cominciato ad apportare alcune modifiche, tipo farmi restituire
>solo le colonne che mi servono, eliminare la union all e utilizzare
>la union, eliminare un join inutile, ecc.., ecc....

Ciao Alfredo,

UNION ALL è più efficiente rispetto a UNION dato che il query optimizer non deve eliminare i doppioni

>Secondo voi, da cosa può dipendere??
Sicuramente dai piani di esecuzione differenti.
Senza alcun esempio che riproduca l'anomalia non capire cosa sta succedendo

>Ah una cosa ancora più particolare è che
>ho provato ad utilizzare il Query Analiser sul server online
>e addirittura impiega il doppio del tempo se provassi a lanciare
>l'applicazione.


>Vi ringrazio di tutto.
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

stuzzo Profilo | Junior Member

Ehi, grazie a tutti per i consigli....Comunque ho eliminato la union all, ma il problema resta sempre. Penso che il problema sia dovuto dal gran volume di dati. In questi casi è meglio indicizzare la tabella ? Io sono completamente ignorante in materia di indicizzazioni, mi sapete dire come fare o da dove cominciare a guardare ?

Grazie!
Alfredo Aiello

lbenaglia Profilo | Guru

>Comunque ho eliminato la union all, ma il problema resta sempre.
Infatti ti ho scritto che UNION ALL è più performante di UNION
Fai il bravo, rimetti la keyword ALL se non ti importa di ottenere eventuali valori duplicati.

>Penso che il problema sia dovuto dal gran volume di dati. In questi casi è meglio indicizzare
>la tabella ?
Ah beh, se non hai definito alcun indice il problema è molto probabilmente questo.

Io sono completamente ignorante in materia di indicizzazioni,
>mi sapete dire come fare o da dove cominciare a guardare ?
Che DBMS utilizzi?
Nel caso di SQL Server trovi tutte le informazioni che cerchi sui Books Online.

>Grazie!
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

Dainesi Profilo | Senior Member

> In questi casi è meglio indicizzare la tabella ? >

Gosh! Certo che si! Se non crei degli indici il povero motore del DB dovrà passare in rassegna ogni record per estrarre i valori: un lavoraccio lunghissimo!!

Se invece crei degli indici si creeranno delle tabelle di servizio conteneti i soli valori indicizzati, o meglio una tabella di puntatori ai record indicizzati. Insomma è come consultare un elenco telefonico: se è in ordine alfabetico trovi subito il nominativo che cerchi, se invece è alla rinfusa ..... fai tempo a far la "muffa" !!



.

Autore del libro sul FOREX, MetaTrader e creazione dei trading system http://ilmiolibro.kataweb.it/schedalibro.asp?id=115872

stuzzo Profilo | Junior Member

Scusa Lorenzo,
cioè volevo far intendere che ho eliminato il fatto di gestire i doppioni.
Si, uso Sql Server 2005.
Ok, comincio a farmi un giro online, se avete qualche bel link da passarmi è sempre ben accetto :) !
Grazie di nuovo a tutti ! !

Alfredo Aiello

stuzzo Profilo | Junior Member

Ho cominciato a farmi un giro e ho visto come creare un indice clustered e non-clustered.
Ho letto la differenza tra i due, siccome la mia query restituisce i dati attraverso una order by, mi confermate che sia più indicato usare un clustered index?

:) thanks!
Alfredo Aiello

lbenaglia Profilo | Guru

>Ho letto la differenza tra i due, siccome la mia query restituisce
>i dati attraverso una order by, mi confermate che sia più indicato
>usare un clustered index?
Si, sulle colonne specificate nella clausola ORDER BY.
Ad ogni modo non è detto che la query necessiti di altri indici non clustered, ma questo puoi saperlo solo tu.

>:) thanks!
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

stuzzo Profilo | Junior Member

Scusa sto riscontrando un problema che mi dice sempre "Non è consentito eseguire un'istruzione esplicita DROP INDEX per l'indice 'Annuncio.PK_Annuncio'. È in uso per l'applicazione di un vincolo PRIMARY KEY".
Come faccio ad eliminarlo? ne vorrei creare uno sulla colonna che sta nell'order by.

Grazie
Alfredo Aiello

lbenaglia Profilo | Guru

>Scusa sto riscontrando un problema che mi dice sempre "Non è
>consentito eseguire un'istruzione esplicita DROP INDEX per l'indice
>'Annuncio.PK_Annuncio'. È in uso per l'applicazione di un vincolo
>PRIMARY KEY".
>Come faccio ad eliminarlo?
Devi eliminare il constraint di PRIMARY KEY eliminando in questo modo anche l'indice creato automaticamente per garantire la univocità della PK:

ALTER TABLE <schema>.<tabella> DROP CONSTRAINT <nome primary key>;

Se non conosci il nome della PK puoi scoprirlo interrogando la catalog view sys.objects:

SELECT name FROM sys.objects WHERE [type] = 'PK' AND parent_object_id = OBJECT_ID('<schema>.<tabella>');

>Grazie
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

stuzzo Profilo | Junior Member

>Devi eliminare il constraint di PRIMARY KEY eliminando in questo
>modo anche l'indice creato automaticamente per garantire la univocità
>della PK:

>ALTER TABLE <schema>.<tabella> DROP CONSTRAINT <nome
>primary key>;

Scusami, ma devo eliminare il vincolo di chiave primaria ????? Non crea un po' di problemi questa cosa ? Oppure devo cancellare il vincolo, creo l'indice sulla colonna desiderata e poi reimposto il vincolo?

>Se non conosci il nome della PK puoi scoprirlo interrogando la
>catalog view sys.objects:
>
>SELECT name
>FROM sys.objects
>WHERE [type] = 'PK'
>AND parent_object_id = OBJECT_ID('<schema>.<tabella>');
>
OK

>Ciao!
Ciao
Alfredo Aiello

lbenaglia Profilo | Guru

>Scusami, ma devo eliminare il vincolo di chiave primaria ?????
Se vuoi eliminare l'indice clustered sottostante, si.

>Non crea un po' di problemi questa cosa ?
No. subito dopo aver eliminato la PK provvederai a ricrearla come NONCLUSTERED.

>Oppure devo cancellare
>il vincolo, creo l'indice sulla colonna desiderata e poi reimposto
>il vincolo?
No, la creazione del vincolo di PK NONCLUSTERED provvederà automaticamente a creare un nuovo indice non clustered.
Successivamente potrai creare l'indice clustered dove meglio credi

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

stuzzo Profilo | Junior Member

Ciao,
ovviamente non mi permette di modificare la tabella, l'errore che viene restituito dice che non è possibile cancellare il vincolo, visto che viene utilizzato da altre tabelle per referenziarsi alla tabella in questione.
Adesso provo a creare un indice non-clustered sulla colonna presente nell'order by e vedo cosa succede.
- Ma siccome la clausola dell'order by prevede il DESC, mica implica qualcosa nella creazione dell'indice? Oppure mi comporto normalmente ?

Grazie
Ciao
Alfredo Aiello

lbenaglia Profilo | Guru

>Ciao,
>ovviamente non mi permette di modificare la tabella, l'errore
>che viene restituito dice che non è possibile cancellare il vincolo,
>visto che viene utilizzato da altre tabelle per referenziarsi
>alla tabella in questione.
Eh, rimuovi prima i constraint di FOREIGN KEY dalle tabelle referenzianti, elimina la PK, ricreala NON CLUSTERED e ridefinisci i constraint di FK.

>Adesso provo a creare un indice non-clustered sulla colonna presente
>nell'order by e vedo cosa succede.
Non credo ti possa tornare utile, a meno di scrivere una covered query, ovvero una query che restituisce SOLO le colonne coperte dall'indice non clustered.

>- Ma siccome la clausola dell'order by prevede il DESC, mica
>implica qualcosa nella creazione dell'indice? Oppure mi comporto
>normalmente ?
Lascia perdere e segui il primo consiglio...

>Grazie
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

stuzzo Profilo | Junior Member

>Eh, rimuovi prima i constraint di FOREIGN KEY dalle tabelle referenzianti,
>elimina la PK, ricreala NON CLUSTERED e ridefinisci i constraint
>di FK.

Ok, c'è un modo per sapere quante e quali tabelle si referenziano a quella colonna o primarykey?

Alfredo Aiello

lbenaglia Profilo | Guru

>Ok, c'è un modo per sapere quante e quali tabelle si referenziano
>a quella colonna o primarykey?

Puoi interrogare la funzione sys.dm_sql_referenced_entities:
http://msdn.microsoft.com/en-us/library/bb677185.aspx

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5