View
778
Download
3
Category
Preview:
Citation preview
Compresión en SQL Server 2008
Enrique Catalá
Solid Quality Mentors
ecatala@solidq.com
Compresión en SQL Server 2008Agenda
•Motivación
•Aproximaciones en SQL Server 2008
•Backup comprimidos
•Compresión de datos
• FILA
• PÁGINA
•Cómo estimar el ahorro
•Cómo aplicar compresión
•A quién aplicar compresión
Compresión en SQL Server 2008Motivación
• Cada día se almacena:
• Más información – Terabytes con cierta frecuencia
• Más variopinta – imágenes, videos, audio, gráficos, mapas
• Retos de grandes BDs
• Tamaño de base de datos
• Manejabilidad de la BD (backup, índices, chekdb, …)
• Mecanismo: compresión
• A nivel de fichero:
o NTFS
o BD: backups de base de datos
o A nivel de OLTP Sería complicado de manejar comprimir/descomprimir trozos grandes
• A nivel de fila / página:
o compresión/descompresión de trozos pequeños de información
Compresión en SQL Server 2008Motivación
•Si reducimos la información almacenada
• Tablas/índices más pequeños
o Más fácil de gestionar
• Ficheros más pequeños
o Más fácil de copiar
• Se tiende a guardar demasiada información
• Otros fabricantes ya lo cubren:
Almacenamiento CPU Mejora
Rendimiento
Oracle -29% +10% +10%
DB2 -39% +10% +6%
Compresión en SQL Server 2008
Aproximaciones
•A nivel de fichero
• Compresión de BACKUP
•A nivel de datos
• Ninguno (como hasta ahora*)
• Compresión de fila – ROW
• Compresión de página – PAGE
* Vardecimal cubierto desde SQL 2005 SP2
Compresión en SQL Server 2008Aproximación– BACKUP
•BACKUP comprimido (Ratios 5:1)
• Depende de los datos
• Similar a otros fabricantes. Algoritmo propietario
• Resultados (para BACKUP y RESTORE)
o Menos I/O y menos tiempo
o Más CPU
– Depende de carga OLTP, pero asumible a partir de 4 Cores
•Todos pueden RESTORE con compresión
• Sólo Enterprise Edition BACKUP con compresión
Compresión en SQL Server 2008BACKUP
• Sintaxis:• BACKUP DATABASE ... WITH COMPRESSION
• Por defecto deshabilitado• EXEC sp_configure 'backup compression default', '1'
• Rendimiento real* para AdventureWorks:
• Sin compresión: 131 segundos (2,685 Mb/s) – 361 Mb
• Con compresión: 49 segundos (7,081 Mb/s) – 44 Mb
• Ratio 8:1 en tamaño
• Ratio 2.6:1 en tiempo
• Compresion NTFS: 600 segundos – 117 Mb (posterior)
• Compresión NTFS: 270 segundos – 117 Mb
• Cálculo del rendimiento real en vuestros sistemas:• SELECT backup_size/compressed_backup_size FROM msdb..backupset;
* Virtual Server 2005 R2 800Mb Ram, W2003 R2, HP dv9000
DEMO
Compresión de
backups
Compresión en SQL Server 2008
Consideraciones compresion BACKUP
• No es posible tener en un mismo conjunto, BACKUPS
comprimidos y descomprimidos
• Uso intensivo de CPU. Podemos limitar su impacto
creando un resource pool que limite el uso de CPU a
un 20% como máximo
• Versiones anteriores de SQL Server no pueden
restaurar backups comprimidos
• No es necesario especificar nada en el RESTORE
Compresión en SQL Server 2008Formatos de compresión – ROW
•Compresión a nivel de fila
•Eficiencia en almacenamiento de cada columna
• Conceptualmente, casi todas las columnas son de longitud
variable.
• Nulos de longitud fija = nada de espacio
•Arreglar “errores” de elección de tipos de datos:
• Smallint, int, bigint, decimal, numeric, smallmoney, money
• Datetime, datetime2, timestamp
• Char, nchar
Compresión en SQL Server 2008
Compresión de filas: Consideraciones
•Se puede aplicar a:
• Tablas almacenadas como HEAP
• Tablas almacenadas como índices agrupados
• Índices no agrupados
• Vistas indexadas
• Tablas e índices particionados (inclusive de forma independiente cada partición)
• La compresión no se activa en los índices no agrupados de forma automática
• La compresión no varia al crear un índice agrupado sobre un HEAP
• OJO! No soluciona la fragmentación…REINDEXA!
• Microsoft® SQL Server™ 2005 Service Pack 2 (SP2)
• VarDecimal
• Habilita que valores decimales puedan ser almacenados en tamaño variable
• Máxima precisión requería 17 bytes!!!
DateId CarrierTracking OfferID PriceDisc
20070601 4911-403C-98 10 0.00
20070601 4911-403C-99 10 0.00
20070602 6431 10 0.00
20070602 6431-4D57-83 10 0.00
20070602 6431-4D57-84 10 0.00
20070602 6431-4D57-85 10 100.00
20070603 4E0A-4F89-AE 10 0.00
DateId CarrierTracking OfferID PriceDisc
20070601 4911-403C-98 10 0.00
20070601 4911-403C-99 10 0.00
20070602 6431 10 0.00
20070602 6431-4D57-83 10 0.00
20070602 6431-4D57-84 10 0.00
20070602 6431-4D57-85 10 100.00
20070603 4E0A-4F89-AE 10 0.00
Compresión en SQL Server 2008Formatos de compresión – ROW
• Columnas de tamaño
fijo:
• SQL Server 2008 extiende
la lógica a tipos de datos
fijos:
o int, bigint, datetime, char, etc.
DateId CarrierTracking OfferID PriceDisc
20070601 4911-403C-98 10 0.00
20070601 4911-403C-99 10 0.00
20070602 6431 10 0.00
20070602 6431-4D57-83 10 0.00
20070602 6431-4D57-84 10 0.00
20070602 6431-4D57-85 10 100.00
20070603 4E0A-4F89-AE 10 0.00
DateId CarrierTracking OfferID PriceDisc
20070601 4911-403C-98 10 0.00
20070601 4911-403C-99 10 0.00
20070602 6431 10 0.00
20070602 6431-4D57-83 10 0.00
20070602 6431-4D57-84 10 0.00
20070602 6431-4D57-85 10 100.00
20070603 4E0A-4F89-AE 10 0.00
Compresión en SQL Server 2008Formatos de compresión – ROW
DEMO
• Vardecimal en
SQL 2005
• Compresión de
filas
Compresión en SQL Server 2008Formatos de compresión – PAGE
•A nivel de página
•Un paso más allá de compresión de fila
•Secuencia de 3 fases:
1. Compresión de fila (visto anteriormente)
2. Compresión de prefijos
3. Compresión de diccionario
•Cuanto más frecuencia, mayor eficiencia de
almacenamiento
Compresión en SQL Server 2008
Formatos de compresión – PAGE – Prefijos
•Segundo paso: reemplazo de prefijos
•Los prefijos se almacenan en un área de la página
(anchor record)
•Prefijos por columna
• Cada columna su lista de prefijos
• No se expande a todas las columnas
• Formato de almacenamiento
• Compresión mediante
prefijos:
• Lista de prefijos se
almacena en la página,
para prefijos comunes
para cada columna
• Cada valor encontrado
se reemplaza por:
o Token para el prefijo
o Sufijo para el valor
DateId CarrierTracking OfferID PriceDisc
20070601 4911-403C_9 8 10 0.00
20070601 4911-403C_9 9 10 0.00
20070602 6431-4D57_8 2 10 0.00
20070602 6431-4D57_8 3 10 0.00
20070602 6431-4D57_8 4 10 0.00
20070602 6431-4D57_8 5 10 100.00
20070603 4E0A-4F89_AE 10 0.00
DateId CarrierTracking OfferID PriceDisc
4911-403C_98 6431-4D57_82200706011
11
Compresión en SQL Server 2008Formatos de compresión – PAGE – Prefijos
2
2
2
2
3
9
3
4
5
4E0A-4F89-AE
8
8
7
7
7
7
7
12
11
11
11
11
10 0.00
2
2
2
2
2
2
2
3
3
3
3
3
3
100.00
• Compresión por
diccionario:
• Un valor común de
diccionario se almacena en
la página
• Los valores comunes son
reemplazados por tokens
• Un ratio de compresión de
2X a 7X para anticipación
de datos reales en tablas
de hecho en un almacén
de datos
DateId CarrierTracking OfferID PriceDisc
10
1 8 0.00
1 9 0.00
2 0.00
2 3 0.00
2 4 0.00
2 5 100.00
3 4E0A-4F89-AE 0.00
4911-403C-9C2 6431-4D57-8232007060111
1
1
1
1
1
1
1
2
2
3
3
3
3
4
DateId CarrierTracking OfferID PriceDisc
8
9
3
4
5 100.00
3 4E0A-4F89-AE
4911-403C-9C2 6431-4D57-8232007060111
1
1
1
1
1
1
1
2
2
3
3
3
3
4
22 10311 0.004
1
1
2
2
2
2
4
4
4
4
4
4
Compresión en SQL Server 2008Formatos de compresión – PAGE – Diccionario
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
Compresión en SQL Server 2008
Compresión de páginas: Consideraciones
•OJO! Compresión de página en HEAPs solo se
realiza con:
• BULK INSERT
• INSERT INTO…WITH(TABLOCK)
• REBUILD con reactivación de compresión por página
• Sentencias DML no se comprimen en HEAPs
• Nosotros hemos de lanzar un ALTER TABLE…WITH
COMPRESSION = PAGE
Compresión en SQL Server 2008
Compresión: Tipos de datos
• No afecta a:
• Varchar,nvarchar,image,text,ntext
• XML, FILESTREAM, varbinary y sql_variant
• Date, time (ya extremadamente compactos)
• Beneficio obtenido en otros tipos de datos:
• datetime, datetime2, datetimeoffset: ahorra 2 bytes si no almacena segundos
• char: solo ocupa lo necesario (como varchar)
• int, bigint,float, real,…: solo usa lo necesario
• binary: no almacena los ceros que puede evitar
• …
• En todos los tipos de datos, NULL y 0 no ocupan ningun byte
Compresión en SQL Server 2008Compresión de filas: Sintaxis
•Crear tabla con compresión habilitada (ROW ó
PAGE):
•Activar compresión en tabla ya existente:
•Desactivar compresión en tabla:
CREATE TABLE T1
(c1 int, c2 nvarchar(50) )
WITH (DATA_COMPRESSION = ROW);
CREATE TABLE PartitionTable1 (col1 int, col2
varchar(max)) ON myRangePS1 (col1)
WITH (
DATA_COMPRESSION = ROW ON PARTITIONS (1),
DATA_COMPRESSION = PAGE ON PARTITIONS (2 TO 4) );
ALTER TABLE T1 REBUILD WITH
(DATA_COMPRESSION = ROW);
ALTER TABLE T1 REBUILD WITH
(DATA_COMPRESSION = NONE);
DEMO
Compresión de
páginas
Compresión en SQL Server 2008BACKUP
•Resultados
Tiempo (segs) Espacio (kb)
Normal 23 54.90% 36.002 73.62%
51 136.468
Row 14 69.57% 37.159 70.08%
46 124.188
Page 6 64.71% 35.952 63.91%
17 99.616
Compresión en SQL Server 2008Consideraciones extra
• La compresión puede ser ONLINE u OFFLINE
• Compresión ONLINE con un único thread (paginación no beneficiada)
• En un HEAP, si existen índices no agrupados, han de ser recreados para apuntar a las nuevas ubicaciones de las páginas recién comprimidas
• Se soporta vardecimal por compatibilidad con SQL 2005, pero se considera depreciado debido a compresión por fila
• Convivencia vardecimal – ROW y PAGE compressionpero sin beneficio
Compresión en SQL Server 2008Consideraciones extra
•La compresión permite almacenar mas
información por página, pero no por fila
•SQL Server garantiza que la descompresión de
un dato es siempre posible (cabe)
• No se puede comprimir una tabla donde el tamaño
máximo de una fila + sobrecarga de compresión, superan
8060 bytes
Compresión en SQL Server 2008Resumen
•Motivación
•Aproximaciones en SQL Server 2008
•Backup comprimidos
•Compresión de datos
• FILA
• PÁGINA
•Cómo estimar el ahorro
•Cómo aplicar compresión
•A quién aplicar compresión
Recommended