Queries lentos en SQL Server

06/04/2010 - 22:24 por Saga | Informe spam
Hola, tenemos una aplicacion que se ha visto lenta cuando accesa la base de
datos.

Me puse a leer el Books On Line de SQL Server y encontre este parrafo:

· Applications that are not processing all results to completion.

After sending a query to the server, all applications must immediately fetch
all result rows to completion. If an application does not fetch all result
rows, locks may be left on the tables, blocking other users. If you are
using an application that transparently submits Transact-SQL statements to
the server, the application must fetch all result rows. If it does not (and
if it cannot be configured to do so), you may be unable to resolve the
blocking problem. To avoid the problem, you can restrict these applications
to a reporting or decision-support database.


No entiendo bien esto. Por ejemplo, si tengo esta rutina (pseudo codigo)

public function ConsigueRegE(byval strID as string) as string

dim es as ADODB.Recorset
dim strSQL as string

strSQL = "Select Campo1,Campo2 from MiTabla where IdProd=" & strID

set rs = new adodb.recordset
rs.cursorlocation = adClient
rs.open strSQL, dbConex

do until rs.eof
if rs!Campo1 = "E" then
exit loop
end if
rs.movenext
loop

ConsigueRegE = rs!Campo2

end function

Se asume que dbConex esta debidamente inicializado. Si localizo
el registro con el Id de producto correspondiente y Campo1 es "E"
entonces me salgo del bucle, asigno el valor de regreso y me salgo
de la rutina. ¿Esto va a causar problemas de bloqueo como dice el
texto?

Y si despues de la linea de Campo2 hago esto:

rs.close
set rs = nothing

¿Esto mejorara el asunto? Segun yo, como declare rs local a la funcion
se deben liberar los recursos que rs emplea cuando me salgo de la rutina.

Gracias por su retroalimentacion! Saludos, Saga
 

Leer las respuestas

#1 Aguardientico
07/04/2010 - 04:58 | Informe spam
Hola Saga

Creo que podrias cambiar tu consulta por "Select Campo2 from MiTabla where
IdProd=? AND Campo1 = 'E' ", así no tienes que iterar en los diferentes
registros que te regrese tu consulta.

Otra recomendación siempre procura liberar los recursos que utilices por más
que sean variables locales (es decir siempre pon el close y el rs=nothing)
esto ayuda mucho al recolector de basura (en caso de que tu lenguaje de
programación lo tenga).


Atte.

Gustavo Gonzalez
http://aguardientech.blogspot.com


"Saga" wrote in message
news:
Hola, tenemos una aplicacion que se ha visto lenta cuando accesa la base
de datos.

Me puse a leer el Books On Line de SQL Server y encontre este parrafo:

· Applications that are not processing all results to completion.

After sending a query to the server, all applications must immediately
fetch all result rows to completion. If an application does not fetch all
result rows, locks may be left on the tables, blocking other users. If you
are using an application that transparently submits Transact-SQL
statements to the server, the application must fetch all result rows. If
it does not (and if it cannot be configured to do so), you may be unable
to resolve the blocking problem. To avoid the problem, you can restrict
these applications to a reporting or decision-support database.


No entiendo bien esto. Por ejemplo, si tengo esta rutina (pseudo codigo)

public function ConsigueRegE(byval strID as string) as string

dim es as ADODB.Recorset
dim strSQL as string

strSQL = "Select Campo1,Campo2 from MiTabla where IdProd=" & strID

set rs = new adodb.recordset
rs.cursorlocation = adClient
rs.open strSQL, dbConex

do until rs.eof
if rs!Campo1 = "E" then
exit loop
end if
rs.movenext
loop

ConsigueRegE = rs!Campo2

end function

Se asume que dbConex esta debidamente inicializado. Si localizo
el registro con el Id de producto correspondiente y Campo1 es "E"
entonces me salgo del bucle, asigno el valor de regreso y me salgo
de la rutina. ¿Esto va a causar problemas de bloqueo como dice el
texto?

Y si despues de la linea de Campo2 hago esto:

rs.close
set rs = nothing

¿Esto mejorara el asunto? Segun yo, como declare rs local a la funcion
se deben liberar los recursos que rs emplea cuando me salgo de la rutina.

Gracias por su retroalimentacion! Saludos, Saga



__________ Information from ESET NOD32 Antivirus, version of virus
signature database 5005 (20100406) __________

The message was checked by ESET NOD32 Antivirus.

http://www.eset.com






__________ Information from ESET NOD32 Antivirus, version of virus signature database 5005 (20100406) __________

The message was checked by ESET NOD32 Antivirus.

http://www.eset.com

Preguntas similares