Timeout durante una stored

mercoledì 09 luglio 2008 - 09.56

trinity Profilo | Guru

Buongiorno,
a volte quando eseguo una stored da vb mi esce questo messaggio:

Timeout. Il tempo disponibile è scaduto prima del completamento dell'operazione o il server non risponde.
L'istruzione è stata interrotta.

da cosa dipende? e poi come posso risolverlo?

alla fine la stored che eseguo da vb è la seguente:

ALTER PROCEDURE [dbo].[DelChiusure] ( @anno Int, @mese Int, @data Smalldatetime, @data1 SmallDateTime ) AS BEGIN Delete From chiusure Where anno=@anno and mese=@mese Delete From Archivio_mov Where data_elaborazione BetWeen dbo.GetFirstNextMonthDay(@data) And dbo.GetLastDateOfMounth(dbo.GetFirstNextMonthDay(@data)) And Flagriporto='1' END

su una tabella di dati che è i continuo aumento ma la prova la sto facendo su circa 71000 record...l'unica cosa che vi è la Pk composta da varie colonne tra cui una colonna progschedina che è di tipo BigInt ed Identity..Ma non penso che questo sia il problema

Oppure potrebbe essere il mio pc?


Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

lbenaglia Profilo | Guru

>a volte quando eseguo una stored da vb mi esce questo messaggio:
>
>Timeout. Il tempo disponibile è scaduto prima del completamento
>dell'operazione o il server non risponde.
>L'istruzione è stata interrotta.
>
>da cosa dipende? e poi come posso risolverlo?

Ciao Fabio,

semplice, l'esecuzione della sp impiega troppo tempo, quindi viene "cassata" lato client.
Di default il command timeout è di 30 secondi, ma puoi modificarlo agento sull'omonima proprietà.

Ad ogni modo ti consiglio di analizzare il piano di esecuzione delle query della sp, in modo da intervenire per risolvere alla radice il problema di performance (ad esempio creando o ricostruendo uno o più indici).

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

Brainkiller Profilo | Guru

>Buongiorno,
>a volte quando eseguo una stored da vb mi esce questo messaggio:
>Timeout. Il tempo disponibile è scaduto prima del completamento
>dell'operazione o il server non risponde.
>L'istruzione è stata interrotta.
>da cosa dipende? e poi come posso risolverlo?

Ciao Fabio,
allora sicuramente se va in timeout lato DB c'è qualcosa che non va. La query/SP richiede troppo tempo, forse per mancanza di qualche indice quindi bisognerebbe provare a fare un po' di tuning.

In ogni caso per risolvere il problema visto che tu userai un SqlCommand, questa classe ha una proprietà CommandTimeout che ti permette di specificare dopo quanti secondi scatta il timeout.

Ciao

David De Giacomi | Microsoft MVP
http://blogs.dotnethell.it/david/

trinity Profilo | Guru

Eppure la stored se la eseguo direttamente da Sql Server Management studio, funziona tranquillamente. Solo se la lancio da vb mi esce il timeout.

io ho la PK composta da

[codalbergo] ASC,
[CodComAlb] ASC,
[annogestionale] ASC,
[data_elaborazione] ASC,
[prog_schedina] ASC

e la stored la eseguo facendo una between sul campo data_elaborazione.
Ora ho creato anche un indice a parte con solo il campo data_elaborazione e provo.
Comunque secondo te non centra nulla se nella PK ho messo il campo prog_schedina di tipo BigInt e identity autoincrement?

Ciao
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

lbenaglia Profilo | Guru

>io ho la PK composta da
>
> [codalbergo] ASC,
> [CodComAlb] ASC,
> [annogestionale] ASC,
> [data_elaborazione] ASC,
> [prog_schedina] ASC
>
>e la stored la eseguo facendo una between sul campo data_elaborazione.
Stai tranqui che non sfrutterai l'indice definito automaticamente dal constraint PK, dato che data_elaborazione non è la prima colonna dell'indice.

>Ora ho creato anche un indice a parte con solo il campo data_elaborazione
>e provo.
Ora dovrebbe utilizzare quell'indice

>Comunque secondo te non centra nulla se nella PK ho messo il
>campo prog_schedina di tipo BigInt e identity autoincrement?
Scusa, se prog_schedina è un IDENTITY, non puoi definire la PK solo su questa colonna?!
Se ti serve l'univocità sulle altre, definisci un constraint UNIQUE ad-hoc, oppure se non serve una PK surrogata, butta via prog_schedina e definisci la PK sulle rimanenti colonne.

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

trinity Profilo | Guru

Il discorso è che la tabella può contenere record simili allora avevo inserito una colonna identity...ma pensandoci bene a questo punto ho fatto il fesso e posso dichiarare la Pk solo su questa colonna come hai detto te..

Poi gli altri indici che dichiaro in quanto mi servono per le stored, mi consigli dal punto di vista della performance di renderli univoci oppure no?

Ciao
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

lbenaglia Profilo | Guru

>Poi gli altri indici che dichiaro in quanto mi servono per le
>stored, mi consigli dal punto di vista della performance di renderli
>univoci oppure no?

Quali altri indici?
Da quello che hai scritto dovresti aver creato un nuovo indice solo su data_elaborazione... se questa colonna è univoca allora definisci un indice unique, altrimenti non puoi

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

trinity Profilo | Guru

Intendo che io nel progetto eseguo diverse stored a seconda delle mie esigenze.
Queste stored venegono eseguite sulla colonna data_elaborazione da sola,
oppure su codalbergo e codcomalb
oppure anche su codalbergo, codcomalb,data_elaborazione
oppure su solo annogestionale
oppure su codalbergo, codcomalb,data_elaborazione,annogestionale.

Pertanto per migliore le prestazioni tu i consigli di creare tantio indici in base alle mie esigenze e lasciare come PK solo prog_schedina

e se dovessi avere una stored che viene eseguita su codalbergo,codcomalb,prog_schedina allora andrei a creare un altro indici con questi parametri, giusto?
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

lbenaglia Profilo | Guru

>Pertanto per migliore le prestazioni tu i consigli di creare
>tantio indici in base alle mie esigenze e lasciare come PK solo
>prog_schedina
>
>e se dovessi avere una stored che viene eseguita su codalbergo,codcomalb,prog_schedina
>allora andrei a creare un altro indici con questi parametri,
>giusto?

A queste domande puoi rispondere solo tu, facendo prove su prove con indici diversi ed analizzando ogni volta il piano di esecuzione.
Non esiste una soluzione universale, sta a te individuare la migliore per la tua tipologia di query.

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

trinity Profilo | Guru

Ok ma in teoria la logica che ti ho detto ossia creare degli indici appropriati in base alle mi estored è giusto, ossia creare n indici in base alle mie esigenze e lasciare la Pk solo con il campo identity.

Ciao
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

lbenaglia Profilo | Guru

>Ok ma in teoria la logica che ti ho detto ossia creare degli
>indici appropriati in base alle mi estored è giusto, ossia creare
>n indici in base alle mie esigenze e lasciare la Pk solo con
>il campo identity.
Creare degli indici per le tue sp (più in generale per le tue query) è ovviamente giusto, ma individuare l'indice più appropriato per soddisfare una singola query è un altro discorso

Per quando riguarda il discorso di definire la PK sulla colonna identity... boh, dipende: perché l'hai definita? Serve davvero una PK surrogata?

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

trinity Profilo | Guru

allora la pk iniziale con tutte le colonne l'avevo creata in quanto nella mia tabella vengono salvata i record degli alberghi, pertanto i possono essere alberghi che si trovano nello stesso comune e che hanno codice albergo diverso ma alberghi che hanno lo stesso codice ma con comune diverso, poi ovviamente l'anno di gestione per 365 giorni è sempre lo stesso e poi la data di elaborazione può essere uguale per molti movimenti pertanto avevo pensato di creare il seguente indice:

codalbergo,codcomalb,prog_schedina,annogestionale,data_elaborazione

il prog_schedina sarebbe stato sempre diverso e quindi mi evitava la chiave duplicata.

poi per esegigenze la colonna prog_schedina(che era normale) l'ho dovuta trasformare in identity..
Pertanto detto in linee generali il mio quadro, ti chiedo, potrei lasciare solo la Pk con il prog_schedina e poi crearmi gli indici analizzando le mie stored?

ciao
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

lbenaglia Profilo | Guru

>...pertanto avevo
>pensato di creare il seguente indice:
>
>codalbergo,codcomalb,prog_schedina,annogestionale,data_elaborazione
>
>il prog_schedina sarebbe stato sempre diverso e quindi mi evitava
>la chiave duplicata.
Quindi includere le altre colonne nella PK non serve a niente se non a sprecare spazio

>Pertanto detto in linee generali il mio quadro, ti chiedo, potrei
>lasciare solo la Pk con il prog_schedina e poi crearmi gli indici
>analizzando le mie stored?
Si.

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

trinity Profilo | Guru

Allora
ho sistemato gli indici e il timeout nella stored ancora me lo da...
ti ripasso la stored e se noti io eseguo due funzioni per ricavarmi delle date che poi verrano sfruttate dalla between:

Delete From Archivio_mov
Where data_elaborazione
BetWeen dbo.GetFirstNextMonthDay(@data)
And
dbo.GetLastDateOfMounth(dbo.GetFirstNextMonthDay(@data))
And Flagriporto='1'

se invece io scrivo:

Delete From Archivio_mov
Where data_elaborazione
BetWeen @data And @data1 And Flagriporto='1'

e le date me le ricavo corrette da vb e le passo ai parametri, la delete è velocissima...

Perchè questo?

ciao
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

lbenaglia Profilo | Guru

>Perchè questo?
Risponditi confrontando i due piani di esecuzione.
Con molta probablità nel primo caso SQL Server non è in grado di stabilire il corretto data type restituito dalle UDF, generando un piano di esecuzione inefficiente...

--
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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5