Historia

El problema de Halloween

El problema de Halloween

El problema de Halloween es una anécdota clásica en el ámbito de las bases de datos y la informática, que además de ser técnicamente relevante, tiene una historia curiosa detrás de su descubrimiento. A menudo se lo menciona en el contexto de las transacciones concurrentes y la consistencia en los sistemas de bases de datos relacionales. En este artículo, y ya que mañana celebraremos Halloween, quiero contaros en detalle la historia de este problema, y que veamos cómo eso afectó a los sistemas actuales con los que trabajamos. Sentaos y poneos cómodos amigos que este joven aprendiz de abuelo cebolleta os va a contar una historia de los inicios de las bases de datos relacionales.

Historia del problema de Halloween

Era 1976, y en los laboratorios de IBM en San José, California, un grupo de ingenieros trabajaba en el desarrollo de uno de los primeros sistemas de bases de datos relacionales: System R. Entre ellos estaban Don Chamberlin, Pat Selinger, Raymond Boyce y varios otros miembros de un equipo pionero. Su objetivo era crear un sistema eficiente que pudiera manejar grandes volúmenes de datos con integridad y consistencia, un reto tecnológico sin precedentes en aquella época.

La tarde de un viernes a finales de Octubre, mientras experimentaban con actualizaciones masivas de datos, Don Chamberlin, uno de los co-creadores del lenguaje SQL, notó un comportamiento extraño en una consulta que estaban probando. La consulta parecía simple: querían aumentar el salario de todos los empleados que ganaban menos de 3000 dólares. Así que Don escribió algo parecido a esto:

Esperaba que la consulta incrementara el salario de cada empleado que ganara menos de 3000 dólares, pero lo que vio fue desconcertante. Los sueldos de algunos empleados no solo se habían incrementado una vez, sino varias veces en la misma ejecución. Los salarios de los empleados que inicialmente ganaban 2800 dólares, por ejemplo, terminaron siendo mucho mayores de lo esperado.

¿Qué estaba pasando?

Don llamó a Pat Selinger, la ingeniera encargada de la optimización de consultas en System R, y juntos comenzaron a investigar qué estaba pasando. Descubrieron que el problema radicaba en cómo el motor de la base de datos estaba gestionando el índice de salarios. El sistema estaba utilizando el índice para seleccionar las filas que debían ser actualizadas, pero cada vez que se actualizaba el salario de un empleado, el índice no se actualizaba inmediatamente.

Esto significaba que el motor seguía viendo las mismas filas como si aún cumplieran la condición Salario < 3000, incluso después de que el salario ya hubiera sido incrementado. Así, el sistema volvía a seleccionar esas filas y aplicaba otra actualización, lo que provocaba un aumento repetido e inesperado de los salarios.

Pat, quien ya tenía una gran reputación por su trabajo en la optimización de bases de datos, se dio cuenta de que esto no era un simple error; era un problema fundamental en cómo las operaciones de actualización y selección interactuaban cuando se usaban índices. Rápidamente comprendieron que este problema podía ocurrir en cualquier situación donde los datos modificados afectaran al criterio de selección.

Al darse cuenta de la magnitud del problema, y siendo ya altas horas de la noche, el equipo decidió que no iban a poder dar una solución sencilla y que ya trabajarían en una solución al problema pasadas las fiestas de acción de gracias y Halloween, no sin antes poner un nombre al marrón que acababan de descubrir: “El problema de Halloween”.

Origen del nombre

Como acabamos de ver, el problema fue identificado por Don Chamberlin y otros miembros del equipo de investigación, quienes estaban analizando cómo el índice de salario se comportaba de manera inesperada. Curiosamente, este comportamiento erróneo fue descubierto en octubre de 1976, cerca de la fecha de Halloween. A partir de ese momento, el equipo decidió bautizarlo como el problema de Halloween, en honor a la época del año en que fue detectado.

El descubrimiento marcó un hito en la comprensión de cómo los sistemas de bases de datos podían comportarse de manera incorrecta bajo ciertas condiciones de concurrencia y actualización. Desde entonces, el problema de Halloween se convirtió en un caso de estudio clásico sobre los peligros de las transacciones concurrentes mal gestionadas.

Impacto técnico del problema de Halloween

Ya hemos contado historias, ahora pongámonos técnicos para entender por qué esto si da miedo. El problema de Halloween tiene lugar debido a la interacción entre el acceso a los datos mediante índices y las operaciones de actualización que afectan a los mismos índices. Al realizar una operación como la actualización de un campo indexado, el índice puede cambiar, lo que provoca que el plan de ejecución de la consulta vuelva a seleccionar las mismas filas que ya han sido modificadas. Esto es particularmente peligroso en operaciones que implican modificaciones masivas de registros, como las sentencias UPDATE o DELETE, ya que pueden conducir a un bucle interminable de modificaciones.

Uno de los aspectos más críticos del problema de Halloween es que afecta tanto a la consistencia de los datos como al rendimiento de la transacción. En un escenario en el que no se gestiona correctamente este problema, una operación de actualización podría realizar más cambios de los esperados, lo que lleva a resultados incorrectos. Además, la transacción podría consumir más recursos del sistema de los previstos, lo que degrada el rendimiento general.

Soluciones al problema de Halloween

Con el tiempo, los desarrolladores de motores de bases de datos han ideado varias soluciones para mitigar el problema de Halloween. Desde los bloqueos de claves y operadores de bloqueos de rango hasta el uso de los spools en los planes de ejecución de las consultas.

Bloqueos de claves

El bloqueo de claves es una técnica que asegura que las filas que están siendo leídas o modificadas en una transacción no puedan ser afectadas por otras transacciones concurrentes. En el contexto del problema de Halloween, el bloqueo de claves se utiliza para prevenir que una fila que ha sido modificada vuelva a ser seleccionada por la misma transacción. Pero, ¿Cómo funciona?

Cuando una transacción selecciona una fila basada en un índice, el motor de la base de datos coloca un bloqueo en la clave de índice asociada con esa fila. Este bloqueo persiste hasta que la transacción termina, lo que garantiza que ninguna otra transacción o la misma transacción pueda seleccionar o modificar esa fila hasta que el bloqueo se libere. Esto evita que una fila que ha sido actualizada vuelva a ser seleccionada, ya que la clave correspondiente al índice sigue bloqueada durante la ejecución de la transacción.

Operadores de bloqueos de rango

Los bloqueos de rango (range locks) son otra técnica avanzada que utilizan algunos motores de bases de datos, como SQL Server, para evitar el problema de Halloween. Estos bloqueos no solo afectan a las filas individuales, sino que bloquean un rango completo de valores de un índice para evitar que otras transacciones modifiquen o inserten filas en ese rango.

En lugar de bloquear solo una fila específica, el sistema bloquea un rango de valores en el índice. De esta manera, se garantiza que ninguna otra transacción pueda modificar o insertar nuevas filas en ese rango hasta que la transacción actual se complete.

Los bloqueos de rango previenen que las filas modificadas vuelvan a seleccionarse en la misma transacción y aseguran que las operaciones concurrentes no interfieran con la transacción actual.

Operadores Spool

El spool es un operador que actúa como una especie de «almacén temporal» de los datos que han sido leídos durante la ejecución de una consulta. Su principal función es almacenar los resultados intermedios de una operación, de modo que el motor de base de datos pueda trabajar con ellos sin necesidad de volver a acceder a la fuente de datos original. Esto es particularmente útil en casos donde la selección y la actualización de las filas podrían interactuar de manera perjudicial, como ocurre en el problema de Halloween. Existen varios tipos de spools que se utilizan en SQL Server, no vamos a entrar en detalle ahora pues ya le dedicamos un artículo completo.

Cuando SQL Server detecta que una consulta tiene el potencial de sufrir el problema de Halloween, el optimizador de consultas puede introducir un spool en el plan de ejecución para evitar que las filas modificadas sean seleccionadas de nuevo. El spool actúa como una «instantánea» de las filas seleccionadas al inicio de la transacción, de modo que las actualizaciones no afecten a la selección de filas en curso.

Dicho de otra forma, en un escenario donde SQL Server detecta el riesgo de un problema de Halloween, el plan de ejecución podría incluir un Table Spool para garantizar que las filas se procesen de forma correcta, almacenando temporalmente las filas que cumplen con la condición inicial (por ejemplo Salario < 3000). Una vez que todas las filas han sido seleccionadas, el motor aplica la actualización sin el riesgo de que las filas se vuelvan a seleccionar debido a la modificación del índice.

MVCC, la solución de Oracle

El Control de Concurrencia por Múltiples Versiones (MVCC) es un enfoque utilizado por varios sistemas de bases de datos, como PostgreSQL y Oracle. MVCC permite que múltiples versiones de las filas coexistan, lo que permite que las transacciones lean los datos sin interferir con las modificaciones de otras transacciones y así evitar el problema de Halloween.

Cuando una transacción modifica una fila, se crea una nueva versión de esa fila. Las otras transacciones que están leyendo los datos continúan accediendo a la versión anterior de la fila, mientras que la transacción que la está modificando trabaja con la nueva versión. Esto previene que las modificaciones concurrentes afecten a las lecturas en curso.

De esta manera, MVCC elimina el riesgo de que las filas actualizadas sean seleccionadas de nuevo dentro de la misma transacción, ya que las transacciones no leen las versiones modificadas hasta que estén completamente confirmadas (commit). Esto previene el problema de Halloween sin necesidad de bloqueos explícitos.

Conclusión

El problema de Halloween es un claro recordatorio de cómo los detalles técnicos de la ejecución de consultas y las actualizaciones concurrentes pueden generar comportamientos inesperados en los sistemas de bases de datos. A lo largo de los años, los avances en los motores de bases de datos han permitido mitigar este problema, y uno de los mecanismos más efectivos es el uso de operadores spool en los planes de ejecución.

Aunque el problema de Halloween fue descubierto hace más de cuatro décadas, sigue siendo relevante en los sistemas modernos que manejan grandes volúmenes de datos y transacciones concurrentes. Con el uso de operadores como los spools, los motores de bases de datos garantizan que las actualizaciones se realicen de manera eficiente y sin comprometer la consistencia de los datos, lo que permite a los desarrolladores y administradores de bases de datos centrarse en mejorar el rendimiento y la escalabilidad de sus sistemas sin preocuparse por este problema clásico.

Si tenéis alguna duda o sugerencia, podéis dejarla en Twitter, por mail o dejarnos un mensaje en los comentarios. Y recuerda que también tenemos un grupo de Telegram y un canal de YouTube a los que te puede unir. ¡Hasta la próxima!

Publicado por Roberto Carrancio en Otros, 0 comentarios

La pronunciación de SQL: ¿Es-kiu-el o Sicuel?

Una de las discusiones más recurrentes cuando hablamos de bases de datos es cómo se debe pronunciar «SQL» cuando hablamos en inglés: ¿deberíamos decir es-kiu-el o, como mucha gente pronuncia, sicuel? Aunque a primera vista pueda parecer un tema trivial, la evolución de este debate está profundamente entrelazada con la historia de uno de los lenguajes más importantes para la gestión de bases de datos. En este artículo, vamos a hablar de la historia del origen de SQL y su impacto en sistemas como SQL Server y PostgreSQL, mientras aclaramos cómo y por qué se originaron estas dos pronunciaciones.

Orígenes de SQL: El nacimiento de SEQUEL

El lenguaje SQL, que significa Structured Query Language (Lenguaje de Consulta Estructurado), fue desarrollado a principios de la década de 1970 en los laboratorios de IBM por Donald D. Chamberlin y Raymond F. Boyce, basándose en las teorías relacionales de Edgar F. Codd. Inicialmente, el lenguaje se llamaba SEQUEL (Structured English Query Language). El nombre SEQUEL, en inglés, se asemeja fonéticamente a sicuel, por no decir que es prácticamente igual.

Este término refleja la idea original del lenguaje de ser una herramienta de consulta para gestionar bases de datos relacionales. Sin embargo, debido a problemas legales con una empresa británica que ya tenía registrada la marca SEQUEL, IBM decidió cambiar el nombre a SQL. A pesar de este cambio, muchos de los primeros usuarios continuaron usando la pronunciación sicuel, que evocaba al nombre original.

El cambio a SQL y la aparición de es-kiu-el

Aunque el nombre oficial pasó a ser SQL, la pronunciación original sicuel permaneció en uso, especialmente entre aquellos que ya estaban familiarizados con SEQUEL. Sin embargo, también comenzó a surgir una nueva pronunciación: es-kiu-el, que es simplemente el resultado de pronunciar las letras «S-Q-L» por separado en inglés (S es «es», Q es «kiu», L es «el»). Este enfoque más literal se volvió popular, especialmente en entornos más técnicos y entre usuarios que preferían la claridad de pronunciar las siglas tal cual.

Con el tiempo, ambas pronunciaciones coexistieron. La pronunciación sicuel estaba más arraigada entre quienes habían empezado a trabajar con el lenguaje en sus primeros días, mientras que es-kiu-el comenzó a ganar popularidad entre generaciones posteriores y en entornos donde era común pronunciar las siglas una a una.

SQL Server y el debate sobre la pronunciación

SQL Server, desarrollado por Microsoft, ha sido uno de los actores clave en la popularización de SQL a nivel mundial. Lanzado en 1989, este sistema de gestión de bases de datos relacional ha jugado un papel crucial en el crecimiento de SQL como estándar global. A lo largo de su historia, el equipo de SQL Server ha utilizado ambas pronunciaciones de SQL.

Si no me cree mira este vídeo de un anuncio de SQL Server protagonizado por Ed Esber y el mismo Bill Gates en 1989. En el video podemos ver cómo ambas pronunciaciones, sicuel y es-kiu-el, se utilizan de manera intercambiable. Esta falta de un consenso claro refleja cómo las dos formas han coexistido a lo largo del tiempo, sin una regla estricta que indique cuál es la «correcta».

PostgreSQL: Su influencia en la pronunciación

PostgreSQL, a menudo abreviado como Postgres, es otro sistema de gestión de bases de datos relacional que ha jugado un papel importante en la historia de SQL. Al igual que SQL Server, PostgreSQL ha influido profundamente en la evolución de SQL, aunque su origen es independiente.

PostgreSQL fue desarrollado en la Universidad de California en Berkeley en 1986 como parte del proyecto POSTGRES, liderado por el profesor Michael Stonebraker. Inicialmente, Postgres no estaba diseñado para utilizar SQL, sino que empleaba su propio lenguaje de consultas llamado QUEL. No fue hasta 1994 cuando PostgreSQL adoptó SQL como lenguaje estándar, lo que permitió que el sistema ganara popularidad en el ámbito empresarial.

En la comunidad de PostgreSQL, la pronunciación sicuel es también común, ya que se remonta al origen de SQL como SEQUEL. Sin embargo, al igual que con SQL Server, muchos usuarios optan por la pronunciación es-kiu-el, especialmente en países donde es común leer las siglas de manera literal, como ocurre en gran parte del mundo hispanohablante.

El impacto de PostgreSQL en la estandarización

PostgreSQL no solo adoptó SQL, sino que ha jugado un papel crucial en su estandarización y expansión. A lo largo de los años, ha implementado una serie de características avanzadas que luego se han incorporado al estándar SQL, lo que ha reforzado su posición como uno de los motores más potentes y completos. Entre sus aportaciones destacan:

  • CTEs recursivos (Common Table Expressions): Que permiten realizar consultas jerárquicas complejas.
  • Soporte avanzado para JSON: PostgreSQL fue pionero en el manejo de datos no estructurados con JSON, una capacidad que luego se ha vuelto esencial en otros sistemas.
  • Herencia de tablas: Una característica única que extiende el modelo relacional tradicional.

Estas características han influido significativamente en la dirección del estándar SQL y han ayudado a que PostgreSQL sea ampliamente reconocido como uno de los sistemas más avanzados y robustos.

La influencia cultural y regional en la pronunciación de SQL

La elección entre sicuel y es-kiu-el no solo refleja preferencias personales o generacionales, sino también influencias culturales y regionales. En muchos países de habla hispana, es más común escuchar es-kiu-el, ya que esta pronunciación se ajusta mejor a las reglas fonéticas del español. En cambio, en el mundo angloparlante, sicuel sigue siendo predominante, sobre todo entre aquellos que conocieron el lenguaje en su versión original como SEQUEL.

Este fenómeno se observa también en empresas globales, yo lo he visto hasta en Microsoft, donde las pronunciaciones varían incluso entre los empleados. La alternancia entre es-kiu-el y sicuel, como se muestra en el vídeo de SQL Server, subraya que ambas formas son aceptables, y la preferencia suele depender del contexto o de las personas involucradas en la conversación.

Conclusión

No existe una pronunciación «correcta» de SQL. Tanto es-kiu-el como sicuel son formas válidas de referirse al lenguaje. La pronunciación que elijas dependerá de factores como tu trasfondo, la región en la que trabajas y las preferencias de tu entorno. SQL, ya sea pronunciado como sicuel o es-kiu-el, sigue siendo el estándar indiscutible para la gestión de bases de datos relacionales y continuará evolucionando gracias a sistemas como SQL Server y PostgreSQL.

Este debate sobre la pronunciación es solo una pequeña parte de la rica historia de SQL, un lenguaje que ha transformado el mundo de los datos y que sigue siendo fundamental para la infraestructura tecnológica moderna. Lo importante, más allá de cómo lo pronuncies, es la capacidad que ofrece SQL para gestionar y manipular datos de manera eficiente y robusta.

Si tenéis alguna duda o sugerencia, podéis dejarla en Twitter, por mail o dejarnos un mensaje en los comentarios. Y recuerda que también tenemos un grupo de Telegram y un canal de YouTube a los que te puede unir. ¡Hasta la próxima!

Publicado por Roberto Carrancio en SQL Server, 0 comentarios