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

Preguntas similare

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
Respuesta Responder a este mensaje
#2 Saga
07/04/2010 - 16:27 | Informe spam
Gracias Aguardientico!

Ok, voy a asegurar de incluir esos dos estatutos que mencionas.

Tienes razon acerca del SQL e incluyendo el Campo1='E' en la
clausula WHERE, solo que ese solo fue un ejemplo para poner
"cualquier cosa". Mi duda primordial es si las tablas se bloquean
si no se procesan todos los registros que se consultan.

Ademas, si se libera la tabla si termino la rutina con o sin las lineas
para cerrar y asignar Nothing a la variable del recorset.

Otra solucion es usar recordsets desconectados, algo que he hecho
ya varias veces. Saludos!


"Aguardientico" <gusgon1 at nospam dot com> wrote in message
news:
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



Respuesta Responder a este mensaje
#3 Antonio Ortiz R
07/04/2010 - 21:32 | Informe spam
Tambien puedes agregar un parametro al abrir el recordset para indicar que
es de solo lectura, si no requieres hacer cambios, esto consume menos
recursos.


Antonio Ortiz
www.aortiz.net
www.qsoluciones.net
www.qsoluciones.net/visualcaja



"Saga" escribió en el mensaje de
noticias:
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


email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida