{"id":9601,"date":"2020-11-03T17:55:44","date_gmt":"2020-11-04T01:55:44","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=9601"},"modified":"2025-06-13T18:43:59","modified_gmt":"2025-06-14T01:43:59","slug":"datatabase-query-halloween-problem-n1ql","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/es\/datatabase-query-halloween-problem-n1ql\/","title":{"rendered":"Problema de Halloween: Soluci\u00f3n en N1QL."},"content":{"rendered":"<blockquote><p>Aprender SQL es f\u00e1cil; aplicarlo, no tanto.<\/p><\/blockquote>\n<p>Halloween ha llegado y se ha ido. Pero, \u00a1los trucos del problema de Halloween est\u00e1n aqu\u00ed para quedarse! Las bases de datos tienen que resolverlo cada d\u00eda.  SQL hizo la base de datos relacional f\u00e1cil, accesible y exitosa. SQL puede ser f\u00e1cil de escribir, pero su implementaci\u00f3n esconde mucha complejidad.  Desde los d\u00edas de <a href=\"https:\/\/en.wikipedia.org\/wiki\/IBM_System_R\">Sistema R<\/a> a los sistemas NoSQL, todos implementamos SQL y lenguajes inspirados en SQL como <a href=\"https:\/\/www.couchbase.com\/blog\/es\/products\/n1ql\/\">N1QL<\/a>El lenguaje de consulta declarativo tiene que aprender las reglas y los requisitos para garantizar que sigue su curso. <a href=\"https:\/\/www.couchbase.com\/blog\/es\/unreasonable-effectiveness-of-sql\/\">extraordinaria eficacia y correcci\u00f3n.<\/a>\u00a0 Uno de estos problemas es <a href=\"https:\/\/en.wikipedia.org\/wiki\/Halloween_Problem\">el problema de Halloween<\/a>.  Describir\u00e9 aqu\u00ed brevemente el problema.  Recomiendo encarecidamente la lectura de su <a href=\"https:\/\/web.archive.org\/web\/20070718223542\/https:\/\/www.noncombatant.org\/trove\/fitzpatrick-anecdotes.pdf\">historia<\/a> en los Anales IEEE de la historia de la inform\u00e1tica - segundo enlace en la secci\u00f3n de referencias m\u00e1s abajo.<\/p>\n<h5><strong>El problema:<\/strong><\/h5>\n<p>Consideremos una tabla y un \u00edndice sencillos:<\/p>\n<pre class=\"\">CREATE TABLE t (empid int primary key, salary int);\r\nCREATE INDEX i1 ON t(salary);<\/pre>\n<p>Imagina que has cargado unos datos y el \u00edndice i1 tiene este aspecto. La entrada del \u00edndice tiene el valor num\u00e9rico del salario, seguido del rowid.<\/p>\n<p><a href=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2020\/11\/Screen-Shot-2020-11-01-at-4.32.29-PM.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-9604 aligncenter\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2020\/11\/Screen-Shot-2020-11-01-at-4.32.29-PM-300x42.png\" alt=\"\" width=\"693\" height=\"97\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/11\/Screen-Shot-2020-11-01-at-4.32.29-PM-300x42.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/11\/Screen-Shot-2020-11-01-at-4.32.29-PM-1024x144.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/11\/Screen-Shot-2020-11-01-at-4.32.29-PM-768x108.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/11\/Screen-Shot-2020-11-01-at-4.32.29-PM-1536x216.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/11\/Screen-Shot-2020-11-01-at-4.32.29-PM-20x3.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/11\/Screen-Shot-2020-11-01-at-4.32.29-PM-1320x186.png 1320w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/11\/Screen-Shot-2020-11-01-at-4.32.29-PM.png 1750w\" sizes=\"auto, (max-width: 693px) 100vw, 693px\" \/><\/a><\/p>\n<p>Ahora, con el \u00e1nimo de dar m\u00e1s a quien lo tiene, queremos aumentar el salario de todos los empleados que tengan (salario &gt; 50).<\/p>\n<p><strong>UPDATE t SET salario = salario + 100 WHERE salario &gt; 50; <\/strong><\/p>\n<p><strong>Plan de consulta: <\/strong>Este es el plan general para ejecutar la consulta.  En este caso, asumiremos que el planificador de consultas utilizar\u00e1 el \u00edndice i1 para calificar las filas) a actualizar.<\/p>\n<p><a href=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2020\/11\/Screen-Shot-2020-11-01-at-4.35.58-PM.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-9605\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2020\/11\/Screen-Shot-2020-11-01-at-4.35.58-PM-300x101.png\" alt=\"\" width=\"737\" height=\"248\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/11\/Screen-Shot-2020-11-01-at-4.35.58-PM-300x101.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/11\/Screen-Shot-2020-11-01-at-4.35.58-PM-1024x344.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/11\/Screen-Shot-2020-11-01-at-4.35.58-PM-768x258.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/11\/Screen-Shot-2020-11-01-at-4.35.58-PM-1536x516.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/11\/Screen-Shot-2020-11-01-at-4.35.58-PM-20x7.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/11\/Screen-Shot-2020-11-01-at-4.35.58-PM-1320x444.png 1320w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/11\/Screen-Shot-2020-11-01-at-4.35.58-PM.png 1756w\" sizes=\"auto, (max-width: 737px) 100vw, 737px\" \/><\/a><\/p>\n<p><strong>Ejecuci\u00f3n de consultas:\u00a0<\/strong>Una vez que esto comienza a ejecutarse, las filas de datos se actualizar\u00e1n y el \u00edndice se actualizar\u00e1 de forma sincr\u00f3nica. el \u00edndice se ver\u00e1 algo como esto. Cada clave cualificada se actualiza una a una [estamos escaneando de izquierda a derecha]. Este es el estado del \u00edndice despu\u00e9s de actualizar las cuatro entradas iniciales: <span style=\"font-weight: 400\">(55-&gt;155, 84=&gt;184, 99=&gt;199, 100=&gt;200)<\/span><\/p>\n<p><a href=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2020\/11\/Screen-Shot-2020-11-03-at-4.38.53-AM.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-9618\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2020\/11\/Screen-Shot-2020-11-03-at-4.38.53-AM-300x64.png\" alt=\"\" width=\"647\" height=\"138\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/11\/Screen-Shot-2020-11-03-at-4.38.53-AM-300x64.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/11\/Screen-Shot-2020-11-03-at-4.38.53-AM-1024x219.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/11\/Screen-Shot-2020-11-03-at-4.38.53-AM-768x164.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/11\/Screen-Shot-2020-11-03-at-4.38.53-AM-1536x328.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/11\/Screen-Shot-2020-11-03-at-4.38.53-AM-20x4.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/11\/Screen-Shot-2020-11-03-at-4.38.53-AM-1320x282.png 1320w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/11\/Screen-Shot-2020-11-03-at-4.38.53-AM.png 1740w\" sizes=\"auto, (max-width: 647px) 100vw, 647px\" \/><\/a><\/p>\n<p>Veamos qu\u00e9 ocurre tras un par de cambios m\u00e1s.<a href=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2020\/11\/Screen-Shot-2020-11-03-at-5.00.45-AM.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-9619\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2020\/11\/Screen-Shot-2020-11-03-at-5.00.45-AM-300x60.png\" alt=\"\" width=\"660\" height=\"132\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/11\/Screen-Shot-2020-11-03-at-5.00.45-AM-300x60.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/11\/Screen-Shot-2020-11-03-at-5.00.45-AM-1024x204.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/11\/Screen-Shot-2020-11-03-at-5.00.45-AM-768x153.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/11\/Screen-Shot-2020-11-03-at-5.00.45-AM-1536x306.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/11\/Screen-Shot-2020-11-03-at-5.00.45-AM-20x4.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/11\/Screen-Shot-2020-11-03-at-5.00.45-AM-1320x263.png 1320w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/11\/Screen-Shot-2020-11-03-at-5.00.45-AM.png 1736w\" sizes=\"auto, (max-width: 660px) 100vw, 660px\" \/><\/a><\/p>\n<p class=\"\">Cuando pasamos al siguiente elemento[155,r2] se actualiza de nuevo a[255,r2].  Esto repetir\u00e1 la actualizaci\u00f3n de m\u00faltiples claves varias veces. Eso viola las reglas de manipulaci\u00f3n de conjuntos donde la intenci\u00f3n es tomar el conjunto en la tabla t y actualizar los salarios calificados por 100.<\/p>\n<p><a href=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2020\/11\/Screen-Shot-2020-11-03-at-5.06.26-AM.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-9621\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2020\/11\/Screen-Shot-2020-11-03-at-5.06.26-AM-300x49.png\" alt=\"\" width=\"630\" height=\"103\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/11\/Screen-Shot-2020-11-03-at-5.06.26-AM-300x49.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/11\/Screen-Shot-2020-11-03-at-5.06.26-AM-1024x167.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/11\/Screen-Shot-2020-11-03-at-5.06.26-AM-768x125.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/11\/Screen-Shot-2020-11-03-at-5.06.26-AM-1536x250.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/11\/Screen-Shot-2020-11-03-at-5.06.26-AM-20x3.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/11\/Screen-Shot-2020-11-03-at-5.06.26-AM-1320x215.png 1320w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/11\/Screen-Shot-2020-11-03-at-5.06.26-AM.png 1734w\" sizes=\"auto, (max-width: 630px) 100vw, 630px\" \/><\/a><\/p>\n<p>Una manifestaci\u00f3n adicional de los problemas de Halloween.<\/p>\n<p><strong>INSERT INTO t SELECT * FROM t WHERE balance &gt; 0;<\/strong><\/p>\n<h5><strong>Soluci\u00f3n:<\/strong><\/h5>\n<p>En los RDBMS tradicionales (por ejemplo, Informix), la soluci\u00f3n es bastante sencilla.  Para cada una de las sentencias DML que dan lugar a una mutaci\u00f3n, se mantiene una lista ordenada de los rowids actualizados dentro de esta sentencia.  Antes de actualizar una fila, se comprueba si ya est\u00e1 actualizada y se omite.  Para actualizaciones sencillas con escaneos de rangos limitados, esta sobrecarga de lectura apenas es perceptible. Para actualizaciones m\u00e1s grandes, el mantenimiento de una lista grande en memoria puede ser un problema.  Normalmente, la lista se vuelca en disco una vez que alcanza un tama\u00f1o suficiente.<\/p>\n<h5><strong>Soluci\u00f3n Couchbase N1QL &amp; GSI:\u00a0<\/strong><\/h5>\n<p><span class=\"s1\">Couchbase es una base de datos distribuida con m\u00faltiples servicios.<span class=\"Apple-converted-space\">\u00a0 El servicio de consulta<\/span>\u00a0crea el e<\/span><span class=\"s1\">plan de ejecuci\u00f3n y lo ejecuta.  Esta es la visi\u00f3n general de la soluci\u00f3n.<\/span><\/p>\n<p><span class=\"s1\">Veamos la consulta cuando tenemos un \u00edndice: <\/span><span class=\"s1\">CREAR \u00cdNDICE i1 EN t<\/span><span class=\"s2\">(<\/span><span class=\"s1\">salario<\/span><span class=\"s2\">)<\/span><a href=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2020\/11\/Screen-Shot-2020-11-03-at-6.46.15-AM.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-9623\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2020\/11\/Screen-Shot-2020-11-03-at-6.46.15-AM-300x170.png\" alt=\"\" width=\"584\" height=\"331\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/11\/Screen-Shot-2020-11-03-at-6.46.15-AM-300x170.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/11\/Screen-Shot-2020-11-03-at-6.46.15-AM-1024x579.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/11\/Screen-Shot-2020-11-03-at-6.46.15-AM-768x434.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/11\/Screen-Shot-2020-11-03-at-6.46.15-AM-20x11.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/11\/Screen-Shot-2020-11-03-at-6.46.15-AM.png 1220w\" sizes=\"auto, (max-width: 584px) 100vw, 584px\" \/><\/a>N1QL crear\u00e1 un plan como este: En la sentencia UPDATE, el plan usar\u00e1 el escaneo del \u00edndice para identificar los documentos a actualizar, buscar el documento, actualizarlo y escribirlo de vuelta.  Es importante notar que esta actualizaci\u00f3n se hace a los documentos sincr\u00f3nicamente.  Estos cambios fluir\u00e1n a trav\u00e9s del DCP y las actualizaciones del \u00edndice se realizar\u00e1n de forma as\u00edncrona.  Incluso entonces, para actualizaciones m\u00e1s grandes, el escaneo del \u00edndice y las actualizaciones pueden continuar mientras se realizan las actualizaciones al \u00edndice que se est\u00e1 escaneando.<\/p>\n<p><a href=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2020\/11\/Screen-Shot-2020-11-03-at-8.27.01-AM.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-9624\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2020\/11\/Screen-Shot-2020-11-03-at-8.27.01-AM-209x300.png\" alt=\"\" width=\"209\" height=\"300\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/11\/Screen-Shot-2020-11-03-at-8.27.01-AM-209x300.png 209w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/11\/Screen-Shot-2020-11-03-at-8.27.01-AM-300x431.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/11\/Screen-Shot-2020-11-03-at-8.27.01-AM-14x20.png 14w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/11\/Screen-Shot-2020-11-03-at-8.27.01-AM.png 672w\" sizes=\"auto, (max-width: 209px) 100vw, 209px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>Veamos ahora el escaneo del \u00edndice en s\u00ed.  Los \u00edndices pueden construirse sobre \u00cdndice Optimizado para Memoria (MOI) o Secundario Est\u00e1ndar (usando Plasma Storage Engine). Ambos tienen el concepto de instant\u00e1nea. En lugar de actualizar los valores in situ, utilizamos MVCC para proporcionar la funcionalidad y el rendimiento necesarios.<\/p>\n<p>He aqu\u00ed un par de cosas del <a href=\"https:\/\/www.vldb.org\/pvldb\/vol9\/p1413-lakshman.pdf\">Nitro<\/a> papel.<\/p>\n<p><em><strong>Instant\u00e1neas inmutables:<\/strong> Los redactores simult\u00e1neos a\u00f1aden o eliminan elementos de la lista de esqu\u00ed. Se puede crear una instant\u00e1nea de los elementos actuales para proporcionar una vista puntual de la lista de esqu\u00ed. Esto es \u00fatil para proporcionar exploraciones estables repetibles. Los usuarios pueden crear y gestionar varias instant\u00e1neas. Si una aplicaci\u00f3n requiere atomicidad para un lote de operaciones de la lista de esqu\u00ed, puede aplicar un lote de operaciones y crear una nueva instant\u00e1nea. Los cambios ser\u00e1n invisibles hasta que se cree una nueva instant\u00e1nea. <\/em><\/p>\n<p><em><strong>Instant\u00e1neas r\u00e1pidas y de baja sobrecarga:<\/strong> Los lectores de la lista de esqu\u00ed utilizan un gestor de instant\u00e1neas para realizar todas las consultas de b\u00fasqueda y rango. Una aplicaci\u00f3n de indexaci\u00f3n normalmente requiere que se creen muchas instant\u00e1neas cada segundo para dar servicio a las consultas del \u00edndice. As\u00ed que la sobrecarga de crear y mantener una instant\u00e1nea debe ser m\u00ednima para dar servicio a la alta tasa de generaci\u00f3n de instant\u00e1neas. Las instant\u00e1neas Nitro son muy baratas y es una operaci\u00f3n O(1).\u00a0<\/em><\/p>\n<p>Para implementarlos, el \u00edndice utiliza dos cosas: La versi\u00f3n BornSnapshot y la versi\u00f3n DeadSnapshot. Veamos el estado del \u00edndice inicial.<\/p>\n<p><a href=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2020\/11\/Screen-Shot-2020-11-03-at-9.51.55-AM.png\"><br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-9625\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2020\/11\/Screen-Shot-2020-11-03-at-9.51.55-AM-300x46.png\" alt=\"\" width=\"665\" height=\"102\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/11\/Screen-Shot-2020-11-03-at-9.51.55-AM-300x46.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/11\/Screen-Shot-2020-11-03-at-9.51.55-AM-1024x157.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/11\/Screen-Shot-2020-11-03-at-9.51.55-AM-768x117.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/11\/Screen-Shot-2020-11-03-at-9.51.55-AM-1536x235.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/11\/Screen-Shot-2020-11-03-at-9.51.55-AM-20x3.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/11\/Screen-Shot-2020-11-03-at-9.51.55-AM-1320x202.png 1320w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/11\/Screen-Shot-2020-11-03-at-9.51.55-AM.png 1832w\" sizes=\"auto, (max-width: 665px) 100vw, 665px\" \/><\/a>Como los cambios, el cambio en los valores simplemente a\u00f1adir nuevos nodos en el skiplist con valores actualizados, bornSnapshot y deadSnapshot valores.<a href=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2020\/11\/Screen-Shot-2020-11-03-at-12.38.02-PM.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-9626\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2020\/11\/Screen-Shot-2020-11-03-at-12.38.02-PM-300x68.png\" alt=\"\" width=\"719\" height=\"163\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/11\/Screen-Shot-2020-11-03-at-12.38.02-PM-300x68.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/11\/Screen-Shot-2020-11-03-at-12.38.02-PM-1024x231.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/11\/Screen-Shot-2020-11-03-at-12.38.02-PM-768x173.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/11\/Screen-Shot-2020-11-03-at-12.38.02-PM-1536x347.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/11\/Screen-Shot-2020-11-03-at-12.38.02-PM-20x5.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/11\/Screen-Shot-2020-11-03-at-12.38.02-PM-1320x298.png 1320w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/11\/Screen-Shot-2020-11-03-at-12.38.02-PM.png 1896w\" sizes=\"auto, (max-width: 719px) 100vw, 719px\" \/><\/a><\/p>\n<p>Usando las versiones bornSnapshot y deadSnapshot en las entradas, el esc\u00e1ner de \u00edndice (tambi\u00e9n conocido como iterador) simplemente elige las entradas correctas para calificar las entradas de \u00edndice a leer.  As\u00ed crea una instant\u00e1nea y no leer\u00e1 el valor previamente actualizado en el mismo escaneo.  Esto no s\u00f3lo proporciona escaneos estables, \u00a1sino que tambi\u00e9n evita por completo el problema de Halloween! Esto tambi\u00e9n elimina la necesidad de mantener la lista de documentos actualizados en el servicio de consulta. La buena ingenier\u00eda soluciona el problema; la gran ingenier\u00eda lo evita por completo :-)<\/p>\n<p><a href=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2020\/11\/Screen-Shot-2020-11-03-at-3.10.54-PM.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-9635\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2020\/11\/Screen-Shot-2020-11-03-at-3.10.54-PM-300x105.png\" alt=\"\" width=\"692\" height=\"242\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/11\/Screen-Shot-2020-11-03-at-3.10.54-PM-300x105.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/11\/Screen-Shot-2020-11-03-at-3.10.54-PM-1024x358.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/11\/Screen-Shot-2020-11-03-at-3.10.54-PM-768x269.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/11\/Screen-Shot-2020-11-03-at-3.10.54-PM-1536x538.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/11\/Screen-Shot-2020-11-03-at-3.10.54-PM-800x280.png 800w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/11\/Screen-Shot-2020-11-03-at-3.10.54-PM-20x7.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/11\/Screen-Shot-2020-11-03-at-3.10.54-PM-1320x462.png 1320w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/11\/Screen-Shot-2020-11-03-at-3.10.54-PM.png 1914w\" sizes=\"auto, (max-width: 692px) 100vw, 692px\" \/><\/a><\/p>\n<p>Por \u00faltimo, un arte de Halloween de <a href=\"https:\/\/twitter.com\/dhaikney\">David Haikney<\/a>VP de Atenci\u00f3n al Cliente de Couchbase\u00a0<strong>Vea el v\u00eddeo completo<\/strong><\/p>\n<blockquote class=\"twitter-tweet\">\n<p dir=\"ltr\" lang=\"en\">Feliz Halloween a todos<a href=\"https:\/\/twitter.com\/couchbase?ref_src=twsrc%5Etfw\">@couchbase<\/a>\u00a1! \ud83c\udf83 <a href=\"https:\/\/t.co\/vqwW7sk3v6\">pic.twitter.com\/vqwW7sk3v6<\/a><\/p>\n<p>- David Haikney (@dhaikney) <a href=\"https:\/\/twitter.com\/dhaikney\/status\/1322594264656842752?ref_src=twsrc%5Etfw\">31 de octubre de 2020<\/a><\/p><\/blockquote>\n<h5><\/h5>\n<h5><strong>Referencias<\/strong><\/h5>\n<ol>\n<li><a href=\"https:\/\/en.wikipedia.org\/wiki\/Halloween_Problem\">Problema de Halloween<\/a><\/li>\n<li><a class=\"external text\" href=\"https:\/\/web.archive.org\/web\/20070718223542\/https:\/\/www.noncombatant.org\/trove\/fitzpatrick-anecdotes.pdf\" rel=\"nofollow\">Una consulta bienintencionada y el problema de Halloween<\/a>Laboratorio Nacional de Los \u00c1lamos, An\u00e9cdotas, IEEE Annals of the History of Computing<\/li>\n<li><a href=\"https:\/\/docs.couchbase.com\/server\/5.0\/indexes\/performance-consistency.html\">\u00cdndice secundario global de Couchbase<\/a><\/li>\n<li><a href=\"https:\/\/www.vldb.org\/pvldb\/vol9\/p1413-lakshman.pdf\">Nitro<\/a>: Un motor de almacenamiento en memoria r\u00e1pido y escalable para el \u00edndice secundario global NoSQL<\/li>\n<\/ol>","protected":false},"excerpt":{"rendered":"<p>Learning SQL is easy; Implementing SQL, not so much. Halloween has come and gone. But, the tricks of the Halloween problem is here to stay! This has to be solved by databases every day.\u00a0 SQL made the relational database easy, [&hellip;]<\/p>","protected":false},"author":55,"featured_media":9603,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1821,1816,1812],"tags":[1261,1725,1385],"ppma_author":[8929],"class_list":["post-9601","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-couchbase-architecture","category-couchbase-server","category-n1ql-query","tag-json","tag-nosql-database","tag-rdbms"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.8 (Yoast SEO v25.8) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Halloween Problem: Solution in N1QL. - The Couchbase Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/es\/datatabase-query-halloween-problem-n1ql\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Halloween Problem: Solution in N1QL.\" \/>\n<meta property=\"og:description\" content=\"Learning SQL is easy; Implementing SQL, not so much. Halloween has come and gone. But, the tricks of the Halloween problem is here to stay! This has to be solved by databases every day.\u00a0 SQL made the relational database easy, [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/es\/datatabase-query-halloween-problem-n1ql\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2020-11-04T01:55:44+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T01:43:59+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/11\/Halloween-Problem-Solution-in-N1QL..png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"627\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Keshav Murthy\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@rkeshavmurthy\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Keshav Murthy\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/datatabase-query-halloween-problem-n1ql\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/datatabase-query-halloween-problem-n1ql\/\"},\"author\":{\"name\":\"Keshav Murthy\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c261644262bf98e146372fe647682636\"},\"headline\":\"Halloween Problem: Solution in N1QL.\",\"datePublished\":\"2020-11-04T01:55:44+00:00\",\"dateModified\":\"2025-06-14T01:43:59+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/datatabase-query-halloween-problem-n1ql\/\"},\"wordCount\":990,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/datatabase-query-halloween-problem-n1ql\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/11\/h2-scaled.jpg\",\"keywords\":[\"JSON\",\"NoSQL Database\",\"RDBMS\"],\"articleSection\":[\"Couchbase Architecture\",\"Couchbase Server\",\"SQL++ \/ N1QL Query\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/datatabase-query-halloween-problem-n1ql\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/datatabase-query-halloween-problem-n1ql\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/datatabase-query-halloween-problem-n1ql\/\",\"name\":\"Halloween Problem: Solution in N1QL. - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/datatabase-query-halloween-problem-n1ql\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/datatabase-query-halloween-problem-n1ql\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/11\/h2-scaled.jpg\",\"datePublished\":\"2020-11-04T01:55:44+00:00\",\"dateModified\":\"2025-06-14T01:43:59+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/datatabase-query-halloween-problem-n1ql\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/datatabase-query-halloween-problem-n1ql\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/datatabase-query-halloween-problem-n1ql\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/11\/h2-scaled.jpg\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/11\/h2-scaled.jpg\",\"width\":2560,\"height\":912},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/datatabase-query-halloween-problem-n1ql\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Halloween Problem: Solution in N1QL.\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c261644262bf98e146372fe647682636\",\"name\":\"Keshav Murthy\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/4e51d72fc07c662aa791316deafffac4\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/af74df754db27152971d0aed2f323ead5a1f9fe5afd0209af91e12e784451224?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/af74df754db27152971d0aed2f323ead5a1f9fe5afd0209af91e12e784451224?s=96&d=mm&r=g\",\"caption\":\"Keshav Murthy\"},\"description\":\"Keshav Murthy is a Vice President at Couchbase R&amp;D. Previously, he was at MapR, IBM, Informix, Sybase, with more than 20 years of experience in database design &amp; development. He lead the SQL and NoSQL R&amp;D team at IBM Informix. He has received two President's Club awards at Couchbase, two Outstanding Technical Achievement Awards at IBM. Keshav has a bachelor's degree in Computer Science and Engineering from the University of Mysore, India, holds eleven US patents and has four US patents pending.\",\"sameAs\":[\"https:\/\/blog.planetnosql.com\/\",\"https:\/\/x.com\/rkeshavmurthy\"],\"url\":\"https:\/\/www.couchbase.com\/blog\/es\/author\/keshav-murthy\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Halloween Problem: Solution in N1QL. - The Couchbase Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/es\/datatabase-query-halloween-problem-n1ql\/","og_locale":"es_MX","og_type":"article","og_title":"Halloween Problem: Solution in N1QL.","og_description":"Learning SQL is easy; Implementing SQL, not so much. Halloween has come and gone. But, the tricks of the Halloween problem is here to stay! This has to be solved by databases every day.\u00a0 SQL made the relational database easy, [&hellip;]","og_url":"https:\/\/www.couchbase.com\/blog\/es\/datatabase-query-halloween-problem-n1ql\/","og_site_name":"The Couchbase Blog","article_published_time":"2020-11-04T01:55:44+00:00","article_modified_time":"2025-06-14T01:43:59+00:00","og_image":[{"width":1200,"height":627,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/11\/Halloween-Problem-Solution-in-N1QL..png","type":"image\/png"}],"author":"Keshav Murthy","twitter_card":"summary_large_image","twitter_creator":"@rkeshavmurthy","twitter_misc":{"Written by":"Keshav Murthy","Est. reading time":"7 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/datatabase-query-halloween-problem-n1ql\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/datatabase-query-halloween-problem-n1ql\/"},"author":{"name":"Keshav Murthy","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c261644262bf98e146372fe647682636"},"headline":"Halloween Problem: Solution in N1QL.","datePublished":"2020-11-04T01:55:44+00:00","dateModified":"2025-06-14T01:43:59+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/datatabase-query-halloween-problem-n1ql\/"},"wordCount":990,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/datatabase-query-halloween-problem-n1ql\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/11\/h2-scaled.jpg","keywords":["JSON","NoSQL Database","RDBMS"],"articleSection":["Couchbase Architecture","Couchbase Server","SQL++ \/ N1QL Query"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/datatabase-query-halloween-problem-n1ql\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/datatabase-query-halloween-problem-n1ql\/","url":"https:\/\/www.couchbase.com\/blog\/datatabase-query-halloween-problem-n1ql\/","name":"Halloween Problem: Solution in N1QL. - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/datatabase-query-halloween-problem-n1ql\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/datatabase-query-halloween-problem-n1ql\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/11\/h2-scaled.jpg","datePublished":"2020-11-04T01:55:44+00:00","dateModified":"2025-06-14T01:43:59+00:00","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/datatabase-query-halloween-problem-n1ql\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/datatabase-query-halloween-problem-n1ql\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/datatabase-query-halloween-problem-n1ql\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/11\/h2-scaled.jpg","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/11\/h2-scaled.jpg","width":2560,"height":912},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/datatabase-query-halloween-problem-n1ql\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Halloween Problem: Solution in N1QL."}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"El blog de Couchbase","description":"Couchbase, la base de datos NoSQL","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"El blog de Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c261644262bf98e146372fe647682636","name":"Keshav Murthy","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/4e51d72fc07c662aa791316deafffac4","url":"https:\/\/secure.gravatar.com\/avatar\/af74df754db27152971d0aed2f323ead5a1f9fe5afd0209af91e12e784451224?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/af74df754db27152971d0aed2f323ead5a1f9fe5afd0209af91e12e784451224?s=96&d=mm&r=g","caption":"Keshav Murthy"},"description":"Keshav Murthy es Vicepresidente de Couchbase R&amp;D. Anteriormente, estuvo en MapR, IBM, Informix, Sybase, con m\u00e1s de 20 a\u00f1os de experiencia en dise\u00f1o y desarrollo de bases de datos. Dirigi\u00f3 el equipo de I+D de SQL y NoSQL en IBM Informix. Ha recibido dos premios President's Club en Couchbase y dos premios Outstanding Technical Achievement en IBM. Keshav es licenciado en Inform\u00e1tica e Ingenier\u00eda por la Universidad de Mysore (India), es titular de once patentes estadounidenses y tiene cuatro pendientes.","sameAs":["https:\/\/blog.planetnosql.com\/","https:\/\/x.com\/rkeshavmurthy"],"url":"https:\/\/www.couchbase.com\/blog\/es\/author\/keshav-murthy\/"}]}},"authors":[{"term_id":8929,"user_id":55,"is_guest":0,"slug":"keshav-murthy","display_name":"Keshav Murthy","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/af74df754db27152971d0aed2f323ead5a1f9fe5afd0209af91e12e784451224?s=96&d=mm&r=g","author_category":"","last_name":"Murthy","first_name":"Keshav","job_title":"","user_url":"https:\/\/blog.planetnosql.com\/","description":"Keshav Murthy es Vicepresidente de Couchbase R&amp;D. Anteriormente, estuvo en MapR, IBM, Informix, Sybase, con m\u00e1s de 20 a\u00f1os de experiencia en dise\u00f1o y desarrollo de bases de datos. Dirigi\u00f3 el equipo de I+D de SQL y NoSQL en IBM Informix. Ha recibido dos premios President's Club en Couchbase y dos premios Outstanding Technical Achievement en IBM. Keshav es licenciado en Inform\u00e1tica e Ingenier\u00eda por la Universidad de Mysore (India), es titular de diez patentes estadounidenses y tiene tres pendientes."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/9601","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/users\/55"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/comments?post=9601"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/9601\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media\/9603"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media?parent=9601"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=9601"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=9601"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=9601"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}