Como sabemos, SQL Server 2019 está ya en versión RTM desde hace ya algo más de 1 mes. La lista de novedades en todos los servicios disponibles es muy amplia y variada y la puedes consultar aquí completa. De entre todas las novedades, he seleccionado 10 dentro de lo que podríamos denominar “developer features”, que estoy seguro que van a venirte muy bien para trabajar con tu nueva plataforma de datos moderna.
RECOMENDACIÓN: lee hasta el final del artículo para ver la sesión completa “Mejoras para desarrolladores en SQL Server 2019” que impartí el pasado mes de Noviembre en el evento #CommitConf 2019.
1. SQL Server 2019, linux y contenedores
SQL Server 2017 ya era capaz como sabemos de correr en docker y kubernetes… pero tenía bastantes limitantes que nos hacían complicado su despliegue mas allá de entornos “sencillos”, sin features ni topologías complejas. En SQL Server 2019 esto ya no es así y tendremos casi el 100% de las features soportadas.
Nuevas características para Linux:
- Replicación
- Change Data Capture
- Distributed transactions
- Machine Learning
- Polybase
- Tempdb files auto-config
Nuevas características para Contenedores:
- Microsoft Container Registry
- Red Hat images
- Non-root containers
- SQL Server on Windows Containers
2. Contenedores non-root y seguridad
De entre todas estas, mención especial requieren los non-root containers para SQL Server 2019, que por defecto corren como contenedores non-root. Esto nos obliga por tanto a tenerlo en cuenta a la hora de montar nuestros contenedores, ya que si queremos hacer operaciones con ellos del estilo “apt-get”, deberemos cambiar el contexto temporalmente para hacerlo y no acabar generando contenedores root sin querer.
- Para ver un ejemplo de cómo hacer cambios de contexto entre root y non-root, mira este Dockerfile
- Lanzar imagen non-root como usuario root
docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=MyStrongPassword" -u 0:0 -p 1433:1433 -d mcr.microsoft.com/mssql/server:2019-latest
- Lanzar imagen non-root con usuario de tu máquina
docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=MyStrongPassword" --cap-add SYS_PTRACE -u $(id -u myusername):0 -p 1433:1433 -d mcr.microsoft.com/mssql/server:2019-latest
- Lanzar imagen como usuario cualquiera
docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=MyStrongPassword" --cap-add SYS_PTRACE -u (id -u myusername):(id -g myusername) -v /path/to/mssql:/var/opt/mssql -p 1433:1433 -d mcr.microsoft.com/mssql/server:2019-latest
NOTA: Para ver un ejemplo de cómo trabajar con contenedores non-root y SQL Server 2019, visita el proyecto mssql-server-samplesdb
3. Silent data truncation
Gracias a SQL Server 2019, se ha acabado finalmente el tener errores de truncado de datos y volverse loco.
Algo como esto, dejará de ser un problema
use dbTest; go INSERT INTO DemoSQL2019 VALUES ('That is going to be truncated') GO INSERT INTO DemoSQL2019 VALUES ('Inserted!') go select * from DemoSQL2019 go
ya que en SQL Server 2019, el error que veremos será este:
Msg 2628, Level 16, State 1, Line 4 String or binary data would be truncated in table 'dbTest.dbo.DemoSQL2019', column 'NAME'. Truncated value: 'Please, tell me'.
y no este:
Msg 8152, Level 16, State 30, Line 3 String or binary data would be truncated.
NOTA: Te he dejado preparado un ejemplo completo de su funcionamiento aquí
4. Clasificación de datos sensibles
La clasificación de datos sensibles se ha venido haciendo antes mediante SSMS y con guardado en metadatos de la BBDD. Ahora ya está integrado incluso en catálogos y el propio T-SQL.
NOTA: Puedes ver un ejemplo real de funcionamiento aquí
5. Compilación diferida para variables de tipo tabla
Es uno de los problemas de rendimiento más comunes de SQL Server, el uso de variables de tipo tabla y estimaciones ineficientes. A partir de ya mismo, en SQL Server 2019, cuando tengamos código haciendo uso de variables de tipo tabla, mientras no desactivemos la nueva feature, se van a tener en cuenta las filas que tiene dicha variable de tabla en el momento de ejecución y por tanto, el plan de ejecución se adaptará correctamente al nº de filas disponibles.
NOTA: Ejemplo de aplicación aquí
6. Funciones escalares
Otro de los problemas de rendimiento más habituales en SQL Server venía siendo por el uso de funciones escalares. Por fin, en SQL Server 2019 el uso de funciones escalares se ha mejorado, haciendo posible su ejecución inline en planes de ejecución. Esto posibilita entre otras cosas, que su uso ya no implica ejecución mono-thread, lo cual va a mejorar enormemente su ejecución en la mayoría de escenarios, siendo los principales, entornos analíticos.
NOTA: Tienes un ejemplo de uso aquí
7. Soporte UTF-8
SQL Server ya tiene soporte UTF-8 a nivel de almacenamiento del dato. Como sabrás, SQL Server tiene desde hace tiempo soporte de UTF-8 en todas las herramientas disponibles (SSMS, Azure data studio, sqlcmd…) y siempre lo hubo utilizando el tipo de datos nvarchar/nchar. El problema de utilizar nchar/nvarchar es que estamos pagando un precio innecesario para el almacenamiento de datos UTF-8, ya que como sabrás son tipos de datos donde cada caracter ocupa 2-byte.
En SQL Server 2019, si el collate para almacenamiento de texto es UTF8, podrás utilizar char/varchar para almacenar caracteres utf-8, lo que podría traducirse según el caso del que estemos hablando, en una reducción de incluso el 50% del storage necesario… que como sabes es el punto critico de rendimiento de cualquier sistema.
NOTA: Tienes un ejemplo de funcionamiento aquí
8. Extensiones de lenguaje en SQL Server
SQL Server 2019 incorpora extensibilidad de lenguaje en el marco de Machine Learning Services. La primera implementación que ha tenido esta extensibilidad la ha realizado Microsoft y es ni más ni menos que JAVA.
*feature no está disponible todavía por ahora en contenedores
La forma de ejecutar código externo JAVA a través de nuestro SQL Server es muy similar a lo que hay que hacer para ejecutar código R o Python en versiones inferiores de SQL Server.
Input
InputDataCol
Almacena los valores de datos de entrada por columna. N es el número de columnas.
inputNullMap
Se utiliza para la gestión de valores nulos en la aplicación java que desarrollemos y es rellenada por SQL Server antes de la ejecución de la función de usuario.
Output
outputDataColN
Similar a inputDataSet, para cada columna de salida que el programa de Java envía a SQL Server, se debe declarar una variable outputDataCol
numberofOutputCols
SQL Server asigna a esta variable el número de columnas de datos de salida que espera tener cuando finaliza la ejecución de la función de usuario.
outputNullMap
Mapa de NULL se utiliza la extensión para indicar qué valores son nulos. Se requiere esto, ya que los tipos primitivos no son compatibles con null. Los valores NULL se indican mediante “true”.
Ejemplo:
DECLARE @myClassPath nvarchar(50) DECLARE @n int SET @n = 3 SET @myClassPath = N'C:\Summit\pkg\Ngram.jar' EXEC sp_execute_external_script @language = N'Java' , @script = N'pkg.Ngram.getNGrams' , @input_data_1 = N'SELECT id, Text FROM reviews' , @parallel = 0 , @params = N'@CLASSPATH nvarchar(30), @param1 INT' , @classpath= @myClassPath , @param1 = @n with result sets ((ID int, ngram varchar(20)))
9. Polybase v2
- Engine de procesamiento distribuido integrado en SQL Server
- Consulta el dato allá donde esté (olvída ETL)
- Rendimiento distribuido y escalable de consultas
- Despliegue manual con SQL Server
- Auto despliegue/optimizacion con Big Data Clusters
CREATE EXTERNAL DATA SOURCE mydatasource_rc WITH ( TYPE = HADOOP, LOCATION = 'hdfs://xxx.xxx.xxx.xxx:8020' ); CREATE EXTERNAL FILE FORMAT myfileformat_rc WITH ( FORMAT_TYPE = RCFILE, SERDE_METHOD = 'org.apache.hadoop.hive.serde2.columnar.LazyBinaryColumnarSerDe' ); CREATE EXTERNAL TABLE ClickStream_rc ( url varchar(50), event_date date, user_ip varchar(50) ) WITH ( LOCATION='/webdata/employee_rc.tbl', DATA_SOURCE = mydatasource_rc, FILE_FORMAT = myfileformat_rc ) ; -- Querying table SELECT TOP 10 (url) FROM ClickStream_rc WHERE user_ip = 'xxx.xxx.xxx.xxx'
10. Grafos en SQL Server 2019
En SQL Server 2019, ¡por fin se permiten constraints en aristas!
NOTA: Entender los grafos da para todo un post, por eso te he preparado este notebook de jupyter y Azure Data Studio para que lo entiendas más fácilmente, a la vez que lo practicas.
Nuevo servicio Azure SQL Serverless
Esto en sí, pese a no ser una feature como tal de SQL Server 2019, es cierto que nos abre nuevas posiblidades DevOps, puesto que con este servicio nos es posible desplegar nuestros tests de integración o unitarios en Azure, contra una instancia que a todos los efectos será un SQL Server 2019 y que además tiene auto-escalado y auto-pausa, con facturación por segundos.
- Permite definir vCores (min,max) y que fluctúen según carga
- Coste por segundos
- Autopausa
- Si pausado, compute cost = 0
- Ideal para DevOps e integración continua
¿Quieres ver las sesión que Enrique Catalá impartió el pasado 22 de Noviembre en el evento #commitconf 2019?
Sólo tienes que darle al play 🙂 Encontrarás el repositorio del código de este artículo y la sesión en https://github.com/enriquecatala/novedades-sql2019-para-desarrolladores
Como puedes ver, SQL Server 2019 nos trae muchas novedades respecto a su versión anterior. Nuestra recomendación cuando migras a una nueva versión de SQL Server, es optar por la última disponible, tanto por funcionalidades, como por el tiempo que podrás trabajar con ella hasta su End-Of-Service. En SolidQ podemos ayudarte a afrontar una migración de SQL Server, no dudes en contactar con nosotros si lo necesitas.