Professional Documents
Culture Documents
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
13
14
Nonclustered
15
16
17
18
Arquitectura rendimiento y performance Tuning del motor relacional del SQL Server
08/05/2009
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
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)
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
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
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
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
Si No No No
Si Si No No
Si Si Si No
No No No No
38
37
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)
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
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
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
47
48
Arquitectura rendimiento y performance Tuning del motor relacional del SQL Server
08/05/2009
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
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
Exclusive
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
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
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
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.
10
Arquitectura rendimiento y performance Tuning del motor relacional del SQL Server
08/05/2009
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
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
C LR
63
Como funciona
public void Tax (){ .. }
Build
Assembly: TaxLib.dll
SQL Data Definition: create assembly create function create procedure create trigger create type
SQL Server
66
11
Arquitectura rendimiento y performance Tuning del motor relacional del SQL Server
08/05/2009
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
67
68
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
69
70
Si hay poca memoria dispnible el SQL le pide al CLR que inicie el Garbage Collector
71
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
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
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
T-SQL User Defined Functions Stored Procedures Triggers User Defined Types Aggregates X X X
CLR X X X X X
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
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
82
Conjuntos de seguridad
Permission set Safe External access
Execute + access to external resources
Execute only
irrestricto
SI
SI
Sin restricciones
Verifiability requirement
SI
SI
No
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
.NET Type
Bool Byte Int Int64 String Char[]
85
public class SqlClr { public static void Obtener() { // Put your code here } }
// 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
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
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
16
Arquitectura rendimiento y performance Tuning del motor relacional del SQL Server
08/05/2009
Custom Aggregates
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
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
Se pueden crear nuevos tipos con el CLR El comportamiento esta embebido en el cdigo del tipo
100
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)
101
102
17
Arquitectura rendimiento y performance Tuning del motor relacional del SQL Server
08/05/2009
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
105
106
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