You are on page 1of 18

Arquitectura rendimiento y performance Tuning del motor relacional del SQL Server

08/05/2009

Arquitectura rendimiento y performance Tuning del motor relacional del SQL Server
Ing. J os e M ariano A lvarez
j 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

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 ningn filegroup y no puede ser parte de ningn archivo. Un archivo es una unidad de paralelismo y de recuperacin. Los filegroups permiten asignar objetos a archivos especificos.

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

Filegroups (3)
Permite realizar stripping Usar un archivo por disco fsico 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
3 4

Pginas Indices

Arquitectura rendimiento y performance Tuning del motor relacional del SQL Server

08/05/2009

Extents

rboles B y Heap

Qu es un ndice ?

ndices clustered
Solo puede haber uno por tabla porque define el orden fsico Al crearlo se requiere el doble de espacio de la tabla porque se copian Recomendado para
Grandes resultados con Scan por rango Obtencin de datos ordenados

No recomendado
Columnas que se actualizan habitualmente Claves anchas

10

Clustered

Seek - Cluster

11

12

Arquitectura rendimiento y performance Tuning del motor relacional del SQL Server

08/05/2009

Range - Cluster

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

13

14

Nonclustered

Traversing Bookmark look-up

15

16

Seek Non Cluster

Range Non Cluster

17

18

Arquitectura rendimiento y performance Tuning del motor relacional del SQL Server

08/05/2009

Caractersticas de los ndices

Definicin de ndices

Unicidad
Ayuda a las estrategias de acceso

Fillfactor
Indica cuan llenas deben estar las pginas de un ndice
0: 100% de todas las pginas (Read Only) 100: 100% de las pginas hoja

Selectividad
Es el porcentaje de la tabla accedida Selectividad = filas accedidas / Total

Selectividad de un join
Es el nmero de filas de una tabla inner de la relacin con respecto a una tabla outer definida
19

Padd index
Indica cuan llenas deben estar las pginas intermedias Se usa junto a fillfactor

20

Fill Factor

Anlisis de las estadsticas de una tabla


Muestra la informacin estadstica 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

21

Planes de ejecucin

Operadores

SET SHOWPLAN_TEXT
Muestra la informacin detallada del plan aproximado (no ejecuta la instruccin)

Operadores lgicos
Describe la operacin algebraica relacional usada para procesar una sentencia

SET SHOWPLAN_ALL
Muestra la informacin detallada del plan aproximado y de los recursos utilizados (no ejecuta la instruccin)

Anlisis grfico desde el Query Analyzer


Plan estimado (CTRL+L) Plan ejecutado (CTRL+K)

Operadores fsicos
Describe la implementacin fsica del algoritmo usado para procesar una sentencia

23

24

Arquitectura rendimiento y performance Tuning del motor relacional del SQL Server

08/05/2009

Estadsticas de ejecucin

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 pequeos como se pueda, especialmente en los clustered Crear ndices non clustered que sean altamente selectivos, UNIQUE de ser posible

25 26

Statistics time ON
Muestra informacin de tiempo en ms relativa al parsing, compilacin y ejecucin 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 informacin relacionada con el acceso a disco
Table scan count logical reads physical reads read-ahead reads

Cover index

Index intersection
Permite el Uso de ms de un ndice por tabla y por query Obtienen un subconjunto que es la interseccin de mltiples ndices

Cover index
Todos los datos requeridos estn en el ndice No accede a las paginas de datos (sin Bookmark Lookup) Solo para ndices Non Clustered Acta como un ndice clustered (efectividad y ordenamiento) Es costoso mantenerlos

27

28

Index Join

SARGS (search argument)


Utiliza solo ndices para satisfacer la consulta mediante tcnicas de join Usa tcnicas de
Index intersection Covering index

Limitan las bsquedas mediante un valor exacto o rango No puede haber dos columnas en la condicin0/
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

29

30

Arquitectura rendimiento y performance Tuning del motor relacional del SQL Server

08/05/2009

Otras consideraciones

Tipos de join

Heursticas usadas cuando no hay estadsticas disponibles


= 10% > 30% < 30% BETWEEN 10%

Hash: Es efectivo si Merge: Es efectivo si


Ambos conjuntos difieren de tamao pero no tienen ordenamiento por las columnas del join En resultados intermedios no indexados Los conjuntos estn ordenados por la columna del join Uno de los conjuntos no esta ordenado pero ambos son del mismo tamao (Se realiza un SORT)

Nested loops: Es efectivo


Cuando uno de los conjuntos del join es muy chico (< 10 reg)

Constraints
Pueden provocan accesos adicionales para su verificacin
31 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

Estadsticas
Las estadsticas tambin se almacenan como nonclustered indexes en sysindexes con indid >= 2 !! Se almacenan en la columna StatsBlob Cuantas ms estadsticas haya en una tabla, menos cantidad de ndices se podrn crear !!

34

Resumiendo
Valor en indid Sin clustered Con clustered Non-clustered y estadsticas Columna text / ntext / image

Interaccin de las Transacciones


0 1 2 - 250 255
Cliente #1
35

SQL Server
Cliente #3

Cliente #2
36

Arquitectura rendimiento y performance Tuning del motor relacional del SQL Server

08/05/2009

Niveles de Aislamiento

Posibles problemas
Dirty Read NonRepeatable Read Phantoms Conflicto en Update

READ UNCOMMITTED READ COMMITTED (default)

Read Uncommitted Read Committed

Si No No No

Si Si No No

Si Si Si No

No No No No
38

REPEATABLE READ SERIALIZABLE

Repeatable Read Serializable

37

Cambio del nivel de aislamiento

Cambio del nivel de aislamiento


SET TRANSACTION ISOLATION LEVEL READ UNCOMMITED SELECT UPDATE INSERT SET TRANSACTION ISOLATION LEVEL READ COMMITED
SELECT UPDATE INSERT

Permanece en vigencia hasta que la conexin se cierre o se lo cambie nuevamente


SET TRANSACTION ISOLATION LEVEL { READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SNAPSHOT | SERIALIZABLE }
39

40

READ UNCOMMITTED

READ COMMITTED

Especifica que las instrucciones pueden leer filas que han sido modificadas por otras transacciones pero todava no se han confirmado.

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 transaccin actual, dando como resultado lecturas no repetibles o datos ficticios. Esta opcin es la predeterminada para SQL Server.
42

41

Arquitectura rendimiento y performance Tuning del motor relacional del SQL Server

08/05/2009

REPEATABLE READ

SERIALIZABLE
Las instrucciones no pueden leer datos que hayan sido modificados, pero an no confirmados, por otras transacciones. Ninguna otra transaccin puede modificar los datos ledos por la transaccin actual hasta que la transaccin actual finalice. Otras transacciones no pueden insertar filas nuevas con valores de clave que pudieran estar incluidos en el intervalo de claves ledo por las instrucciones de la transaccin actual hasta que sta finalice.

44

Especifica que las instrucciones no pueden leer datos que han sido modificados pero an no confirmados por otras transacciones y que ninguna otra transaccin puede modificar los datos ledos por la transaccin actual hasta que sta finalice.

43

SNAPSHOT (2005)

Equivalencia nivel de aislamiento Locking Hints

Especifica que los datos ledos por cualquier instruccin de una transaccin vean la versin coherente, desde el punto de vista transaccional, de los datos existentes al comienzo de la transaccin. La transaccin nicamente puede reconocer las modificaciones de datos confirmadas antes del comienzo de la misma. Las instrucciones que se ejecuten en la transaccin actual no vern las modificaciones de datos efectuadas por otras transacciones despus del inicio de la transaccin actual. El efecto es el mismo que se obtendra si las instrucciones de una transaccin obtuviesen una instantnea de los datos confirmados tal como se encontraban al comienzo de la transaccin.

R E A D U N C O M M I TTE D

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 HOLDLOCK

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
SELECT * FROM MI_TABLA WITH (NOLOCK)

45

46

Modos de las transacciones


SET IMPLICIT_TRANSACTIONS { ON / OFF }

Caractersticas
Tipo de lockeo adquirido (Lock mode) Unidad de datos lockeada (Lock resource) Duracin del lockeo (Lock duration)
Estos datos se mantienen en la pseudo-tabla SysLockInfo

Implcito Modo Explcito (default) Transaccin Explcita Transaccin Implcita

47

48

Arquitectura rendimiento y performance Tuning del motor relacional del SQL Server

08/05/2009

Tipos de locks adquiridos (Lock mode)

Unidad de datos lockeada (Lock resource)


S hare S E xclus ive X U pdate U Intent IS / IX / IU

Row Page Extent

Ta b l e Index key Range index key

Los Extents se lockean en operaciones de grow de tablas o ndices. Tienen lugar dependiendo de la existencia o no de un clustered index.

49

50

Duracin de los locks


Lock Mode
Share

sp_lock
EXEC sp_lock [ [ @spid_1] , [@spid_2] ]

Read Committed
Hasta que los datos se leen y procesan
Hasta que los datos se leen y procesan, a menos que sea escalada a Exclusive y duran hasta el final de la transaccin

Repeatable Read
Hasta el final de la transaccin Hasta el final de la transaccin

Serializable
Hasta el final de la transaccin Hasta el final de la transaccin A menos que sea escalada a Exclusive Hasta el final de la transaccin
51 52

Update

EXEC sp_lock @@spid

Exclusive

Hasta el final de la transaccin

Hasta el final de la transaccin

Compatibilidad
Modo actualmente existente
Modo solicitado
Intent Share (IS) Shared (S) Update (U) Intent Exclusive (IX) Shared con Intent Exclusive (SIX) Exclusive
IS S U IX SIX X

Otros tipos de locks B ulk Update y Schema

Bulk Update
SI SI SI SI SI NO SI SI SI NO NO NO

Lock Schema

Stability (Sch-S)

SI

SI

NO

NO

NO

NO

SI

NO

NO

SI

NO

NO

SI

NO

NO

NO

NO

NO

Modification (Sch-M)

NO

NO

NO

NO

NO

NO

53

54

Arquitectura rendimiento y performance Tuning del motor relacional del SQL Server

08/05/2009

Range locks
Solamente aplica en el SERIALIZABLE ISOLATION LEVEL Afecta un rango de claves sin incluir el inicio. Ejemplo en T-SQL sera:NOMBRE >JORGE AND NOMBRE <= JUAN

Escalamiento automtico 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

55

56

Latches
Mantienen la consistencia de los datos mientras stos son ledos Raramente se ven errores 844 y 845 Ver el artculo 310834 en http://support.microsoft.com

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)

57

58

Deadlocks
Databases SPID 1

Error con deadlocks 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 }


SQL Server SPID 2
59 60

10

Arquitectura rendimiento y performance Tuning del motor relacional del SQL Server

08/05/2009

Controlando los deadlocks

Trace flags
DBCC TRACEON ( #traza [ ,...n ] ) Trace Flags Otra forma de usarlos DBCC TRACESTATUS ( #traza [ ,...n ] ) DBCC TRACEOFF ( #traza [ ,...n ] )
Anlisis de Performance

Utilizar el trace-flag 1204 para registrar en el Log de errores de SQL Server todos los deadlocks.

61

62

Como evitar deadlocks


Mantener las transacciones lo mas cortas posibles Usar transacciones solamente si son necesarias Usar el mnimo nivel de aislamiento necesario No permitir interaccin con los usuarios dentro de una transaccin No utilizar recursos innecesariamente Usar Row Level Locking Acceder los recursos en el mismo orden Utilizar los ndices de manera correcta

SQL Server 2005

C LR

63

Objetivos del SQL Server 2005

Como funciona
public void Tax (){ .. }

Se tomaron en cuenta en el siguiente orden

Build
Assembly: TaxLib.dll

Seguridad Confiabilidad Performance

Runtime en el SQL Server

SQL Queries: select sum(tax(sal,state) ) from Emp


65

SQL Data Definition: create assembly create function create procedure create trigger create type

SQL Server
66

where county = King

11

Arquitectura rendimiento y performance Tuning del motor relacional del SQL Server

08/05/2009

CLR Host y Assembly

Cambios en el CLR

Cualquier proceso que carga el runtime .NET y corre el cdigo en un entorno manejado
ASP.NET Otros Ahora el SQL Server

.NET 1.1
Diseado para IIS Los procesos pueden ser matados (kill) Se puede crear libremente threads (hilos de ejecucin) y pedir memoria

.NET 2.0
Diseado para SQL Server 2005 Los procesos NO pueden ser matados El Host puede reusarse a las peticiones de memoria o de nuevos threads

El Assembly es la unidad de despliegue

67

68

Integracin del CLR


SQL Engine

Novedades del .NET 2.0

P r o ve e c o o r d i n a c i n y c o n t r o l de:
Carga de Assemblies Gestin de memoria Modelo de seguridad Confiabilidad Threads y Fibers Deteccin de Deadlock Contexto de ejecucion

CLR

Hosting Layer SQL OS Layer Windows OS

69

70

CLR: Gestin de memoria


Todas las asignaciones de memoria del CLR se realizan a travs del SQL Server La mayora de la memoria del CLR (GC Heap) proviene de la memoria multi-page (fuera del Buffer-pool o MemToLeave)

CLR: Gestin 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

La opcin 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

Perf counters: # GCs, Cantidad de memoria asignada SQL-OS gestin de memoria

http://blogs.msdn.com/slavao/archive/2005/02/11/371063.aspx
72

12

Arquitectura rendimiento y performance Tuning del motor relacional del SQL Server

08/05/2009

CPU: threads y sincronizacin

CPU: threads y sincronizacin

Todos los threads managed estn mapeados a tareas gestionadas por el scheduler del SQL Server
El Schedule del SQL es Cooperativo Excepto: los threads del GC

Callback al SQL Server en P/Invoke


(cuando se llama cdigo nativo) Cuando cambia al modo pre-emptive

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

Los pedidos de lock desde el CLR se realizan a travs del SQL Server lock manager
Hay una deteccin unificada de deadlock entre los locks del CLR y del SQL nativo

73

74

Application Domain

APPDomains
No se permite la llamada entre distintos app domain Los datos y el cdigo que tienen como dueo 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 dueo de una assembly puede asignar el permiso de referencia del mismo

75 76

App-domains
Mecanismo del CLR para el aislamiento y la descarga de cdigo SQL Server usa dos clases de app-domains
DDL-time: temporario. Usado durante el DDL para verificacin Execution time: Cuando se ejecuta el cdigo

Granularidad
Uno por cada dueo de un assembly en cada base de datos Todos los assemblies de un mismo dueo estn en el mismo app domain

Comparacin T-SQL CLR

Clases del framework disponibles


La mayoria de las System.* incluyendo:

T-SQL User Defined Functions Stored Procedures Triggers User Defined Types Aggregates X X X

CLR X X X X X

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

77

78

13

Arquitectura rendimiento y performance Tuning del motor relacional del SQL Server

08/05/2009

Cdigo 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, gestin de threads, cdigo unsafe o interop

EXTERNAL_ACCESS
Adems se puede acceder a recursos externos al .NET Framework Por ejemplo . EventLog, FileSystem y la red Sin acceso a cdigo unsafe o interop

UNSAFE
Sin restricciones es similar a los extended stored procedures

80

Ejemplos de CAS
CREATE ASSEMBLY ExampleYukon FROM 'd:\ExampleYukon.dll' WITH PERMISSION_SET = SAFE

Host Protection Attributes (HPAs)


El CLR proporciona un mecanismo para marcar APIs manejadas que son parte del .NET con ciertas cualidades que puedan ser de inters 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 cdigo del usuario en llamar APIs que son registradas por los HPAs en la lista de prohibidas.

CREATE ASSEMBLY ExampleYukon FROM 'd:\ExampleYukon.dll' WITH PERMISSION_SET = EXTERNAL_ACCESS

CREATE ASSEMBLY ExampleYukon FROM 'd:\ExampleYukon.dll' WITH PERMISSION_SET = UNSAFE


81

82

Conjuntos de seguridad
Permission set Safe External access
Execute + access to external resources

Creacin de objetos en el CLR


Unsafe

Para definir el tipo se usan atributos


[SqlProcedure] [SqlFunction] [SqlUserDefinedType] [SqlUserDefinedAggregate] Etc.

Code Access Security

Execute only

irrestricto

Programming model restrictions

SI

SI

Sin restricciones

Verifiability requirement

SI

SI

No

Ability to call native code

No

No

SI
83

Desde VS se puede hacer el deployment directamente Para definir comportamiento tambin se usan atributos

84

14

Arquitectura rendimiento y performance Tuning del motor relacional del SQL Server

08/05/2009

System.Data.SqlTypes:

Los tipos de datos del CLR no s oportan NULL 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
SqlBoolean SqlByte SqlInt32 SqlInt64 SqlString (variable length) SqlChars

Procedimientos almacenados y funciones en el CLR

SQL Sever Type


Bit Tinyint Int Bigint Char, Varchar, Nchar, Nvarchar, Text, Ntext Char, Varchar, Nchar, Nvarchar, Text, Ntext

.NET Type
Bool Byte Int Int64 String Char[]

85

Creacin de Stored Procedures


La clase debe ser publica El mtodo expuesto debe ser publico y estatico No puede ser una clase anidada

C reacin de Stored P rocedures (2 )


Stored Procedure DML
Usa una sentencia CREATE PROCEDURE AS EXTERNAL NAME Permite usar el previamente assembly cargado
CREATE PROCEDURE <Procedure Name> AS EXTERNAL NAME <Assembly Identifier>.<Type Name>.<Method Name> CREATE PROCEDURE MyProc AS EXTERNAL NAME ExampleYukon.SqlClr.MyProc
87 88

public class SqlClr { public static void Obtener() { // Put your code here } }

P armetros de Stored P rocedures


// Input Parameter public static void InputProcedure(int number) { } CREATE PROCEDURE InputProcedure @number int AS EXTERNAL NAME ExampleYukon.SqlClr.InputProcedure // Output Parameter public static void OutputProcedure(out int number) { number = 42; } CREATE PROCEDURE OutputProcedure @number int OUTPUT AS EXTERNAL NAME ExampleYukon.SqlClr.OutputProcedure

P armetros de Stored P rocedures (2 )


// 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 ReturnProcedure AS EXTERNAL NAME ExampleYukon.SqlClr.ReturnProcedure
89 90

15

Arquitectura rendimiento y performance Tuning del motor relacional del SQL Server

08/05/2009

Funciones CLR
Son similares a las funciones T-SQL Escritas en cualquier lenguaje .NET

Funciones CLR (2)


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 int AS EXTERNAL NAME ExampleYukon.SqlClr.Addition
91 92

Decoradas con el atributo [SqlFunction] Hay que cargar el assembly en la base de datos Se debe definir la funcin a partir de un assembly

Limites
Los mismos que los CLR SP

Funciones CLR (2)

Triggers CLR
CREATE TRIGGER <TriggerName> ON <Table or View> FOR <INSERT|UPDATE|DELETE> AS EXTERNAL NAME <Assembly Identifier>.<Type Name>.<Method Name> CREATE TRIGGER AddAuthor ON author FOR INSERT AS 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 AddUser ON DATABASE FOR CreateUser AS EXTERNAL NAME ExampleYukon.SqlClr.AddUser
93 94

[SqlFunction]: Permite al SQL saber que tipo de funcin es


IsDeterministic IsPrecise DataAccess SystemDataAccess
[SqlFunction] public static int Suma(int x, int y) { return x + y; }

Triggers CLR (2)


TriggerContext nos da informacin del Trigger ColumnsUpdates nos dice que columnas cambiaron La clase debe retornar void

Triggers CLR (3)


public static void AddAuthor() { SqlTriggerContext ctx = SqlContext.TriggerContext; if (ctx.TriggerAction == TriggerAction.Insert) { string msg = ""; // Get the data associated with Event for (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) } } }
95 96

16

Arquitectura rendimiento y performance Tuning del motor relacional del SQL Server

08/05/2009

Custom Aggregates

Custom Aggregates (2)


Clase CLR
La clase es llamada durante la agregacin Debe ser serializable Debe implementar mtodos predefinidos
Init Accumulate
Se lo llama para inicializar la agregacin Es llamado una vez por cada fila agregada pasando por valor el dato de la columna que es agregada.

CREATE AGGREGATE <Aggregate Name> ( @param <SQL Type> ) RETURNS <SQL Type> EXTERNAL NAME <assembly>.<CLR Type> CREATE AGGREGATE SD ( @value float ) RETURNS float EXTERNAL NAME ExampleYukon.SD
97

Merge Terminate
Para mezclar resultados intermedios de la agregacin Es llamado al final para obtener el valor final de la agregacin
98

Ejemplo
[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) { } }
99

Tipo de dato definidos por el usuario

Pre-SQL Server 2005 eran alias

EXEC sp_addtype N'age', N'tinyint', N'not null' GO CREATE RULE age_range AS @age >= 0 AND @age <=140 GO EXEC sp_bindrule N'age_range', N'age' GO

SQL Server 2005

Se pueden crear nuevos tipos con el CLR El comportamiento esta embebido en el cdigo del tipo
100

Tipo de dato definidos por el usuario (2 )

Tipo de dato definidos por el usuario (3 )

Requerimientos
Soportar el concepto de Null (INullable) Soportar la conversin hacia y desde String Soportar la serializacin Soportar un constructor por default Respetar las reglas de nombres (128 caracteres mxmo)

Registrando un UDT usando CREATE TYPE


CREATE TYPE <database type name> EXTERNAL NAME <assembly name>.<CLR type name>

CREATE TYPE Point EXTERNAL NAME ExampleYukon.Point

101

102

17

Arquitectura rendimiento y performance Tuning del motor relacional del SQL Server

08/05/2009

Tipo de dato definidos por el usuario (4)

Ejemplo:
[Serializable] [SqlUserDefinedType(Format.UserDefined, MaxByteSize=8)] public class Point : INullable, IBinarySerialize { bool isNull = false; int x; int y; // Required constructor public Point() : this(0, 0) { } public Point(int x, int y) { this.x = x; this.y = y; } // ... }
103

Gua de uso del CLR

Cuando usar T-SQL

Cuando usar el CLR


Cuando hay funciones que requieren mucho clculo es ms rpido Para funciones escalares Funciones de agregacin definidas por el usuario Para requerimientos similares a los cursores

Para acceder a datos


Es mejor Es generalmente ms rpido Requiere escribir menos cdigo No se requiere aprender a programar en un lenguaje del CLR

105

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 lgica y carga al SQL Server

Buenos candidatos
Validacin de datos centralizada Round-trips frecuentes Procesar una gran cantidad de datos para obtener solo un resultado pequeo
107

18

You might also like