Roberto Carrancio

Mi nombre es Roberto Carrancio y soy un DBA de SQL server con más de 10 años de experiencia en el sector. Soy el creador del blog soydba.es donde intento publicar varios artículos a la semana (de lunes a viernes que los fines de semana me gusta estar con mi gente y disfrutar de mi moto) Espero que disfrutes leyendo este blog tanto como yo disfruto escribiendo y que te sea de utilidad. Si tienes alguna sugerencia, pregunta o comentario, puedes dejarlo al final de cada entrada o enviarme un correo electrónico. Estaré encantado de leerte y responderte. ¡Gracias por tu visita! Mi principal interés es compartir mi conocimiento sobre bases de datos con todo el que quiera aprenderlo. Me parece un mundo tan apasionante como desconocido. Fuera de lo profesional me encanta la cocina, la moto y disfrutar de tomar una cervecita con amigos.
Mi nombre es Roberto Carrancio y soy un DBA de SQL server con más de 10 años de experiencia en el sector. Soy el creador del blog soydba.es donde intento publicar varios artículos a la semana (de lunes a viernes que los fines de semana me gusta estar con mi gente y disfrutar de mi moto) Espero que disfrutes leyendo este blog tanto como yo disfruto escribiendo y que te sea de utilidad. Si tienes alguna sugerencia, pregunta o comentario, puedes dejarlo al final de cada entrada o enviarme un correo electrónico. Estaré encantado de leerte y responderte. ¡Gracias por tu visita! Mi principal interés es compartir mi conocimiento sobre bases de datos con todo el que quiera aprenderlo. Me parece un mundo tan apasionante como desconocido. Fuera de lo profesional me encanta la cocina, la moto y disfrutar de tomar una cervecita con amigos.
VISTAS INDEXADAS DE SQL SERVER

VISTAS INDEXADAS DE SQL SERVER

Las vistas son tablas virtuales que nos devuelven datos de una consulta sobre una o varias tablas. Igual que una tabla tiene sus columnas y sus filas pero al contrario que estas ese conjunto de datos como tal no está almacenado en ningún sitio. Cada tabla tiene sus datos y la vista los lee de ahí. Entonces, ¿los resultados de datos de las vistas no se guardan en ningún sitio? En realidad hay algunos tipos de vistas que sí guardan los datos finales como es el caso de las vistas materializadas que implementan algunos gestores de bases de datos (Oracle, por ejemplo). En el caso de SQL Server este tipo de vista no está disponible, aunque no podemos descartar que se implemente en un futuro (en Azure Synapse Analytics han existido desde siempre).

¿Qué alternativa tenemos en SQL Server?

Como hemos visto antes, las vistas las vemos como si fueran una tabla pero en realidad no tienen datos, los recuperan dinámicamente de las tablas a las que se referencia. Esto es muy útil en la mayoría de los casos ya sea por simplicidad de las consultas, para abstraernos de la estructura original y simplificar la estructura saliente o para gestionar permisos. Sin embargo el uso de una vista no afecta en nada al rendimiento pues ejecuta la consulta tal cual como si la escribiéramos a mano. Si una vista lee sobre varias tablas grandes generará mucho consumo de E/S y si la definición de la vista incluye procesamientos complejos y muchas uniones entre tablas tendremos una notoria degradación de rendimiento.

Como alternativa, en SQL Server podemos hacer uso de un tipo de vista especial que son las Vistas Indexadas (o indizadas), son vistas que tienen un índice clustered por lo que si van a almacenar el conjunto de resultados en la base de datos para poder hacer una lectura plana.

Dónde usar las vistas indexadas

Las vistas indexadas ofrecen un rendimiento de lecturas mejorado al hacer uso del índice para leer los datos y no tener que ejecutar la consulta subyacente. Sin embargo, nos pueden llegar a penalizar considerablemente las operaciones de escritura al añadir no sólo otro índice donde escribir los datos sino complejidad a ese índice. Adicionalmente podremos crear tantos índices nonclustered sobre la vista como necesitemos. Al igual que ocurre con los índices de las tablas en nuestra mano queda medir el coste/beneficio y valorar su idoneidad.

Con las vistas indexadas notaremos una mejora sustancial en el rendimiento de nuestras consultas si las aplicamos sobre entornos con una gran diferencia de lecturas frente a escrituras, se me viene a la cabeza sobre todo entornos Data Warehouse, bases de datos OLAP o entornos de minería de datos. Rara vez serán recomendables en entornos con alta carga de transacciones IUD (insert, update y delete) en bases de datos OLTP.

Limitaciones de las vistas indexadas

Como ya hemos visto uno de los inconvenientes de las vistas indexadas es que la degradación en rendimiento de las escrituras es mayor que la mejora en las lecturas, esto nos limita en gran medida su uso. Sin embargo no es su única limitación, la verdad es que tienen una amplia lista de incompatibilidades y requisitos. Uno de los principales requisitos de las vistas indexadas es que hay que crearlas con la opción SCHEMABINDING esto implica que no se podrán modificar las tablas referenciadas.

Consideraciones para crear vistas indexadas

Además de tener que crear la vista como SCHEMABINDING tenemos que tener en cuenta otros aspectos importantes:

  • Las vistas indexadas no admiten expresiones no deterministas. Es decir, las expresiones de la vista siempre deben devolver el mismo resultado no como GETDATE() que nos devolvería un valor distinto en cada ejecución.
  • Las tablas y funciones dentro de la vista deben declararse con el nombre completo (esquema.tabla).
  • No se admiten subconsultas.
  • No se admiten OUTER JOINS, esto deja fuera RIGHT JOIN y LEFT JOIN.
  • El índice clustered de nuestra vista ocupará espacio en disco.
  • Solo se puede hacer referencia a tablas de la misma base de datos.
  • Si tenemos GROUP BY, la definición de la vista debe contener COUNT_BIG(*), pero no HAVING.
  • No se puede usar EXISTS, NOT EXISTS, COUNT(*), MIN, MAX, hints de tablas, TOP ni UNION.
  • No puede utilizar los tipos de datos text,  ntext ,  image o  XML. El tipo de datos float se puede utilizar en la vista, pero no en el índice agrupado

Como crear vistas indexadas

Para crear una vista indexada lo primero que haremos será crear la vista con la opción SCHEMABINDING 

Una vez que tenemos creada la vista tendremos que crear el índice clustered.

En este punto el optimizador de consultas podrá usar nuestro índice para cualquier consulta sobre la tabla, incluso para consultas sobre las tablas sin que se use la vista aunque, esto último, sólo en ediciones Enterprise de SQL Server.

Conclusiones

Un gran poder conlleva una gran responsabilidad y las vistas indexadas son una increíble herramienta en entornos o tablas con gran cantidad de lectura y pocas modificaciones pero si no es así nos pueden hacer mucho daño al servidor. El uso de vistas indexadas de SQL Server puede ser una buena técnica para mejorar el rendimiento de las consultas al reducir el costo de E/S y la duración de las consultas, pero requiere pruebas, planificación y un estudio pormenorizado de donde usar vistas indexadas. Se debe realizar un análisis completo del impacto en el rendimiento, midiendo las mejoras en el rendimiento de lecturas frente al coste en las escrituras.

Publicado por Roberto Carrancio en Rendimiento, SQL Server, 4 comentarios
BABELFISH PG Porque hay vida más allá de SQL Server

BABELFISH PG Porque hay vida más allá de SQL Server

Cada vez que toca renovar licencias de SQL Server hay una pregunta recurrente de todos mis clientes: ¿Y si migramos a PostgreSQL y nos ahorramos este dinero? Normalmente, quien me hace esta pregunta espera de mí un tajante NO. Sin embargo, hasta ahora mi respuesta siempre había sido: “Es una opción, claro. PostgreSQL es un excelente gestor de bases de datos y, si estás desarrollando una nueva aplicación y no tienes esa camisa de fuerza que es migrar todo tu código, me parece perfecto. Eso sí, asegúrate de tener un buen soporte.” Ahora bien, a día de hoy, BABELFISH for PostgreSQL ha mejorado lo suficiente como para hacerme cambiar esta respuesta. 

¿Qué es BABELFISH?

Empecemos por el principio, Babelfish es un complemento para PostgreSQL y ahora también para Aurora PostgreSQL (Amazon) que nos permite utilizar nuestra misma cadena de conexión SQL Server y nuestro código T-SQL sobre una base de datos de Postgre. Además de este “traductor” incorpora una funcionalidad de migración de nuestros datos desde cualquier versión licenciada de SQL hacía PostgreSQL.

Esquema de Babelfish

¿Cómo funciona BABELFISH?

Paso 1. Instalación:

Como es lógico para empezar a trabajar con Babelfish lo primero que debemos hacer es instalarlo, para lo que necesitaremos un sistema operativo linux. Es importante destacar que la instalación de babelfish incluye la instalación de una versión de PostgreSQL con los componentes necesarios para su funcionamiento y no funcionará con una instalación de PostgreSQL desde cualquier otra fuente. Por suerte, el bundle de instalación de Babelfish incluye un fichero con las instrucciones detalladas paso a paso para completar la instalación de manera exitosa, eso sí, las instrucciones de instalación son para Ubuntu y los pasos pueden diferir ligeramente en otras distribuciones.

En caso de que queramos una versión cloud, Babelfish es una capacidad integrada de Amazon Aurora y no tiene coste adicional. Se puede habilitar Babelfish en Amazon Aurora desde la consola de administración de RDS.

Paso 2. Configuración:

Una vez concluida la instalación, es el momento de conectar a PostgreSQL y empezar a configurar todo. Para empezar crearemos un usuario que será propietario de la base de datos de muestra. Crearemos también la base de datos de muestra y definiremos si Babelfish va a trabajar en modo base de datos única o va a admitir varias bases de datos. Esta configuración no se va a poder cambiar por lo que si elegimos la opción single-db debemos estar muy seguros.

Paso 3. Migración:

Ahora que ya tenemos todo instalado y configurado toca entrar en materia y migrar los datos de nuestro SQL Server. Para la migración tenemos dos opciones otra vez, modo base de datos única o modo de múltiples bases de datos. Cada uno de los modos de migración tiene sus pros y sus contras y una vez más, una vez elegido uno no lo podremos cambiar. La primera vez que iniciemos Babelfish se crearán una base de datos master y una tempdb, si teníamos objetos creados en la master deberemos recrearlos en esta. En cuanto a la tempdb una vez creada no se borrará nunca al contrario de lo que pasa en SQL Server.

En el modo de migración de base de datos única, los nombres de los esquemas se crean tal cual, por lo que si el objetivo es terminar migrando a PostgreSQL nativo tendremos que terminar haciendo cambios en el código. Si este es nuestro objetivo (que, a estas alturas, debería serlo) es recomendable mover todas las tablas al esquema DBO en SQL Server antes de la migración.

Tendrás que elegir el modo de migración de múltiples bases de datos si quieres migrar varias bases de datos, si no tienes claras tus necesidades futuras o si lo que quieres es migrar varias bases de datos de usuarios juntas y el objetivo final no es realizar una migración PostgreSQL.

Siguientes pasos y conclusiones

En este punto ya estamos preparados para empezar a trabajar con Babelfish for PostgreSQL de manera transparente como si de un SQL Server se tratara, esto nos permitirá ir migrando gradualmente nuestras aplicaciones hasta conseguir un funcionamiento con PostgreSQL Nativo y podremos reinvertir el dinero ahorrado en licencias de SQL Server en un mejor hardware y/o en un soporte de alto nivel para PostgreSQL.

Publicado por Roberto Carrancio en Otros, 1 comentario
PRE INSTALACIÓN DE SQL SERVER: Buenas prácticas

PRE INSTALACIÓN DE SQL SERVER: Buenas prácticas

Hola, amigos y amigas del blog. Hoy vamos a hablar sobre algunos aspectos a tener en cuenta y las buenas prácticas antes de instalar SQL Server. Sé que a muchos os puede parecer una tarea trivial pero es clave para el rendimiento futuro de nuestro servidor, no queremos que nuestra instalación termine siendo un desastre, ¿verdad?

Lo primero que hay que hacer es verificar los requisitos mínimos del sistema para instalar SQL Server. No vaya a ser que nos quedemos sin espacio en el disco duro, o que nuestra memoria RAM no dé la talla. Para eso, podemos consultar la documentación oficial de Microsoft, o usar alguna herramienta como el Asistente de instalación de SQL Server, que nos ayuda a comprobar si nuestro equipo cumple con los requisitos.

Lo segundo que hay que hacer es planificar la configuración de SQL Server. Esto implica decidir qué características vamos a instalar, cómo vamos a organizar las instancias y las bases de datos, qué tipo de autenticación vamos a usar, cómo vamos a configurar la seguridad y el rendimiento, y otras opciones más. Para esto, yo siempre tengo en cuenta estos 4 puntos fundamentales:

ENTORNO

Se debe intentar que los servidores SQL sean dedicados, solo deben alojar aplicaciones de SQL server. En caso de que por necesidades de un aplicativo en SQL deba convivir con otros servicios de terceros debemos extremar la vigilancia sobre el rendimiento y la seguridad. Si seguimos las buenas prácticas de Microsoft, SQL Server no se instalará en ningún caso sobre un servidor que albergue el rol de controlador de dominio. Tampoco es recomendable instalar más de una instancia en un mismo servidor, si lo hacemos deberemos jugar después con resource governor para asegurarnos que el rendimiento de las instancias es el deseado.

SISTEMA OPERATIVO

La instalación de SQL Server se puede hacer sobre entornos Windows Server o Windows de usuario. Desde SQL Server 2017 también es posible instalar SQL Server sobre entornos Linux aunque en este caso es posible que no tengamos disponibles todas las características. En el caso de un sistema operativo Mac no hay soporte nativo, sin embargo, es posible beneficiarse de la posibilidad de instalación de SQL Server sobre contenedores Docker para tener una instancia funcional en estos entornos.

En caso de una instalación de un entorno de alta disponibilidad debe existir un Windows Server Failover Cluster entre los servidores o en el caso de Linux un clúster pacemaker.

DISCOS DUROS

Según las buenas prácticas, todo servidor SQL debe tener al menos 4 discos, uno para el sistema operativo y los de SQL: datos, log, y TempDB. Adicionalmente podrán existir más discos de datos o logs. A la hora de dimensionar los discos debemos dimensionar el disco de datos de manera que tenga capacidad suficiente para los datos actuales y futuros a medio plazo (en un mundo ideal este dato nos lo dará el equipo que solicita el servidor). Los discos de TempDB y Log deberán ser entre el 10 y el 30% de la capacidad total de los datos.

Si no nos ha quedado más remedio que instalar nuestro SQL en un servidor compartido con aplicaciones, estas deberemos instalarlas en un disco independiente a SQL Server. Del mismo modo, no es buena idea compartir discos duros entre varias instancias de SQL Server.

Para terminar con el apartado de discos duros, todos los discos de SQL server deben estar formateados con el valor bytes per cluster a 64kb. Para comprobarlo podemos ejecutar el siguiente comando de powershell: “fsutil fsinfo ntfsinfo <drive>”

Bytes per Cluster, Instalación SQL

 SEGURIDAD

En un entorno dedicado para SQL Server solo los administradores del sistema operativo y los DBAs deberían tener acceso. Los servicios de SQL deben ejecutarse bajo cuentas de servicio que cumplan con las políticas de seguridad. En este sentido, tenemos que tener en cuenta que las cuentas que configuremos para el motor de bases de datos y para el agente de SQL Server deberán tener permisos sobre los directorios de datos o backups en función de lo que esperemos hacer en un futuro.

Con todo esto definido ya habríamos terminado de prepararnos y podemos pasar a descargar la versión de SQL que más se adapte a nuestras necesidades y, por fin, a instalar, que en este punto ya estaréis todos deseosos de empezar a cacharrear.

Esto sería todo por hoy, espero que os haya gustado este post sobre los aspectos a tener en cuenta y las buenas prácticas antes de instalar SQL Server. Si han quedado dudas o tenéis algún comentario, no dudéis en dejarlo abajo. Y si os ha gustado, compartidlo con vuestros colegas DBAs. Hasta la próxima.

Publicado por Roberto Carrancio en SQL Server, 2 comentarios
Tipos de datos numéricos en SQL Server

Tipos de datos numéricos en SQL Server

Recientemente un cliente me pidió ayuda porque uno de sus campos numéricos pierde precisión con los decimales. Como me parece muy importante quiero aprovechar para aclarar conceptos, es algo complejo, pero voy a tratar de dejarlo lo más claro posible. Como sabemos tenemos varios tipos de datos que nos van a permitir almacenar números en SQL Server. Vamos a ir  viendo uno a uno, pero antes tenemos que saber que significan una serie de conceptos. Los tipos de datos en SQL  Server tienen 3 cualidades:  

  • PRECISIÓN: Cantidad máxima de dígitos que puede tener en total (entero + decimal). 
  • ESCALA: Cantidad máxima de dígitos después del decimal que puede tener.  
  • PRECISION_RADIX: Especifica la potencia en la que se expresa la precisión, admite los valores 2 o 10, luego  profundizamos más sobre esto.  

Ahora sí, los tipos de datos, partamos de esta imagen y vamos viendo en detalle: 

Datos numericos en SQL

Tipos de Datos: BIGINT, INT, SMALLINT y TINYINT  

Estos tipos de datos se usan para almacenar datos numéricos exactos y enteros. NO ADMITEN DECIMALES. Tenemos  que usar uno u otro en función de nuestras necesidades, aunque, siempre es recomendable el más pequeño posible para  ahorrar espacio en disco y ganar rendimiento. Por ejemplo, para un valor de edad de una  persona con un tinyint es más que suficiente (con el estado actual de la ciencia nadie va a vivir más de 255 años o no habría dinero para  pagarle la pensión), pero para un ID de una tabla 255 posibles opciones se queda corto.

datos int sql

Tipos de Datos: DECIMAL y NUMERIC 

Antes de seguir, vamos a aclarar una de las mayores dudas que tiene la gente en SQL Server: DECIMAL y NUMERIC son sinónimos, da igual cual uses, es lo mismo, no hay uno mejor, va a rendir igual, van a comportarse igual y  cualquier otra cosa que podáis imaginar. ¿Claro esto? Vale genial, esta es la pregunta que más veces me han hecho  desde que me dedico a las bases de datos y a partir de ahora al que me lo pregunte le mandaré a vosotros. Volviendo a lo nuestro, estos datos son numéricos con una precisión y una escala fija. La precisión máxima que  pueden tener es de 38 y la escala puede ser desde 0 hasta la precisión que hayamos definido. El tamaño que ocupa  en disco y por tanto su rendimiento dependerá de la precisión que definamos así que, como es lógico, tenemos que  usar una precisión suficiente para almacenar lo que necesitamos, pero sin pasarnos.   

Tipos de datos decimal SQL

Tipos de Datos: MONEY y SMALLMONEY  

La teoría dice que son tipos de datos que usa SQL para almacenar valores monetarios, pero, permitidme ser muy  claro en esto, es una GRANDISIMA MIERDA. No voy a decir más, os dejo una foto y al que vea usando datos de este tipo le cortaré las manos. 

Problemas tipo de datos money

Nota: Ya sé lo que me vais a decir, que no se puede dividir dinero entre dinero, pero no lo uséis y os ahorraréis problemas.  

Tipos de Datos: FLOAT Y REAL 

Estos son tipos de datos numéricos y aproximados que se utilizan con datos numéricos de coma flotante. Para que nos entendamos son datos numéricos para operaciones científicas y no los vamos a usar para almacenar nuestros valores. Como máximo admiten hasta 15 dígitos el FLOAT y 7 el REAL, aunque en al consultar su precisión vemos 53 o 24 para estos tipos de datos, eso es el número de bits que almacena internamente. Lo importante aquí es que no son números exactos y cuando llegas a la precisión máxima va a redondear por lo que bajo ningún concepto deberíamos utilizarlos para almacenar nuestros valores numéricos. No tienen escala por defecto, admite tantos decimales como precisión tenga. Si os fijáis otra vez en la primera captura que os he puesto al principio, estos dos tipos de datos tienen un valor NUMERIC_PRECISION_RADIX distinto a los demás, esto es porque se almacenan en binario no en base decimal en la base de datos. Como esto está muy bien explicado en la Wikipedia y este post ya se ha alargado demasiado os dejo el enlace por si os interesa profundizar en el tema https://es.wikipedia.org/wiki/Coma_flotante

Enhorabuena por haber llegado hasta aquí abajo, espero que hayáis aprendido tanto leyendo esto como yo me he desasnado escribiéndolo😝 Antes de cerrar os dejo un apunte más copiado directamente de la web de SQL y ya no os robo más tiempo.

CONVERISIONES DE DATOS

 Al convertir de decimal o numeric a float o real se puede provocar una pérdida de precisión. Al convertir de int, smallint, tinyint, float, real, money o smallmoney a decimal o numeric se puede provocar un desbordamiento. De forma predeterminada, SQL Server usa el redondeo cuando convierte un número a un valor decimal o numeric con una precisión y una escala inferiores. Y a la inversa, si la opción SET ARITHABORT está establecida en ON, SQL Server genera un error cuando se produce un desbordamiento. La pérdida de únicamente precisión y escala no es suficiente para generar un error.

Publicado por Roberto Carrancio en SQL Server, 2 comentarios