Que script es mejor?

13/01/2007 - 16:28 por fac | Informe spam
Buenas foro, queria consultarles que es mejor colocar un rowlock en el
update o colocar un nolock en la parte inferior de la sentencia, porque no
permite colocar rowlock y nolock, genera error, por eso acudo a ustedes para
que me esclarezcan un poco sobre esto, muchas gracias de antemano.


update utb_bienes_prendas with (rowlock)
set utb_bienes_prendas.dec_saldo_garantia =
round(a.dec_saldo_garantia,2),
utb_bienes_prendas.dec_total_acumulado_en_uso =
round(@v_NuevoValorCobertura,2),
utb_bienes_prendas.dtm_fecha_liberacion = null,
utb_bienes_prendas.var_cod_usuario_liberacion = null,
utb_bienes_prendas.var_cod_estado = '24501002'
from utb_bienes_prendas , utb_solicitud_garantias a (nolock)
where utb_bienes_prendas.var_cod_bien = a.var_cod_bien
and utb_bienes_prendas.var_cod_bien = @v_CodBienGarantia


ó

update utb_bienes_prendas
set utb_bienes_prendas.dec_saldo_garantia =
round(a.dec_saldo_garantia,2),
utb_bienes_prendas.dec_total_acumulado_en_uso =
round(@v_NuevoValorCobertura,2),
utb_bienes_prendas.dtm_fecha_liberacion = null,
utb_bienes_prendas.var_cod_usuario_liberacion = null,
utb_bienes_prendas.var_cod_estado = '24501002'
from utb_bienes_prendas (nolock) , utb_solicitud_garantias a (nolock)
where utb_bienes_prendas.var_cod_bien = a.var_cod_bien
and utb_bienes_prendas.var_cod_bien = @v_CodBienGarantia

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
13/01/2007 - 18:30 | Informe spam
fac,

Pudieras explicar lo que quieres hacer?


AMB

"fac" wrote:

Buenas foro, queria consultarles que es mejor colocar un rowlock en el
update o colocar un nolock en la parte inferior de la sentencia, porque no
permite colocar rowlock y nolock, genera error, por eso acudo a ustedes para
que me esclarezcan un poco sobre esto, muchas gracias de antemano.


update utb_bienes_prendas with (rowlock)
set utb_bienes_prendas.dec_saldo_garantia =
round(a.dec_saldo_garantia,2),
utb_bienes_prendas.dec_total_acumulado_en_uso =
round(@v_NuevoValorCobertura,2),
utb_bienes_prendas.dtm_fecha_liberacion = null,
utb_bienes_prendas.var_cod_usuario_liberacion = null,
utb_bienes_prendas.var_cod_estado = '24501002'
from utb_bienes_prendas , utb_solicitud_garantias a (nolock)
where utb_bienes_prendas.var_cod_bien = a.var_cod_bien
and utb_bienes_prendas.var_cod_bien = @v_CodBienGarantia


ó

update utb_bienes_prendas
set utb_bienes_prendas.dec_saldo_garantia =
round(a.dec_saldo_garantia,2),
utb_bienes_prendas.dec_total_acumulado_en_uso =
round(@v_NuevoValorCobertura,2),
utb_bienes_prendas.dtm_fecha_liberacion = null,
utb_bienes_prendas.var_cod_usuario_liberacion = null,
utb_bienes_prendas.var_cod_estado = '24501002'
from utb_bienes_prendas (nolock) , utb_solicitud_garantias a (nolock)
where utb_bienes_prendas.var_cod_bien = a.var_cod_bien
and utb_bienes_prendas.var_cod_bien = @v_CodBienGarantia



Respuesta Responder a este mensaje
#2 fac
14/01/2007 - 02:23 | Informe spam
Hola, muchas gracias por la atencion, te explico, el sistema que estamos
implementando tiene problemas de concurrencia, lo estoy mejorando con
indices y me dijeron que use rowlock en los insert y update, el nolock en un
select de ser necesario, bueno estoy realizando los cambios y me encontre
con un update que se basa en una consulta, entonces dije que sera mas
beneficioso ponerle al update el rowlock o colocarlo a la misma tabla en la
parte inferior que es la consulta y colocarle el nolock, queria saber que es
mejor y si podria mejorar mi situacion de concurrencias.


Saludos.


Felipe



"Alejandro Mesa" escribió en el
mensaje news:
fac,

Pudieras explicar lo que quieres hacer?


AMB

"fac" wrote:

Buenas foro, queria consultarles que es mejor colocar un rowlock en el
update o colocar un nolock en la parte inferior de la sentencia, porque
no
permite colocar rowlock y nolock, genera error, por eso acudo a ustedes
para
que me esclarezcan un poco sobre esto, muchas gracias de antemano.


update utb_bienes_prendas with (rowlock)
set utb_bienes_prendas.dec_saldo_garantia >> round(a.dec_saldo_garantia,2),
utb_bienes_prendas.dec_total_acumulado_en_uso >> round(@v_NuevoValorCobertura,2),
utb_bienes_prendas.dtm_fecha_liberacion = null,
utb_bienes_prendas.var_cod_usuario_liberacion = null,
utb_bienes_prendas.var_cod_estado = '24501002'
from utb_bienes_prendas , utb_solicitud_garantias a (nolock)
where utb_bienes_prendas.var_cod_bien = a.var_cod_bien
and utb_bienes_prendas.var_cod_bien = @v_CodBienGarantia


ó

update utb_bienes_prendas
set utb_bienes_prendas.dec_saldo_garantia >> round(a.dec_saldo_garantia,2),
utb_bienes_prendas.dec_total_acumulado_en_uso >> round(@v_NuevoValorCobertura,2),
utb_bienes_prendas.dtm_fecha_liberacion = null,
utb_bienes_prendas.var_cod_usuario_liberacion = null,
utb_bienes_prendas.var_cod_estado = '24501002'
from utb_bienes_prendas (nolock) , utb_solicitud_garantias a
(nolock)
where utb_bienes_prendas.var_cod_bien = a.var_cod_bien
and utb_bienes_prendas.var_cod_bien = @v_CodBienGarantia



Respuesta Responder a este mensaje
#3 Alejandro Mesa
14/01/2007 - 18:42 | Informe spam
fac,

y me dijeron que use rowlock en los insert y update, el nolock en un
select de ser necesario



Creo que se olvidaron de mencionar que uses "nolock" cuando no estas
interesado en que la lectura de la data sea confiable, puesto que "nolock" no
respeta los locks exclusivos y puede dar paso a lectura de data que no ha
sido confirmada por la transaccion.

En este caso especifico estas actualizando una tabla "a", la cual quieres
leer usando "nolock" (puedes leer data sucia) y ademas hacer lock a nivel
solo de fila cuando la actualizas. Me parece un poco complicado esto.

Algunos pasos para evitar largas esperas debido a bloqueos.

- Seleccionar solo la data necesaria
- Indexar apropiadamente para ayudar las sentencia DML (select, insert,
update, delete)
- Transacciones cortas (tratar de que las transsacciones no involucren gran
cantidad de filas)
- Monitorear transacciones abiertas con "dbcc opentran", puesto que a veces
cancelamos ciertas operaciones y olvidamos hacer "rollback" de la transaccion.
- Monitorear uso de cursores (dbcc activecursors - no documentado - no usar
en codigo de produccion)


AMB

"fac" wrote:

Hola, muchas gracias por la atencion, te explico, el sistema que estamos
implementando tiene problemas de concurrencia, lo estoy mejorando con
indices y me dijeron que use rowlock en los insert y update, el nolock en un
select de ser necesario, bueno estoy realizando los cambios y me encontre
con un update que se basa en una consulta, entonces dije que sera mas
beneficioso ponerle al update el rowlock o colocarlo a la misma tabla en la
parte inferior que es la consulta y colocarle el nolock, queria saber que es
mejor y si podria mejorar mi situacion de concurrencias.


Saludos.


Felipe



"Alejandro Mesa" escribió en el
mensaje news:
> fac,
>
> Pudieras explicar lo que quieres hacer?
>
>
> AMB
>
> "fac" wrote:
>
>> Buenas foro, queria consultarles que es mejor colocar un rowlock en el
>> update o colocar un nolock en la parte inferior de la sentencia, porque
>> no
>> permite colocar rowlock y nolock, genera error, por eso acudo a ustedes
>> para
>> que me esclarezcan un poco sobre esto, muchas gracias de antemano.
>>
>>
>> update utb_bienes_prendas with (rowlock)
>> set utb_bienes_prendas.dec_saldo_garantia > >> round(a.dec_saldo_garantia,2),
>> utb_bienes_prendas.dec_total_acumulado_en_uso > >> round(@v_NuevoValorCobertura,2),
>> utb_bienes_prendas.dtm_fecha_liberacion = null,
>> utb_bienes_prendas.var_cod_usuario_liberacion = null,
>> utb_bienes_prendas.var_cod_estado = '24501002'
>> from utb_bienes_prendas , utb_solicitud_garantias a (nolock)
>> where utb_bienes_prendas.var_cod_bien = a.var_cod_bien
>> and utb_bienes_prendas.var_cod_bien = @v_CodBienGarantia
>>
>>
>> ó
>>
>> update utb_bienes_prendas
>> set utb_bienes_prendas.dec_saldo_garantia > >> round(a.dec_saldo_garantia,2),
>> utb_bienes_prendas.dec_total_acumulado_en_uso > >> round(@v_NuevoValorCobertura,2),
>> utb_bienes_prendas.dtm_fecha_liberacion = null,
>> utb_bienes_prendas.var_cod_usuario_liberacion = null,
>> utb_bienes_prendas.var_cod_estado = '24501002'
>> from utb_bienes_prendas (nolock) , utb_solicitud_garantias a
>> (nolock)
>> where utb_bienes_prendas.var_cod_bien = a.var_cod_bien
>> and utb_bienes_prendas.var_cod_bien = @v_CodBienGarantia
>>
>>
>>



Respuesta Responder a este mensaje
#4 Jose Mariano Alvarez
15/01/2007 - 14:40 | Informe spam
Nolock no deberias usarlo en estas circunstancias.
El uso del nolock no es recomendable.
Si tienes ese tipo de problemas seria recomendable pensar en migrar a SQL
Server 2005 para usar el snapshot isolation level.

Yo probaria en el where si tienes buenos indices

where

utb_bienes_prendas.var_cod_bien = a.var_cod_bien
and a.var_cod_bien = @v_CodBienGarantia
and utb_bienes_prendas.var_cod_bien = @v_CodBienGarantia

A veces el SQL no aplica transitividad a los predicados.





Saludos
Ing. Jose Mariano Alvarez


(Cambia los ceros por O y saca lo que sobra)




"fac" wrote in message
news:%23qgp%
Hola, muchas gracias por la atencion, te explico, el sistema que estamos
implementando tiene problemas de concurrencia, lo estoy mejorando con
indices y me dijeron que use rowlock en los insert y update, el nolock en
un select de ser necesario, bueno estoy realizando los cambios y me
encontre con un update que se basa en una consulta, entonces dije que sera
mas beneficioso ponerle al update el rowlock o colocarlo a la misma tabla
en la parte inferior que es la consulta y colocarle el nolock, queria
saber que es mejor y si podria mejorar mi situacion de concurrencias.


Saludos.


Felipe



"Alejandro Mesa" escribió en el
mensaje news:
fac,

Pudieras explicar lo que quieres hacer?


AMB

"fac" wrote:

Buenas foro, queria consultarles que es mejor colocar un rowlock en el
update o colocar un nolock en la parte inferior de la sentencia, porque
no
permite colocar rowlock y nolock, genera error, por eso acudo a ustedes
para
que me esclarezcan un poco sobre esto, muchas gracias de antemano.


update utb_bienes_prendas with (rowlock)
set utb_bienes_prendas.dec_saldo_garantia >>> round(a.dec_saldo_garantia,2),
utb_bienes_prendas.dec_total_acumulado_en_uso >>> round(@v_NuevoValorCobertura,2),
utb_bienes_prendas.dtm_fecha_liberacion = null,
utb_bienes_prendas.var_cod_usuario_liberacion = null,
utb_bienes_prendas.var_cod_estado = '24501002'
from utb_bienes_prendas , utb_solicitud_garantias a (nolock)
where utb_bienes_prendas.var_cod_bien = a.var_cod_bien
and utb_bienes_prendas.var_cod_bien = @v_CodBienGarantia


ó

update utb_bienes_prendas
set utb_bienes_prendas.dec_saldo_garantia >>> round(a.dec_saldo_garantia,2),
utb_bienes_prendas.dec_total_acumulado_en_uso >>> round(@v_NuevoValorCobertura,2),
utb_bienes_prendas.dtm_fecha_liberacion = null,
utb_bienes_prendas.var_cod_usuario_liberacion = null,
utb_bienes_prendas.var_cod_estado = '24501002'
from utb_bienes_prendas (nolock) , utb_solicitud_garantias a
(nolock)
where utb_bienes_prendas.var_cod_bien = a.var_cod_bien
and utb_bienes_prendas.var_cod_bien = @v_CodBienGarantia









Respuesta Responder a este mensaje
#5 fac
15/01/2007 - 16:42 | Informe spam
Ok, el uso de nolock lo estoy aplicando en informacion que no se modifica de
manera continua, revise los indices como comente y vi que tenia tablas con
indices pk pero sin cluster, a los mas grandes les genere con cluster y
agilice las operaciones.

El uso de nolock los aplique en algunos casos porque el sistema maneja
informacion muy independiente, de cuentas por clientes, y como es por
registro el uso, solo controlare con una tabla tipo semaforo para que otros
no modifiquen mi informacion individual.

Migrar al SqlServer 2005 no creo que sea posible por el momento, aqui se
estan haciendo mucho problema con el costo de la licencia del Sql2000 peor
seria que sea 2005 a parte que usamos dts y no pagarian por una migracion.

Muchas gracias por el apoyo, en un caso si presento problemas el sistema
pues genero la cancelacion de una cuota en 4 oportunidades en nuestras
pruebas, pero eso vere como lo soluciono, en este caso debo retirar el
nolock de mi consulta de cuota a pagar.


"Jose Mariano Alvarez"
escribió en el
mensaje news:
Nolock no deberias usarlo en estas circunstancias.
El uso del nolock no es recomendable.
Si tienes ese tipo de problemas seria recomendable pensar en migrar a SQL
Server 2005 para usar el snapshot isolation level.

Yo probaria en el where si tienes buenos indices

where

utb_bienes_prendas.var_cod_bien = a.var_cod_bien
and a.var_cod_bien = @v_CodBienGarantia
and utb_bienes_prendas.var_cod_bien = @v_CodBienGarantia

A veces el SQL no aplica transitividad a los predicados.





Saludos
Ing. Jose Mariano Alvarez


(Cambia los ceros por O y saca lo que sobra)




"fac" wrote in message
news:%23qgp%
Hola, muchas gracias por la atencion, te explico, el sistema que estamos
implementando tiene problemas de concurrencia, lo estoy mejorando con
indices y me dijeron que use rowlock en los insert y update, el nolock en
un select de ser necesario, bueno estoy realizando los cambios y me
encontre con un update que se basa en una consulta, entonces dije que
sera mas beneficioso ponerle al update el rowlock o colocarlo a la misma
tabla en la parte inferior que es la consulta y colocarle el nolock,
queria saber que es mejor y si podria mejorar mi situacion de
concurrencias.


Saludos.


Felipe



"Alejandro Mesa" escribió en el
mensaje news:
fac,

Pudieras explicar lo que quieres hacer?


AMB

"fac" wrote:

Buenas foro, queria consultarles que es mejor colocar un rowlock en el
update o colocar un nolock en la parte inferior de la sentencia, porque
no
permite colocar rowlock y nolock, genera error, por eso acudo a ustedes
para
que me esclarezcan un poco sobre esto, muchas gracias de antemano.


update utb_bienes_prendas with (rowlock)
set utb_bienes_prendas.dec_saldo_garantia >>>> round(a.dec_saldo_garantia,2),
utb_bienes_prendas.dec_total_acumulado_en_uso >>>> round(@v_NuevoValorCobertura,2),
utb_bienes_prendas.dtm_fecha_liberacion = null,
utb_bienes_prendas.var_cod_usuario_liberacion = null,
utb_bienes_prendas.var_cod_estado = '24501002'
from utb_bienes_prendas , utb_solicitud_garantias a (nolock)
where utb_bienes_prendas.var_cod_bien = a.var_cod_bien
and utb_bienes_prendas.var_cod_bien = @v_CodBienGarantia


ó

update utb_bienes_prendas
set utb_bienes_prendas.dec_saldo_garantia >>>> round(a.dec_saldo_garantia,2),
utb_bienes_prendas.dec_total_acumulado_en_uso >>>> round(@v_NuevoValorCobertura,2),
utb_bienes_prendas.dtm_fecha_liberacion = null,
utb_bienes_prendas.var_cod_usuario_liberacion = null,
utb_bienes_prendas.var_cod_estado = '24501002'
from utb_bienes_prendas (nolock) , utb_solicitud_garantias a
(nolock)
where utb_bienes_prendas.var_cod_bien = a.var_cod_bien
and utb_bienes_prendas.var_cod_bien = @v_CodBienGarantia













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