Columnstore en SQL Server
Cómo utilizarlo en nuestros entornos OLTP
 Ingeniero Informático
 Microsoft Data Platform MVP
 Mentor en SolidQ
 Tuning y alta disponibilidad
Enrique Catalá Bañuls
ecatala@solidq.com
@enriquecatala
Real-time operational analytics
 Entorno donde conviven cargas mixtas OLAP y OLTP
 Mínimo impacto de usuarios de negocio atacando el
operacional
Arquitectura analítica tradicional
Aspectos clave
Implementacion compleja
Licenciamiento (dinero)
Latencia del dato en analitico
IIS Server
BI analysts
Real-time operational analytics
IIS Server
OLTP workload
Esto no reemplaza la
necesidad de entorno BI
No hay nada mas rápido que un cubo con
datos precalculados
Tampoco te va a ayudar cuando necesitas
análisis de multiples fuentes de datos
Columnstore
ROWSTORE
• Formato de fila
• Compresión opcional
• Devuelve todas las columnas del índice
• Arbol B balanceado
COLUMNSTORE
• Formato de columna
• Compresión requerida
• Devuelve solo las columnas referenciadas
• Cabecera y datos
Diferencias row-store vs columnstore
Imagen de Niko Neugebauer
Diferencias row-store vs columnstore
GetNext()
• Envia datos a la
CPU
• Implementado por
todos los
operadores
Row Mode
• Invocaciones
GetNext() fila a fila
• El habitual en OLTP
Batch Mode
• Invocaciones
GetNext() por ~900
filas
• Beneficios 10x-100x
• Requiere
columnstore
Carga de datos
• Carga sin preorden (PON ORDER BY!)
• batch_size
• >102400 directos a rowgroup
• <102400 carga a delta store (mal)
• Usa SIEMPRE bulk load sin TABLOCK
• Siempre minimamente logeado
• Soporta multithread
• NO PONGAS TABLOCK
Carga de datos
• Rowgroups pueden tener
• Desde 102.400
• Hasta 1.048.576
• Recuerda cargar con bulk insert….
• INSERT INTO <table-name> VALUES
(<set of values>) siempre inserta a
delta store
Rows to Bulk Load
Rows Added to the
Compressed Rowgroup
Rows
Added to
the Delta
Rowgroup
102,000 0 102,000
145,000 145,000
Rowgroup size: 145,000
0
1,048,577 1,048,576
Rowgroup size: 1,048,576.
1
2,252,152 2,252,152
Rowgroup sizes: 1,048,576,
1,048,576, 155,000.
0
Demo
Almacenamiento
Cargas de datos
Real-time operational analytics
AlwaysOn y columnstore
Aspectos clave
Se separa por tipología de carga, de forma que las
consultas analíticas aprovechen todavía major el
almacenamiento columnar
AlwaysOn Availability GroupCarga de trabajo
OLTP
Carga de trabajo
analítica
Tablas candidatas óptimas para NCCIs
+1M filas
Sufren muchas consultas
de agregados
Con múcho table scan
Con muchas columnas
• Mínimo para activarse
• analíticas
• Mucha casuística
• Dificiles índices
cobertura
Truco: Non-clustered columnstore index (NCCI)
B-tree index
Delta rowgroups
Non-clustered columnstore index
Deletebitmap
B-tree index • Actualizable desde SQL 2016
• No necesitas ningun otro índice para OLAP
• Se mantiene como cualquier índice
• No require cambios de aplicación
• Pueden ser filtrados
Truco: Compression delay
B-tree index
HOT
Delta
rowgroups
Non-clustered columnstore index
Deletebitmap
Control del tiempo de permanencia en delta:
-Max = 10080 (7 dias)
-Util for HOT/WARM (time based)
• < 6 hours – HOT (delta store)
OLTP workload
Demo
¿es buena idea migrar a SQL Server 2016+?
¿Diferencias entre standard y Enterprise?
Mantenimiento
Reorganize
Borra físicamente de un rowgroup si
>10% borrado lógico
Combina uno o dos compressed
rowgroups hasta 1024576 filas
WITH
(COMPRESS_ALL_ROW_GROUPS)
Rebuild
Re-comprime todo
Bloquea la tabla
• 2017 with online en NCCI
Útil con elevada fragmentacion
Feature comparison
Columnstore Index Feature
SQL
Server
2012 (11.x)
SQL
Server
2014 (12.x)
SQL
Server
2016 (13.x)
SQL
Server
2017 (14.x)
SQL
Database
SQL Data
Warehouse
Batch execution for multi-threaded queries yes yes yes yes yes yes
Batch execution for single-threaded queries yes yes yes yes
Archival compression option yes yes yes yes yes
Snapshot isolation and read-committed snapshot isolation yes yes yes yes
Specify columnstore index when creating a table yes yes yes yes
Always On supports columnstore indexes yes yes yes yes yes yes
Always On readable secondary supports read-only nonclustered columnstore index yes yes yes yes yes yes
Always On readable secondary supports updateable columnstore indexes yes yes
Read-only nonclustered columnstore index on heap or B-tree yes yes yes 1 yes 1 yes 1 yes 1
Updateable nonclustered columnstore index on heap or B-tree yes yes yes yes
Additional B-tree indexes allowed on a heap or B-tree that has a nonclustered columnstore index yes yes yes yes yes yes
Updateable clustered columnstore index yes yes yes yes yes
B-tree index on a clustered columnstore index yes yes yes yes
Columnstore index on a memory-optimized table yes yes yes yes
Nonclustered columnstore index definition supports using a filtered condition yes yes yes yes
Compression delay option for columnstore indexes in CREATE TABLE and ALTER TABLE yes yes yes yes
Columnstore index can have a non-persisted computed column yes
1 To create a read-only nonclustered columnstore index, store the index on a read-only filegroup.
La mayoria de
features requieren
compatibility level
130 (no vale con
estár en SQL Server
2016)
Resumen
Grandes volúmenes de datos
• Bloques mínimos de 1M filas
Elevada compression
Lectura minima de datos
Optimiza cache L2
Preguntas

Columnstore en la vida real

  • 1.
    Columnstore en SQLServer Cómo utilizarlo en nuestros entornos OLTP
  • 2.
     Ingeniero Informático Microsoft Data Platform MVP  Mentor en SolidQ  Tuning y alta disponibilidad Enrique Catalá Bañuls [email protected] @enriquecatala
  • 3.
    Real-time operational analytics Entorno donde conviven cargas mixtas OLAP y OLTP  Mínimo impacto de usuarios de negocio atacando el operacional
  • 4.
    Arquitectura analítica tradicional Aspectosclave Implementacion compleja Licenciamiento (dinero) Latencia del dato en analitico IIS Server BI analysts
  • 5.
    Real-time operational analytics IISServer OLTP workload Esto no reemplaza la necesidad de entorno BI No hay nada mas rápido que un cubo con datos precalculados Tampoco te va a ayudar cuando necesitas análisis de multiples fuentes de datos
  • 6.
    Columnstore ROWSTORE • Formato defila • Compresión opcional • Devuelve todas las columnas del índice • Arbol B balanceado COLUMNSTORE • Formato de columna • Compresión requerida • Devuelve solo las columnas referenciadas • Cabecera y datos
  • 7.
    Diferencias row-store vscolumnstore Imagen de Niko Neugebauer
  • 8.
    Diferencias row-store vscolumnstore GetNext() • Envia datos a la CPU • Implementado por todos los operadores Row Mode • Invocaciones GetNext() fila a fila • El habitual en OLTP Batch Mode • Invocaciones GetNext() por ~900 filas • Beneficios 10x-100x • Requiere columnstore
  • 9.
    Carga de datos •Carga sin preorden (PON ORDER BY!) • batch_size • >102400 directos a rowgroup • <102400 carga a delta store (mal) • Usa SIEMPRE bulk load sin TABLOCK • Siempre minimamente logeado • Soporta multithread • NO PONGAS TABLOCK
  • 10.
    Carga de datos •Rowgroups pueden tener • Desde 102.400 • Hasta 1.048.576 • Recuerda cargar con bulk insert…. • INSERT INTO <table-name> VALUES (<set of values>) siempre inserta a delta store Rows to Bulk Load Rows Added to the Compressed Rowgroup Rows Added to the Delta Rowgroup 102,000 0 102,000 145,000 145,000 Rowgroup size: 145,000 0 1,048,577 1,048,576 Rowgroup size: 1,048,576. 1 2,252,152 2,252,152 Rowgroup sizes: 1,048,576, 1,048,576, 155,000. 0
  • 11.
  • 12.
    AlwaysOn y columnstore Aspectosclave Se separa por tipología de carga, de forma que las consultas analíticas aprovechen todavía major el almacenamiento columnar AlwaysOn Availability GroupCarga de trabajo OLTP Carga de trabajo analítica
  • 13.
    Tablas candidatas óptimaspara NCCIs +1M filas Sufren muchas consultas de agregados Con múcho table scan Con muchas columnas • Mínimo para activarse • analíticas • Mucha casuística • Dificiles índices cobertura
  • 14.
    Truco: Non-clustered columnstoreindex (NCCI) B-tree index Delta rowgroups Non-clustered columnstore index Deletebitmap B-tree index • Actualizable desde SQL 2016 • No necesitas ningun otro índice para OLAP • Se mantiene como cualquier índice • No require cambios de aplicación • Pueden ser filtrados
  • 15.
    Truco: Compression delay B-treeindex HOT Delta rowgroups Non-clustered columnstore index Deletebitmap Control del tiempo de permanencia en delta: -Max = 10080 (7 dias) -Util for HOT/WARM (time based) • < 6 hours – HOT (delta store) OLTP workload
  • 16.
    Demo ¿es buena ideamigrar a SQL Server 2016+? ¿Diferencias entre standard y Enterprise?
  • 17.
    Mantenimiento Reorganize Borra físicamente deun rowgroup si >10% borrado lógico Combina uno o dos compressed rowgroups hasta 1024576 filas WITH (COMPRESS_ALL_ROW_GROUPS) Rebuild Re-comprime todo Bloquea la tabla • 2017 with online en NCCI Útil con elevada fragmentacion
  • 18.
    Feature comparison Columnstore IndexFeature SQL Server 2012 (11.x) SQL Server 2014 (12.x) SQL Server 2016 (13.x) SQL Server 2017 (14.x) SQL Database SQL Data Warehouse Batch execution for multi-threaded queries yes yes yes yes yes yes Batch execution for single-threaded queries yes yes yes yes Archival compression option yes yes yes yes yes Snapshot isolation and read-committed snapshot isolation yes yes yes yes Specify columnstore index when creating a table yes yes yes yes Always On supports columnstore indexes yes yes yes yes yes yes Always On readable secondary supports read-only nonclustered columnstore index yes yes yes yes yes yes Always On readable secondary supports updateable columnstore indexes yes yes Read-only nonclustered columnstore index on heap or B-tree yes yes yes 1 yes 1 yes 1 yes 1 Updateable nonclustered columnstore index on heap or B-tree yes yes yes yes Additional B-tree indexes allowed on a heap or B-tree that has a nonclustered columnstore index yes yes yes yes yes yes Updateable clustered columnstore index yes yes yes yes yes B-tree index on a clustered columnstore index yes yes yes yes Columnstore index on a memory-optimized table yes yes yes yes Nonclustered columnstore index definition supports using a filtered condition yes yes yes yes Compression delay option for columnstore indexes in CREATE TABLE and ALTER TABLE yes yes yes yes Columnstore index can have a non-persisted computed column yes 1 To create a read-only nonclustered columnstore index, store the index on a read-only filegroup. La mayoria de features requieren compatibility level 130 (no vale con estár en SQL Server 2016)
  • 19.
    Resumen Grandes volúmenes dedatos • Bloques mínimos de 1M filas Elevada compression Lectura minima de datos Optimiza cache L2
  • 20.