Dudas sore SP, sql dinámico y un de bloqueos.

28/04/2004 - 20:11 por Víctor | Informe spam
Ante todo, hola a tod@s.

No se si es pedir mucho, pero me gustaría que me aclaren unas dudas, porque
estoy en un punto muerto. Se que lo he pedido en otras ocasiones, pero estoy
muy liado: es en relación a los Stored Procedure (SP) junto con consultas
estáticas, consultas dinámicas y planes de ejecución.

Caso práctico: tengo un SP con varios parámetros de entrada. Según dos
parámetros PA, se pueden ejecutar 4 consultas distintas; los otros
parámetros PW son variables para la cláusula WHERE de las consultas.

IF
consulta = consulta 1
ELSE IF
consulta = consulta 2
ELSE IF
consulta = consulta 3
ELSE
consulta = consulta 4
EXEC (consulta)

Dentro de cada IF monto el WHERE según las parámetros PW (pues si un
parámetros vale 0, no lo pngo en el WHERE).

Uso las consultas dinámicas porque hace tiempo lei que si las consultas son
diferentes, el SQLServer tiene cada vez que generar el plan de ejecución, y
se pierde tiempo. Poco, pero se pierde tiempo. Y que con las consultas
dinámicas no lo crea (cosa que ahora mismo me parece raro, ¿no?). ¿Es
verdad?

Si es mejor no hacer el SELECT dinámico, ¿creo un SP para cada consulta o
las dejo todas en el mismo SP?

Una última cosa. En un SP empiezo con un BEGIN TRAN y termino con el COMMIT
TRAN. LO hago para poder deshacer las transacciones si ocurre algo, pero
necesito bloquear una tabla. Se me ha ocurrido relizar el SELECT de la tabla
y luego su UPDATE lo último de todo (pero siempre dentro del BEGIN/COMMIT),
pero justo antes poner SET TRANSACTION ISOLATION LEVEL SERIALIZABLE, y
después del UPDATE dejar el predeterminado 8SET TRANSACTION ISOLATION LEVEL
READ UNCOMMITTED, creo que es). ¿Funcionará?

Bastante liado, ¿verdad?

Preguntas similare

Leer las respuestas

#1 ulises
28/04/2004 - 20:36 | Informe spam
1) En primer lugar te paso una lectura obligada sobre SQL
dinámico :

The Curse and Blessings of Dynamic SQL
http://www.algonet.se/~sommar/dynamic_sql.html

2) En el procedimiento almacenado, si las sentencias son
muy complejas yo las separaría en procedimientos
almacenados independientes para efectos de facilitar su
mantenimiento.

3) Trata de colocar el BEGIN TRAN lo más tarde que puedas
(no al inicio del procedimiento almacenado) y el COMMIT
TRAN (o ROLLBACK) lo más pronto de manera de tratar de
minizar que los bloqueos asimismo yo dejaría que el SQL
maneje los bloqueos.

Saludos,
Ulises

Mostrar la cita
unas dudas, porque
Mostrar la cita
ocasiones, pero estoy
Mostrar la cita
junto con consultas
Mostrar la cita
entrada. Según dos
Mostrar la cita
los otros
Mostrar la cita
consultas.
Mostrar la cita
(pues si un
Mostrar la cita
las consultas son
Mostrar la cita
plan de ejecución, y
Mostrar la cita
las consultas
Mostrar la cita
raro, ¿no?). ¿Es
Mostrar la cita
cada consulta o
Mostrar la cita
termino con el COMMIT
Mostrar la cita
ocurre algo, pero
Mostrar la cita
SELECT de la tabla
Mostrar la cita
del BEGIN/COMMIT),
Mostrar la cita
SERIALIZABLE, y
Mostrar la cita
TRANSACTION ISOLATION LEVEL
Mostrar la cita
#2 Naimps
29/04/2004 - 09:00 | Informe spam
On Wed, 28 Apr 2004 11:36:40 -0700, ulises wrote:

Mostrar la cita
Hola Ulises.

Ya me han recomendado ese artículo, pero está en inglés y estoy en la ardua
tarea de traducirlo.

Ya se que el BEGIN TRAN justo cuanto más tarde y el COMMIT lo más pronto
posible, pero en este caso lo hago para que si por en medio hay un error,
el SQLServer realize el ROLLBACK.

Y lo de poner SET TRANSACTION ISOLATION LEVEL, es porque hay una tabla, que
como es un contador de facturas, necesito que cuando el SP se ejecuta,
nadie tenga acceso para evitar datos incongruentes; pensaba que al estar
dentro del BEGIN TRAN quedaba bloqueada, pero me dijeron que no.

Me dices de separar las sentencias en SP para que sea más fácil el
mantenimiento, pero ¿y a nivel de rendimiento?

Muchas gracias por responder.
#3 ulises
29/04/2004 - 16:12 | Informe spam
Para evitar ese problema en el contador puedes usar :

BEGIN TRAN
UPDATE tablacontadores SET @valor = secuencia = secuencia
+ 1


de ese modo ya queda bloqueado por la actualización,
respecto al tema de rendimiento de los procedimientos
almacenados separados poría ser incluso mejor ya que al
tenerlo todo junto podría necesitar recompilaciones más
frecuentes.

Saludos,
Ulises


Mostrar la cita
estoy en la ardua
Mostrar la cita
COMMIT lo más pronto
Mostrar la cita
medio hay un error,
Mostrar la cita
hay una tabla, que
Mostrar la cita
SP se ejecuta,
Mostrar la cita
pensaba que al estar
Mostrar la cita
que no.
Mostrar la cita
fácil el
Mostrar la cita
Ads by Google
Search Busqueda sugerida