18
Arquitectura rendimiento y performance Tuning del motor relacional del SQL Server 08/05/2009 1 Ing. Jose Mariano Alvarez [email protected] www.sqltotalconsulting.com Arquitectura rendimiento y performance Tuning del 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 Parte 2

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