viernes, 11 de noviembre de 2011

Comprender Lockeos en SQL2000

http://msdn.microsoft.com/en-us/library/aa213039(v=sql.80).aspx

Hints en SQL server

Hints en SQL Server PDFImprimirE-mail
Escrito por Esteban Grinber
Martes, 31 de Julio de 2007 21:00
Los hints en SQL Server (y en la mayoria de las bases de datos relaciones del mercado), son agregados a un comando SQL que indica que debe ejecutarse de manera diferente a la predeterminada por el motor. Existen 4 tipos de hints diferentes:
  • Join Hints: Especifican que tipo de join (mergue, hash, loop) vamos a usar en la query.
  • Index Hints: Fuerzan el uso de uno o mas indices en la ejecucion de la query.
  • Lock Hints: Especifican un tipo de lockeo.
  • Processing Hints: Especifican una estrategia particular en la ejecucion de la query.

Hints en SQL Server

Los hints en SQL Server (y en la mayoria de las bases de datos relaciones del mercado), son agregados a un comando SQL que indica que debe ejecutarse de manera diferente a la predeterminada por el motor. Existen 4 tipos de hints diferentes:
  • Join Hints: Especifican que tipo de join (mergue, hash, loop) vamos a usar en la query.
  • Index Hints: Fuerzan el uso de uno o mas indices en la ejecucion de la query.
  • Lock Hints: Especifican un tipo de lockeo.
  • Processing Hints: Especifican una estrategia particular en la ejecucion de la query.
En situaciones normales, no se deberia utilizarlos, pero sin embargo, hay veces que es necesario. Por otra parte, en situaciones donde el volumen de informacion esta en constante cambio, es importante recordar que un hint puede funcionar bien el dia de hoy, pero no tan bien la semana siguiente. Es conveniente retestear todos las queries que utilizan hints periodicamente.

Join Hints:

HASH JOIN: Se utiliza cuando se quiere forzar el uso del HASH JOIN entre dos tablas.

Ejemplo:
SELECT title_id, pub_name, title FROM titles INNER HASH JOIN publishers ON titles.pub_id = publishers.pub_id

MERGE JOIN: Se utiliza cuando se quiere forzar el uso del MERGE JOIN entre dos tablas. Ejemplo: SELECT title_id, pub_name, title FROM titles INNER MERGE JOIN publishers ON titles.pub_id = publishers.pub_id

LOOP JOIN: Se utiliza cuando se quiere forzar el uso del LOOP JOIN entre dos tablas.
Ejemplo:

SELECT title_id, pub_name, title
FROM titles INNER LOOP JOIN publishers ON titles.pub_id = publishers.pub_id

Generalmente no deberiamos usar estos hints, pero si por alguna razon el motor no esta generando
el plan de ejecucion mas optimo, entonces es valida esta metodologia. Pero hay que tener CUIDADO en usarlo.

Index Hints:

Este tipo de hints, se utiliza cuando queremos forzar el uso de un indice en particular, para optimizar la consulta. El plan de ejecucion generado por el SQL Server suele ser el mas optimo, pero en algunos casos excepcionales, no. Al igual que con los Join Hints, hay que tener cuidado a la hora de usarlos.
Ejemplo para forzar un Table Scan:
SELECT * FROM authors WITH (INDEX(0))
Poniendo como ID de INDEX, el valor 0, se fuerza un Table Scan.


Ejemplo para forzar el uso del Clustered Index:
SELECT * FROM authors WITH (INDEX(1))

Poniendo como ID de INDEX, el valor 1, se fuerza el uso del indice Clustered de la tabla. En caso de que no existe, tira error.


Ejemplo para forzar el uso de un Non Clustered Index:
SELECT * FROM authors WITH (INDEX(NOMBRE_DEL_INDICE))


Lock Hints:

Por lejos, los mas usados. Este tipo de hints especifican que tipo de lockeo se debe efectuar en una operacion. Existen varios hints de este tipo, pero el mas usado es el NOLOCK y ROWLOCK.
NOLOCK: (equivalente al READUNCOMMITTED): Se usa en la sentencia SELECT. Indica al motor que ignore los a lockeos exclusivos de datos y lea directamente de la tabla, lo que
suele llamarse "lectura sucia". Con esto ganamos mayor performance y escalabilidad, pero al riesgo de leer datos de una transaccion que todavia no finalizo, lo que significa una perdida en la fiabilidad de los datos. Es un riesgo que tenemos que tener en cuenta. Por ejemplo, si queremos sacar un reporte de ventas entre dos periodos que ya terminaron, no tiene sentido realizar y verificar lockeos a la hora de leer, por lo cual un NOLOCK es totalmente valido. Pero si tenemos que leer datos entre periodos vigentes, donde pueden efectuarse transacciones, habria que evaluar el riesgo de leer datos que podrian llegar a ser invalidos. Algo importante que hay que aclarar, es que el NOLOCK no ignora TODOS los lockeos, de hecho, adquieren lockeos Sch-S (estabilidad del esquema). Por ejemplo, si se esta corriendo un comando DDL que afecte a la tabla, esta adquiere un lockeos Sch-M (modificación del esquema), y por lo tanto, si se ejecuta una consulta aun teniendo el hint NOLOCK, se bloqueara hasta que no termine la transaccion anterior.
En muchos sitios que requieren alta disponibilidad, se suele usar este hint en practicamente todas las sentencias SELECT, salvo en aquellas donde se quiere garantizar la integridad de los datos.
Ejemplo:
SELECT COUNT(*)
FROM Usuarios WITH (NOLOCK) INNER JOIN MenuUsuario WITH (NOLOCK) ON Usuarios.UsuarioID = MenuUsuario.UsuarioID
ROWLOCK: Especifica que se apliquen bloqueos de fila cuando normalmente se aplicarían bloqueos de página o de tabla.
Aplica solo a sentencias UPDATE, DELETE e INSERT. Tambien, como en el caso del NOLOCK, este hint sirve para ganar mayor performance en entornos muy concurrentes. Algo que hay que tener cuidado aca, es que si ocurren muchos update sobre la misma tabla, se puede saturar el servidor de tantos lockeos por fila
Ejemplo:
UPDATE Usuarios WITH (ROWLOCK) SET UsuarioID = 20 WHERE UsuarioID = 1

http://www.alejandrosueldo.com.ar/joomla15/index.php?option=com_content&view=article&id=33:hints-en-sql-server&catid=21:cursos-y-tutoriales&Itemid=2