septiembre 27, 2007

row-locks en operaciones SQL-Insert/Update/Delete

Este es un tip que me paso un cuate llamado Christian que es DBA en SQL Server. Para no poner de rodillas a su servidor de base de datos SQL Server

Un link de referencia adicional es:
http://support.microsoft.com/kb/323630

"A veces por cuestiones de performance o necesidad de trabajar con un conjunto de registros grandes, es conveniente hacerlo parcialmente, es decir, en "pedazos". Esto puede suceder porque al trabajar con millones de registros se generen demasiados row-locks y consuman toda la memoria y el query falle en su ejecución."

Aquí un query de ejemplo:


SET NOCOUNT ON --QUITAMOS LOS MENSAJES DE CONTEO DE REGISTROS AFECTADOS YA QUE LO PERSONALIZAMOS

DECLARE @Afectados bigint --DECLARAMOS UNA VARIABLE PARA ACUMULAR LOS REGISTROS AFECTADOS

DECLARE @Afec bigint --DECLARAMOS UNA VARIABLE PARA SABER CUANTOS ACUMULO EN CADA PASO

SET @Afectados = 0 --INICIALIZAMOS EL ACUMULADO

Borra: --ETIQUETA PARA SALTO

SET Rowcount 1000 --ESTA SENTENCIA ES LA MAS IMPORTANTE: LE DECIMOS AL SQL QUE LA SIGUIENTE SENTENCIA SOLO AFECTARÁ A 1000 REGISTROS (AUNQUE EXISTAN MÁS)!!!!!!.

DELETE Facturas

WHERE Fecha_factura < '2007/01/01' --EJECUTAMOS NUESTRA SENTENCIA, ESTA ES SOLO UN EJEMPLO Y SUPONDREMOS QUE LA SENTENCIA POR SÍ SOLA AFECTARÍA MILLONES DE REGISTROS.

SET @Afec = @@Rowcount --OBTENEMOS CUANTOS REGISTROS AFECTO (SOLAMENTE AL FINAL QUE YA NO HAYA REGISTROS POR AFECTAR DEVOLVERÁ CERO, DE LO CONTRARIO DEVOLVERÁ LOS 1000 QUE CONFIGURAMOS)

SET @Afectados = @Afectados + @Afec

print 'Afectados: ' + CONVERT(varchar,@Afectados) --AQUÍ VAMOS IMPRIMIENDO EL ACUMULADO DE LOS REGISTROS QUE VA AFECTANDO PARA DARNOS UNA IDEA DE CUANTO LEVA. (Ver pantalla resultado al final)

if @Afec > 0 goto borra --SI EL NUMERO DE REGISTROS QUE AFECTO EL DELETE ES MAYOR A CERO (ES DECIR QUE AUN HAY MÁS REGISTROS POR BORRAR) REGRESA A EJECUTAR EL DELETE.

set rowcount 0 --RESETEAMOS EL ROWNCOUNT PARA QUE YA AFECTE NORMAL


El resultado se vería como la siguiente imágen:




Tipos Nulables para valores NULL en Bases de Datos

Hace unos días hice una clase de tipo Entity que la poblabla con registros de una tabla de una Base de Datos y la mayoría de sus valores eran opcionales, es decir nulos así que utilice el concepto de tipos nulables del framework 2.0. Con esta clasecilla insertaba regsitros con valores nulos.

Public Class Cuestionario
'Los miembros privados nulables
Private _otroIdiomaHabla As Nullable(Of Byte)
Private bolv1 As Nullable(Of Boolean)


--los métodos públicos de acceso a los miembros privados.
Public Property OtroIdiomaHabla() As Nullable(Of Byte)
Get
Return Me._otroIdiomaHabla
End Get

Set(ByVal value As Nullable(Of Byte))
Me._otroIdiomaHabla = value
End Set

End Property
End Class


'El uso de la clase
Dim objCuestionario as new Cuestionario
'Asigno nada a su miembro
objCuestionario.OtroIdiomaHabla = Nothing
'Verifico el valor
If objCuestionario.OtroIdiomaHabla.HasValue then
'Existe valor
Else
'Sin valor
End if

'Cuando asigno valor a un comando como parametro a la ejecución de un store procedure 'pasamos el valor o un nothing implicito por el tipo nulable y que equivale a un null en la columna de la tabla de la BD.
cmd.Parameters.Add("@OtroIdiomaHabla", Data.SqlDbType.Bit, 1).Value = objCuestionario.OtroIdiomaHabla

'En el store procedure asignamos un default al parametro y cuando pasamos el valor a través del parametro a nuestro objeto esteremos pasando un nothing que va equivaler al Null.
CREATE PROCEDURE spuInserta
@OtroIdiomaHabla tinyint=NULL
As
Insert Into Tabla (OtroIdiomaHabla, ValorX)
Values(@OtroIdiomaHabla, Default)
Go

Links a páginas de iconos

Como desarrolladores de aplicaciones WEB y de escritorio siempre necesitamos de iconos de todo tipo recientemente consulté dos páginas de iconos simpre utiles para que las agreguen a susu favoritos.

http://www.iconfinder.net/
El siguiente link me lo paso mi cuate Gerardo Hdz.
http://www.iconarchive.com/

Los 7 pecados mortales de Ajax

un buen link teórico de lo bueno y malo de usar Ajax!
http://www.tufuncion.com/errores-ajax