Upload
gilmer-vasquez-perez
View
46
Download
2
Tags:
Embed Size (px)
Citation preview
Arquitectura rendimiento y performance
Tuning del motor relacional del SQL Server
08/05/2009
1
I ng . J os e M ar iano A lvarezj o s e . m a r i a n o . a l va r e z @g m a i l . c o m
ww w . s q l t o t a l c o n s u l t i n g . c o m
Arquitectura rendimiento y
performance Tuning de l motor
relacional del SQL Server
Filegroups
un archivo o filegroup puede ser usado solo por una base de datos
Un archivo puede ser miembro de un solo filegroup.
El log no es parte de ningún filegroup y no puede ser parte de ningún archivo.
Un archivo es una unidad de paralelismo y de recuperación.
Los filegroups permiten asignar objetos a archivos especificos.
2
Filegroups (2)
Las tablas solo se pueden asignar a un filegroup.
Se puede crear varios archivos para que use en paralelo
los discos.
Crea un thread por cada archivo.
Si el RAID es por hardware puede que no mejore
3
Filegroups (3)
Permite realizar stripping
Usar un archivo por disco físico si Disk Queue length <= 3
Verificar que se produce una mejora si se usa
Separar los índices no clustered de las tablas en
conjuntos de discos separados
Combinar Hardware con filegroups separando carga
4
Indices
Páginas
6
Arquitectura rendimiento y performance
Tuning del motor relacional del SQL Server
08/05/2009
2
Extents
7
Árboles B y Heap
8
¿ Qué es un índice ?
9
Índices c lustered
Solo puede haber uno por tabla porque define el orden físico
Al crearlo se requiere el doble de espacio de la tabla porque se copian
Recomendado para
Grandes resultados con Scan por rango
Obtención de datos ordenados
No recomendado
Columnas que se actualizan habitualmente
Claves anchas
10
Clustered
11
Seek - Cluster
12
Arquitectura rendimiento y performance
Tuning del motor relacional del SQL Server
08/05/2009
3
Range - Cluster
13
Índices non Clustered
Puede haber varios por tabla (hasta 249)
Son estructuras secundarias a la tabla
Accesos puntuales
Requieren alta selectividad
Requiere Bookmark Lookup porque depende del clustered index
Son muy útiles con resultados de pocas filas de tablas grandes
14
Nonclustered
15
Traversing Bookmark look-up
16
Seek – Non Cluster
17
Range – Non Cluster
18
Arquitectura rendimiento y performance
Tuning del motor relacional del SQL Server
08/05/2009
4
Características de los índices
Unicidad Ayuda a las estrategias de acceso
Selectividad Es el porcentaje de la tabla accedida
Selectividad = filas accedidas / Total
Selectividad de un join Es el número de filas de una tabla inner de la relación con respecto a
una tabla outer definida
19
Definición de índices
Fillfactor Indica cuan llenas deben estar las páginas de un índice
0: 100% de todas las páginas (Read Only)
100: 100% de las páginas hoja
Padd index Indica cuan llenas deben estar las páginas intermedias
Se usa junto a fillfactor
20
Fil l Factor
21
Anális is de las es tadíst icas de una tabla
Muestra la información estadística de una tabla que usa el
SQL Server para seleccionar el mejor plan
Densidades Define la selectividad de un índice
Density
All density
Histograma
22
Planes de e jecución
SET SHOWPLAN_TEXT
Muestra la información detallada del plan aproximado (no ejecuta la instrucción)
SET SHOWPLAN_ALL
Muestra la información detallada del plan aproximado y de los recursos utilizados (no ejecuta la
instrucción)
Análisis gráfico desde el Query Analyzer
Plan estimado (CTRL+L)
Plan ejecutado (CTRL+K)
23
Operadores
Operadores lógicos Describe la operación algebraica relacional usada para procesar una
sentencia
Operadores físicos Describe la implementación física del algoritmo usado para procesar
una sentencia
24
Arquitectura rendimiento y performance
Tuning del motor relacional del SQL Server
08/05/2009
5
Estadísticas de e jecución
Statistics time ON
Muestra información de tiempo en ms relativa al parsing, compilación y ejecución de cada sentencia
Indica que el proceso actualice la columna CPU de la tabla sysprecesses
No funcione en el modo FIBER (lightweight pooling ON)
Statistics IO ON
Muestra información relacionada con el acceso a disco
Table
scan count
logical reads
physical reads
read-ahead reads
25
Sugerencias
Crear primero el Clustered y luego los non clustered
Borrarlos en el orden inverso
Crear la menor cantidad de índices
Hacer los índices tan pequeños como se pueda, especialmente en los clustered
Crear índices non clustered que sean altamente selectivos, UNIQUE de ser posible
26
Cover index
Cover index Todos los datos requeridos están en el índice
No accede a las paginas de datos (sin Bookmark Lookup)
Solo para índices Non Clustered
Actúa como un índice clustered (efectividad y ordenamiento)
Es costoso mantenerlos
27
Index intersection
Permite el Uso de más de un índice por tabla y por query
Obtienen un subconjunto que es la intersección de
múltiples índices
28
Index Join
Utiliza solo índices para satisfacer la consulta mediante técnicas de join
Usa técnicas de Index intersection
Covering index
29
SARGS (search argument)
Limitan las búsquedas mediante un valor exacto o rango
No puede haber dos columnas en la condición0/
columna (Operador) <constante o variable>
Operadores =, >, <, =>, <=, BETWEEN, y LIKE (con restricciones)
Un SARG puede tener varias condiciones con AND si pueden ser resueltas por un índice
Un OR puede dar lugar a dos SARG
30
Arquitectura rendimiento y performance
Tuning del motor relacional del SQL Server
08/05/2009
6
Otras consideraciones
Heurísticas usadas cuando no hay estadísticas disponibles = 10%
> 30%
< 30%
BETWEEN 10%
Constraints Pueden provocan accesos adicionales para su verificación
31
Tipos de jo in
Hash: Es efectivo si Ambos conjuntos difieren de tamaño pero no tienen ordenamiento por las columnas del join
En resultados intermedios no indexados
Merge: Es efectivo si Los conjuntos están ordenados por la columna del join
Uno de los conjuntos no esta ordenado pero ambos son del mismo tamaño (Se realiza un SORT)
Nested loops: Es efectivo Cuando uno de los conjuntos del join es muy chico (< 10 reg)
32
Conceptos de índices
Las tablas sin clustered index tienen una fila en sysindexes con indid = 0
Las tablas con clustered index tienen una fila en sysindexes con indid = 1
Las tablas con nonclustered indexes tienen una fila en sysindexes con indid >= 2
Una tabla nunca tendrá indid = 0 e indid = 1 a la vez en sysindexes !
33
Estadísticas
Las estadísticas también se almacenan como
nonclustered indexes en sysindexes con indid >= 2 !!
Se almacenan en la columna StatsBlob
Cuantas más estadísticas haya en una tabla, menos
cantidad de índices se podrán crear !!
34
Resumiendo
35
Valor en indid
Sin clustered 0
Con clustered 1
Non-clustered y estadísticas 2 - 250
Columna text / ntext / image 255
Interacción de las Transacciones
36
Cliente #2Cliente #1
SQL
Server
Cliente #3
Arquitectura rendimiento y performance
Tuning del motor relacional del SQL Server
08/05/2009
7
Niveles de Ais lamiento
37
READ UNCOMMITTED
READ COMMITTED (default)
REPEATABLE READ
SERIALIZABLE
Posibles problemas
38
Dirty
Read
Non-
Repeatable
Read
PhantomsConflicto en
Update
Read
UncommittedSi Si Si No
Read Committed No Si Si No
Repeatable
ReadNo No Si No
Serializable No No No No
Cambio de l nivel de a is lamiento
Permanece en vigencia hasta que la conexión se cierre o
se lo cambie nuevamente
39
SET TRANSACTION ISOLATION LEVEL { READ UNCOMMITTED| READ COMMITTED| REPEATABLE READ| SNAPSHOT| SERIALIZABLE}
Cambio de l nivel de a is lamiento
40
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITED
SELECT …
UPDATE …INSERT …
…
SET TRANSACTION ISOLATION LEVEL READ COMMITEDSELECT …
UPDATE …INSERT …
…
READ UNCOMMITTED
Especifica que las instrucciones pueden leer filas que han
sido modificadas por otras transacciones pero todavía no
se han confirmado.
41
READ COMMITTED
Especifica que las instrucciones no pueden leer datos que
hayan sido modificados, pero no confirmados, por otras
transacciones. Esto evita las lecturas no actualizadas.
Otras transacciones pueden cambiar datos entre cada
una de las instrucciones de la transacción actual, dando
como resultado lecturas no repetibles o datos ficticios.
Esta opción es la predeterminada para SQL Server.
42
Arquitectura rendimiento y performance
Tuning del motor relacional del SQL Server
08/05/2009
8
REPEATABLE READ
Especifica que las instrucciones no pueden leer datos que
han sido modificados pero aún no confirmados por otras
transacciones y que ninguna otra transacción puede
modificar los datos leídos por la transacción actual hasta
que ésta finalice.
43
SERIALIZABLE
Las instrucciones no pueden leer datos que hayan sido modificados, pero aún no confirmados, por otras transacciones.
Ninguna otra transacción puede modificar los datos leídos por la transacción actual hasta que la transacción actual finalice.
Otras transacciones no pueden insertar filas nuevas con valores de clave que pudieran estar incluidos en el intervalo de claves leído por las instrucciones de la transacción actual hasta que ésta finalice.
44
SNAPSHOT (2005)
Especifica que los datos leídos por cualquier instrucción de una transacción vean la versión coherente, desde el punto de vista transaccional, de los datos existentes al comienzo de la transacción. La transacción únicamente puede reconocer las modificaciones de datos confirmadas antes del comienzo de la misma. Las instrucciones que se ejecuten en la transacción actual no verán las modificaciones de datos efectuadas por otras transacciones después del inicio de la transacción actual. El efecto es el mismo que se obtendría si las instrucciones de una transacción obtuviesen una instantánea de los datos confirmados tal como se encontraban al comienzo de la transacción.
45
Equiva lencia nivel de a is lamiento
Locking H ints
R E A D U N C O M M I TTE D
R E A D C O M M I TTE D
R E P E A TA B L E R E A D
S E R I A L I ZA B L E
N O L O C K o R E A D U N C O M M I TTE D
R E A D C O M M I TTE D
R E P E A TA B L A R E A D
H O L D L O C K
46
SELECT * FROM MI_TABLA WITH (NOLOCK)
Modos de las transacciones
47
Modo
Implícito
Explícito
(default)
Transacción Implícita
Transacción Explícita
SET IMPLICIT_TRANSACTIONS { ON / OFF }
Características
Tipo de lockeo adquirido (Lock mode)
Unidad de datos lockeada (Lock resource)
Duración del lockeo (Lock duration)
48
Estos datos se mantienen en la
pseudo-tabla SysLockInfo
Arquitectura rendimiento y performance
Tuning del motor relacional del SQL Server
08/05/2009
9
Tipos de locks adquiridos
(Lock mode)
49
S hare – „S ‟
E xc lus ive – „X‟
U pdate – „U ‟
I n tent – „ IS ‟ / „ I X‟ / „ IU ‟
Unidad de datos lockeada (Lock
resource) R o w
P a g e
E x t e n t
Ta b l e
I n d e x k e y
R a n g e i n d e x k e y
50
Los Extents se lockean en operaciones de grow de tablas o índices.Tienen lugar dependiendo de la existencia o no de un clustered index.
Duración de los locks
51
Lock
Mode
Read
Committed
Repeatable
Read
Serializable
Share Hasta que los
datos se leen y
procesan
Hasta el final de la
transacción
Hasta el final de la
transacción
Update Hasta que los datos se
leen y procesan, a
menos que sea
escalada a Exclusive y
duran hasta el final de la
transacción
Hasta el final de la
transacción
Hasta el final de la
transacción
A menos que sea
escalada a
Exclusive
Exclusive Hasta el final de la
transacción
Hasta el final de la
transacción
Hasta el final de la
transacción
sp_lock
52
EXEC sp_lock [ [ @spid_1] , [@spid_2] ]
EXEC sp_lock @@spid
Compatibil idad
53
Modo actualmente existente
Modo solicitado IS S U IX SIX X
Intent Share (IS) SI SI SI SI SI NO
Shared (S) SI SI SI NO NO NO
Update (U) SI SI NO NO NO NO
Intent Exclusive (IX) SI NO NO SI NO NO
Shared con Intent
Exclusive (SIX)SI NO NO NO NO NO
Exclusive NO NO NO NO NO NO
Otros t ipos de locks
B ulk Update y Schema
54
Lock
Bulk Update
Schema
Stability (Sch-S)
Modification (Sch-M)
Arquitectura rendimiento y performance
Tuning del motor relacional del SQL Server
08/05/2009
10
Range locks
Solamente aplica en el SERIALIZABLE ISOLATION LEVEL
Afecta un rango de claves sin incluir el inicio.
Ejemplo en T-SQL sería:NOMBRE >‟JORGE‟ AND NOMBRE <=
„JUAN‟
55
Escalamiento automático de locks
SQL Server escalará los locks que sean posibles cuando el uso de los mismos supere
el 40% de la memoria destinada a ellos
Para modificar esto utilizar sp_configure „locks‟, valor
Optimizer Hints
RowLock
PageLock
TabLock
TabLockX
56
Latches
Mantienen la consistencia de los datos mientras éstos son
leídos
Raramente se ven errores 844 y 845
Ver el artículo 310834 en http://support.microsoft.com
57
Controlando los locks
Niveles de aislamiento / ISOLATION LEVEL
SET LOCK_TIMEOUT (nuevo en SQL Server 7.0)
Error 1222 es time-out de lock pero no hace ROLLBACK !
Setear SET XACT_ABORT ON
READPAST Locking Hint (solo para SELECT)
58
Deadlocks
59
SQL Server
Databases
SPID 1
SPID 2
Error con deadlocks-
60
Server: Msg 1205, …
Transaction (Process ID xxx) was deadlocked with another process
and has been chosen as deadlock victim. Rerun the transaction.
SET DEADLOCK_PRIORITY { LOW / NORMAL /
@variable_char }
Arquitectura rendimiento y performance
Tuning del motor relacional del SQL Server
08/05/2009
11
Controlando los deadlocks
61
Utilizar el trace-flag
1204 para registrar en el
Log de errores de SQL
Server todos los dead-
locks.
Trace f lags
DBCC TRACEON ( #traza [ ,...n ] )
DBCC TRACESTATUS ( #traza [ ,...n ] )
DBCC TRACEOFF ( #traza [ ,...n ] )
62
Análisis de Performance
Trace Flags – Otra forma de usarlos …
Como evitar deadlocks
Mantener las transacciones lo mas cortas posibles
Usar transacciones solamente si son necesarias
Usar el mínimo nivel de aislamiento necesario
No permitir interacción con los usuarios dentro de una transacción
No utilizar recursos innecesariamente
Usar „Row Level Locking‟
Acceder los recursos en el mismo orden
Utilizar los índices de manera correcta
63
C LR
SQL Server 2005
Objetivos de l SQL Server 2005
Se tomaron en cuenta en el siguiente orden
Seguridad
Confiabilidad
Performance
65
Como funciona
66
Assembly:
“TaxLib.dll”
Build
SQL Server
SQL Data Definition: create assembly …
create function …
create procedure …
create trigger …
create type …SQL Queries: select
sum(tax(sal,state) )
from Emp
where county = ‘King’
Runtime en el SQL
Server
public void Tax (){
……..
}´
Arquitectura rendimiento y performance
Tuning del motor relacional del SQL Server
08/05/2009
12
CLR Host y Assembly
Cualquier proceso que carga el runtime .NET y corre el
código en un entorno manejado ASP.NET
Otros
Ahora el SQL Server
El Assembly es la unidad de despliegue
67
Cambios en e l CLR
.NET 1.1
Diseñado para IIS
Los procesos pueden ser matados (kill)
Se puede crear libremente threads (hilos de ejecución) y pedir memoria
.NET 2.0
Diseñado para SQL Server 2005
Los procesos NO pueden ser matados
El Host puede reusarse a las peticiones de memoria o de nuevos threads
68
Integración del CLR
69
Windows OS
SQL OS Layer
SQL Engine
Hosting
Layer
CLR
P r o ve e c o o r d i n a c i ó n y c o n t r o l
d e :
Carga de Assemblies
Gestión de memoria
Modelo de seguridad
Confiabilidad
Threads y Fibers
Detección de Deadlock
Contexto de ejecucion
Novedades de l .NET 2 .0
70
CLR: Gestión de memoria
Todas las asignaciones de memoria del CLR se realizan a través del SQL Server
La mayoría de la memoria del CLR (GC Heap) proviene de la memoria multi-page (fuera del Buffer-pool o “MemToLeave”) La opción Max server memory no cubre la memoria del CLR
Si hay poca memoria dispnible el SQL le pide al CLR que inicie el Garbage Collector
71
CLR: Gestión de memoria (2)
DMV (dynamic management view) Para monitorear el uso
de memoria del CLR Sys.dm_os_memory_clerks
Sys.dm_os_memory_objects
Perf counters: # GCs, Cantidad de memoria asignada
SQL-OS gestión de memoria http://blogs.msdn.com/slavao/archive/2005/02/11/371063.aspx
72
Arquitectura rendimiento y performance
Tuning del motor relacional del SQL Server
08/05/2009
13
CPU: threads y s incronización
Todos los threads “managed” están mapeados a tareas gestionadas por el scheduler del SQL Server El Schedule del SQL es Cooperativo
Excepto: los threads del GC
El SQL Scheduler detecta las tareas que no liberan (managed o T-SQL) y las castiga Fuerza a la tarea a parar, la pone al final de la cola de proceso y le
hace perder algunas vueltas
73
CPU: threads y s incronización
Callback al SQL Server en P/Invoke (cuando se llama código nativo)
Cuando cambia al modo pre-emptive
Los pedidos de lock desde el CLR se realizan a través del
SQL Server lock manager Hay una detección unificada de deadlock entre los locks del CLR y del
SQL nativo
74
Application Domain
App-domains Mecanismo del CLR para el aislamiento y la descarga de código
SQL Server usa dos clases de app-domains DDL-time: temporario. Usado durante el DDL para verificación
Execution time: Cuando se ejecuta el código
Granularidad Uno por cada dueño de un assembly en cada base de datos
Todos los assemblies de un mismo dueño están en el mismo app domain
75
APPDomains
No se permite la llamada entre distintos app domain
Los datos y el código que tienen como dueño a un usuario esta aislado de los de los otros usuarios a menos que se habilite el acceso
Se puede asignar permisos en el create assembly
El dueño de una assembly puede asignar el permiso de referencia del mismo
76
Comparación T-SQL CLR
77
T-SQL CLR
User Defined Functions X X
Stored Procedures X X
Triggers X X
User Defined Types X
Aggregates X
Clases de l framework disponibles
La mayoria de las System.* incluyendo: mscorlib.dll
system.dll
system.data.dll
system.xml.dll
system.security.dll
No estan disponibles las clases de uso interactivo como por ejemplo: system.windows.forms.dll
system.drawing.dll
system.web.dll
78
Arquitectura rendimiento y performance
Tuning del motor relacional del SQL Server
08/05/2009
14
Código Manajado
No esta habilitado por default, se debe configurar al servidor para que lo pueda usar
Se debe usar DML para cargar los assembly y registrar los objetos
Solo pueden ser DLL
Se puede cargar desde un archivo o de un bitstream
Se requiere tener suficientes permisos
Solo funciona con seguridad integrada
79
Code Access Security (CAS)
SAFE
Solo se tiene acceso al CLR
No se puede acceder a recursos externos, gestión de threads, código unsafe o interop
EXTERNAL_ACCESS
Además se puede acceder a recursos externos al .NET Framework
Por ejemplo . EventLog, FileSystem y la red
Sin acceso a código unsafe o interop
UNSAFE
Sin restricciones es similar a los extended stored procedures
80
Ejemplos de CAS
81
CREATE ASSEMBLY ExampleYukonFROM 'd:\ExampleYukon.dll'
WITH PERMISSION_SET = SAFE
CREATE ASSEMBLY ExampleYukonFROM 'd:\ExampleYukon.dll'
WITH PERMISSION_SET = EXTERNAL_ACCESS
CREATE ASSEMBLY ExampleYukonFROM 'd:\ExampleYukon.dll'
WITH PERMISSION_SET = UNSAFE
Host Protection Attr ibutes (HPAs)
El CLR proporciona un mecanismo para marcar APIs
manejadas que son parte del .NET con ciertas cualidades que
puedan ser de interés a un host del CLR.
Dadas estas cualidades, el host puede especificar una lista de
HPAs que se deba deshabilitar en el ambiente. En este caso, el
CLR negará los intentos del código del usuario en llamar APIs
que son registradas por los HPAs en la lista de prohibidas.
82
Conjuntos de seguridad
Permission set Safe External access Unsafe
Code Access Security Execute only
Execute +
access to external
resources irrestricto
Programming model restrictions SI SI Sin restricciones
Verifiability requirement SI SI No
Ability to call native code No No SI
83
Creación de objetos en e l CLR
Para definir el tipo se usan atributos [SqlProcedure]
[SqlFunction]
[SqlUserDefinedType]
[SqlUserDefinedAggregate]
Etc.
Desde VS se puede hacer el deployment directamente
Para definir comportamiento también se usan atributos
84
Arquitectura rendimiento y performance
Tuning del motor relacional del SQL Server
08/05/2009
15
System.Data.SqlTypes:
L o s t i p o s d e d a t o s d e l C L R n o s o p o r t a n N U L L
S ys t e m . D a t a . S q l Typ e s s o p o r t a n N U L L
Managed SQL Type SQL Sever Type .NET TypeSqlBoolean Bit Bool
SqlByte Tinyint Byte
SqlInt32 Int Int
SqlInt64 Bigint Int64
SqlString
(variable length)
Char, Varchar, Nchar, Nvarchar,
Text, Ntext
String
SqlChars Char, Varchar, Nchar, Nvarchar,
Text, Ntext
Char[]
85
Procedimientos a lmacenados y
funciones en e l CLR
Creación de Stored Procedures
La clase debe ser publica
El método expuesto debe ser publico y estatico
No puede ser una clase anidada
87
public class SqlClr {public static void Obtener() {// Put your code here
}}
C reación de Stored Procedures (2 )
Stored Procedure DML Usa una sentencia CREATE PROCEDURE
AS EXTERNAL NAME Permite usar el previamente assembly cargado
88
CREATE PROCEDURE <Procedure Name>AS EXTERNAL NAME <Assembly Identifier>.<Type Name>.<Method Name>
CREATE PROCEDURE MyProcAS EXTERNAL NAME ExampleYukon.SqlClr.MyProc
Parámetros de Stored Procedures
89
// Input Parameterpublic static void InputProcedure(int number) {}
CREATE PROCEDURE InputProcedure
@number int
AS EXTERNAL NAME ExampleYukon.SqlClr.InputProcedure
// Output Parameterpublic static void OutputProcedure(out int number) {number = 42;
}
CREATE PROCEDURE OutputProcedure
@number int OUTPUT
AS EXTERNAL NAME ExampleYukon.SqlClr.OutputProcedure
Parámetros de Stored Procedures (2 )
90
// In/Out Parameter
public static void InOutProcedure(ref int number) {
number = 42;
}
CREATE PROCEDURE InOutProcedure@number int OUTPUT
AS EXTERNAL NAME ExampleYukon.SqlClr.InOutProcedure
// Return Parameter
public static int ReturnProcedure() {
return 42;
}
CREATE PROCEDURE ReturnProcedureAS EXTERNAL NAME ExampleYukon.SqlClr.ReturnProcedure
Arquitectura rendimiento y performance
Tuning del motor relacional del SQL Server
08/05/2009
16
Funciones CLR
Son similares a las funciones T-SQL
Escritas en cualquier lenguaje .NET Decoradas con el atributo [SqlFunction]
Hay que cargar el assembly en la base de datos
Se debe definir la función a partir de un assembly
Limites Los mismos que los CLR SP
91
Funciones CLR (2)
92
CREATE FUNCTION <Function Name>(<Parameter List>) RETURNS <Return Type>AS EXTERNAL NAME <Assembly Identifier>.<Type Name>.<Method Name>
CREATE FUNCTION Addition(@x int,@y int
)RETURNS intAS EXTERNAL NAME ExampleYukon.SqlClr.Addition
Funciones CLR (2)
[SqlFunction]: Permite al SQL saber que tipo de función es IsDeterministic
IsPrecise
DataAccess
SystemDataAccess
93
[SqlFunction]public static int Suma(int x, int y) {return x + y;
}
Triggers CLR
94
CREATE TRIGGER <TriggerName>ON <Table or View> FOR <INSERT|UPDATE|DELETE>AS EXTERNAL NAME <Assembly Identifier>.<Type Name>.<Method Name>
CREATE TRIGGER AddAuthorON author FOR INSERTAS EXTERNAL NAME ExampleYukon.SqlClr.AddAuthor
CREATE TRIGGER <TriggerName>ON <ALL_SERVER or DATABASE> <FOR or AFTER> <EventName>AS EXTERNAL NAME <Assembly Identifier>.<Type Name>.<Method Name>
CREATE TRIGGER AddUserON DATABASE FOR CreateUserAS EXTERNAL NAME ExampleYukon.SqlClr.AddUser
Triggers CLR (2)
TriggerContext nos da información del Trigger
ColumnsUpdates nos dice que columnas cambiaron
La clase debe retornar void
95
Triggers CLR (3)
96
public static void AddAuthor() {SqlTriggerContext ctx = SqlContext.TriggerContext;
if (ctx.TriggerAction == TriggerAction.Insert) {string msg = "";// Get the data associated with Eventfor (int x = 0; x < ctx.ColumnsUpdated.Length; ++x) {
msg += string.Format("Column {0} {1} been updated{2}", x, (ctx.ColumnsUpdated[x] ? "has" : "has not"), Environment.NewLine)
}
}}
Arquitectura rendimiento y performance
Tuning del motor relacional del SQL Server
08/05/2009
17
Custom Aggregates
97
CREATE AGGREGATE <Aggregate Name>( @param <SQL Type> )RETURNS <SQL Type>EXTERNAL NAME <assembly>.<CLR Type>
CREATE AGGREGATE SD( @value float )RETURNS floatEXTERNAL NAME ExampleYukon.SD
Custom Aggregates (2)
Clase CLR La clase es llamada durante la agregación
Debe ser serializable
Debe implementar métodos predefinidos Init
– Se lo llama para inicializar la agregación
Accumulate– Es llamado una vez por cada fila agregada pasando por valor el dato de la columna que es
agregada.
Merge– Para mezclar resultados intermedios de la agregación
Terminate– Es llamado al final para obtener el valor final de la agregación
98
Ejemplo
99
[Serializable][SqlUserDefinedAggregate(Format.UserDefined, MaxByteSize=8000)]public class StdDev : IBinarySerialize {List<SqlDouble> values = new List<SqlDouble>();
public void Init() { }
public void Accumulate(SqlDouble Value) { values.Add(Value); }
public void Merge(StdDev grp) { values.AddRange(grp.values); }
public SqlDouble Terminate() { /* calcula StdDev */ }
void IBinarySerialize.Read(BinaryReader r) { }
void IBinarySerialize.Write(BinaryWriter w) { }
}
Tipo de dato definidos por e l usuario
Pre-SQL Server 2005 eran alias
SQL Server 2005 Se pueden crear nuevos tipos con el CLR
El comportamiento esta embebido en el código del tipo
100
EXEC sp_addtype N'age', N'tinyint', N'not null'GO
CREATE RULE age_rangeAS@age >= 0 AND @age <=140GO
EXEC sp_bindrule N'age_range', N'age'GO
Tipo de dato definidos por e l usuario (2 )
Requerimientos Soportar el concepto de Null (INullable)
Soportar la conversión hacia y desde String
Soportar la serialización
Soportar un constructor por default
Respetar las reglas de nombres (128 caracteres máxímo)
101
Tipo de dato definidos por e l usuario (3 )
Registrando un UDT usando CREATE TYPE
102
CREATE TYPE <database type name>EXTERNAL NAME <assembly name>.<CLR type name>
CREATE TYPE PointEXTERNAL NAME ExampleYukon.Point
Arquitectura rendimiento y performance
Tuning del motor relacional del SQL Server
08/05/2009
18
Tipo de dato definidos por e l usuario (4)
Ejemplo:
103
[Serializable][SqlUserDefinedType(Format.UserDefined, MaxByteSize=8)]public class Point : INullable, IBinarySerialize {bool isNull = false;int x;int y;
// Required constructorpublic Point() : this(0, 0) {}
public Point(int x, int y) {this.x = x;this.y = y;
}// ...
}
Guía de uso del CLR
Cuando usar T-SQL
Para acceder a datos Es mejor
Es generalmente más rápido
Requiere escribir menos código
No se requiere aprender a programar en un lenguaje del CLR
105
Cuando usar e l CLR
Cuando hay funciones que requieren mucho cálculo es
más rápido
Para funciones escalares
Funciones de agregación definidas por el usuario
Para requerimientos similares a los cursores
106
Mid Tier vs . Data Tier
Tener el SQLCLR no significa mover toda la logica de negocio al SQL Server
Los mismos compromisos de siempre Reducir el transporte de datos y los round trips vs. agregar lógica y carga
al SQL Server
Buenos candidatos Validación de datos centralizada
Round-trips frecuentes
Procesar una gran cantidad de datos para obtener solo un resultado pequeño
107