Query pesante in timeout

giovedì 07 aprile 2011 - 17.15
Tag Elenco Tags  SQL Server 2008 R2

Gluck74 Profilo | Guru

Ciao a tutti, sono in difficoltà conuna query che, fino ad ora ha sempre funzionato, ma ultimamente, sarà per l'aumento dei dati, sarà per una piccola modifica che ho fatto, va perennemente in timeout bloccando tutto il sistema visto che è la query principale.

Vi spiego per capire il contesto:
è un software WEB CRM. Tutto si accentra sulla tabella dei contratti.
Questa tabella contiene i dati principali, mentre altre tabelle contengono dati che mano mano vengono registrati sul CRM.
Questo un piccolo schema:

707x565 38Kb

Come vedete la tabella Contratti ha una serie di tabelle collegate per specificare ad esempio gli stati, le offerte, ecc.
La tabella StoricoStatiContratti contiene tutto lo storico di movimentazione del contratto.
Inoltre, esiste un'altra tabella, o meglio una vista, che mostra dei dati aggiuntivi ai contratti che sono degli "esiti di lavorazione".

La mia necessità è reperire tutti i dati necessari a mostrare il contratto ed "accessori" in una griglia di ricerca e/o schermata riepilogativa.
questa l'attuali VISTA che sto utilizzando:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Come potete vedere è abbastanza complicata, ma in sostanza non fa altro che reperire le varie descirzioni per le tabelle di parametri, e poi aggiungere gli altri dati come esito, agente di vendita, agente di recupero ed altro.
Il problema è nato quando ho aggiunto, oltre all'agente di vendita, anche l'agente di recupero in queto pezzo:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

da interfaccia, faccio semplicemente:
select * from V_PV_DatiContratto
e in 13 secondi mi tira fuori 48.000 record, il che sarebe accettabile.
Il problema è quando aggiungo la where in base ai filtri dell'utente. Diventa lentissima e l'interfaccia va naturalmente in timeout.
Come posso risolvere?

Grazie


____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

speedx Profilo | Junior Member

il problema può è che la where che crea il tuo utente va su campi nei quali non hai indici
//// Marcello C.

Gluck74 Profilo | Guru

in verità gli indici ci sono. Non in tutte le colonne, ma ci sono.
Fino a pochi giorni fa tutto andava bene e veloce, da qualche giorno, anche prima della modirica, si è rallentato drasticamente. Con la modifica poi va proprio in timeout

____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

speedx Profilo | Junior Member

Allora fai un update statistic sulle tabelle in questione.
//// Marcello C.

alx_81 Profilo | Guru

>in verità gli indici ci sono. Non in tutte le colonne, ma ci
>sono.
>Fino a pochi giorni fa tutto andava bene e veloce, da qualche
>giorno, anche prima della modirica, si è rallentato drasticamente.
>Con la modifica poi va proprio in timeout
ciao, dovresti provare a postare la create delle tabelle (e degli indici) per avere un aiuto concreto.
Se riuscissi ad estrapolare anche qualche dato sarebbe il top.
Questo perchè bisognerebbe fare un bel tuning della query, vedere il piano di esecuzione della "select" in questione e capire dove perdi tempo.
Il fatto che ci sono indici non implica che si usino effettivamente e che si usino bene.
Se l'aggiornamento delle statistiche non risolve il problema (se vuoi prova anche la rebuild degli indici) ti consiglio di farci entrare di più nel dettaglio.
Su che macchina gira poi questa query? a me sembrano tanti anche i 13 secondi..

--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

Gluck74 Profilo | Guru

Ciao, ti allego gli script di creazione del database con le tabelle e i dati in questione (solo una piccola parte dei dati)
Spero che ti possa servire.

inoltre ho scoperto un'altra cosa:
in verità da database, una volta ricreati gli indici, la velocità è tornata accettabile (nel senso che ti do ragione che 13 secondi sono molti per questa mole di dati)

Quello che va in timeout è il codice poiché fa qualche chiamata in sequenza sotto transazione, e probabilmente c'è qualche lock.
Quello che non capisco è perché tutto ad un tratto succede questo se il codice non è cambiato?


UP:
dimenticavo, le query in questione sono:
la vista V_PV_DatiContratti_Esito
la funzioine F_PV_DatiContratti_Esito

____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

alx_81 Profilo | Guru

>Ciao, ti allego gli script di creazione del database con le tabelle
>e i dati in questione (solo una piccola parte dei dati)
>Spero che ti possa servire.
le foreign key non vengono scriptate, ma queste possiamo anche tralasciarle. Non servono alla nostra analisi.
Invece non riesco a creare né le funzioni, né le viste, né le stored procedure.
Ecco gli oggetti che mancano e gli errori, senza quelli non riesco a proseguire:

Msg 208, Level 16, State 1, Procedure F_PV_DatiContratti_Esito, Line 184
Invalid object name 'V_RPT_ESITI_TOTALE'.
Msg 208, Level 16, State 1, Procedure V_PV_DatiContratto, Line 20
Invalid object name 'dbo.V_PV_Tipologia'.
Msg 208, Level 16, State 1, Procedure V_PV_DatiContratti_Esito, Line 174
Invalid object name 'V_RPT_ESITI_TOTALE'.
Msg 208, Level 16, State 1, Procedure V_PV_DatiContrattoInseritoAgente, Line 12
Invalid object name 'dbo.Us_ID'.
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

Gluck74 Profilo | Guru

Ciao Ale, ti ringrazio per la tua disponibilità.
Il database è molto articolato, sicuramente nel tentativo di evitare di mandarti tutto il DB, mi sono perso qualche pezzo.

Attualmente ho risolto il problema apportando alcune modifiche al codice. Inoltre una persona si sta dedicando a ritrutturare tutte le query e le viste nel DB.

Ti ringrazio comunque.
Ciao

____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

alx_81 Profilo | Guru

>Ciao Ale, ti ringrazio per la tua disponibilità.
>Il database è molto articolato, sicuramente nel tentativo di
>evitare di mandarti tutto il DB, mi sono perso qualche pezzo.
>
>Attualmente ho risolto il problema apportando alcune modifiche
>al codice. Inoltre una persona si sta dedicando a ritrutturare
>tutte le query e le viste nel DB.
>
>Ti ringrazio comunque.
meglio così, essere seguiti sul posto fa sempre bene. Perdonami per il ritardo nella risposta, ma sono in consegna

--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
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-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5