{"id":7634,"date":"2019-09-07T23:57:32","date_gmt":"2019-09-08T06:57:32","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=7634"},"modified":"2025-06-13T20:19:34","modified_gmt":"2025-06-14T03:19:34","slug":"why-cost-based-optimizer-for-nosql-n1ql-couchbase","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/es\/why-cost-based-optimizer-for-nosql-n1ql-couchbase\/","title":{"rendered":"Menos es m\u00e1s: \u00bfPor qu\u00e9 utilizar un optimizador basado en costes?"},"content":{"rendered":"<blockquote><p><span style=\"font-weight: 400\">Menos es m\u00e1s.  - <a href=\"https:\/\/en.wikipedia.org\/wiki\/Minimalism#Less_is_more_(architecture)\">Ludwig Mies van der Rohe<\/a><\/span><\/p><\/blockquote>\n<p>No hay nada m\u00e1s cierto sobre los objetivos de un optimizador de consultas. Hacer menos: Menos memoria, menos CPU, menos disco, menos IO, menos instrucciones, menos particiones, menos desbordamiento. Menos todo para el plan de consulta que crea. Esta es la luz que gu\u00eda a SQL y <a href=\"https:\/\/www.couchbase.com\/blog\/es\/query-optimization-in-nosql-couchbase-mongodb\/\">Optimizadores NoSQL<\/a>.<\/p>\n<p>En Couchbase 6.5, anunciamos el optimizador basado en costes (CBO-preview) para N1QL en el servicio de consultas.  Aqu\u00ed, he tratado de responder a las preguntas de los usuarios NoSQL que no est\u00e1n familiarizados con los beneficios de CBO.<\/p>\n<ul>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">\u00bfPor qu\u00e9 necesitamos realmente un CBO?<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">\u00bfCu\u00e1les son las implicaciones para el rendimiento sin un CBO?<\/span><\/li>\n<\/ul>\n<p><span style=\"font-weight: 400\">El tema es <a href=\"https:\/\/scholar.google.com\/scholar?hl=en&amp;as_sdt=0%2C5&amp;q=SQL+optimizer&amp;btnG=\">vasto<\/a>.  Las respuestas son breves y no exhaustivas.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400\">En 2019, cuando importa -como llegar a tiempo al recital de tu hijo o a un partido de b\u00e9isbol-, \u00bfusar\u00edas un mapa de direcciones est\u00e1tico que no tiene en cuenta el tr\u00e1fico?  El optimizador de rutas de Google Maps optimizar\u00e1 el tiempo. Los optimizadores intentan elaborar un plan para ejecutar la consulta con la menor cantidad de recursos: CPU, memoria. Sabiendo esto, \u00bfpor qu\u00e9 aceptar una regla est\u00e1tica (o <\/span><a href=\"https:\/\/docs.mongodb.com\/manual\/core\/query-plans\/\"><span style=\"font-weight: 400\">forma de la consulta<\/span><\/a><span style=\"font-weight: 400\">) en la carga de trabajo cr\u00edtica de su base de datos?<\/span><\/p>\n<p><a href=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2019\/09\/Screen-Shot-2019-09-07-at-5.49.23-PM.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-7636\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2019\/09\/Screen-Shot-2019-09-07-at-5.49.23-PM-300x241.png\" alt=\"\" width=\"620\" height=\"498\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/09\/Screen-Shot-2019-09-07-at-5.49.23-PM-300x241.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/09\/Screen-Shot-2019-09-07-at-5.49.23-PM-768x618.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/09\/Screen-Shot-2019-09-07-at-5.49.23-PM-20x16.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/09\/Screen-Shot-2019-09-07-at-5.49.23-PM.png 922w\" sizes=\"auto, (max-width: 620px) 100vw, 620px\" \/><\/a><\/p>\n<p><span style=\"font-weight: 400\">El optimizador de la base de datos toma decisiones.  Estas decisiones tienen implicaciones importantes en el rendimiento de las consultas, el rendimiento del sistema y su capacidad para cumplir los SLA. Las bases de datos con un mejor optimizador facilitar\u00e1n el desarrollo, la gesti\u00f3n y el cumplimiento de los SLA.<\/span><\/p>\n<p><span style=\"font-weight: 400\">SQL es el lenguaje de 4\u00aa generaci\u00f3n m\u00e1s exitoso.  Como lenguaje, es extraordinariamente flexible, incluso cuando el esquema subyacente no lo es.  Puedes seleccionar, unir, proyectar cualquier relaci\u00f3n (tabla o relaciones intermedias) sin tener que planificar todas las combinaciones de antemano.  Esto beneficia al desarrollo de aplicaciones y al an\u00e1lisis de datos. Este <\/span><a href=\"https:\/\/www.couchbase.com\/blog\/es\/the-unreasonable-effectiveness-of-sql-in-nosql-databases\/\"><span style=\"font-weight: 400\">explica c\u00f3mo las principales bases de datos NoSQL<\/span><\/a><span style=\"font-weight: 400\"> han implementado varios elementos de SQL. Por lo tanto, incluso las bases de datos NoSQL tienen que preocuparse por la optimizaci\u00f3n.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400\">La extraordinaria flexibilidad de un lenguaje de consulta conlleva la extraordinaria responsabilidad de optimizar y ejecutar las consultas de forma eficiente. Las primeras implementaciones de SQL utilizaban optimizadores basados en reglas.  Esto llev\u00f3 a la complejidad de las reglas, las sugerencias del optimizador definidas por el usuario y los problemas de eficiencia del plan de consulta para consultas complejas. El sitio<\/span><a href=\"https:\/\/people.eecs.berkeley.edu\/~brewer\/cs262\/3-selinger79.pdf\"><span style=\"font-weight: 400\"> optimizador basado en costes<\/span><\/a> (CBO)<span style=\"font-weight: 400\"> lo cambi\u00f3 todo, optimizando correctamente la consulta para una gran variedad de datos, datos sesgados y cargas de trabajo.  No es exagerado decir que los RDBMS no habr\u00edan tenido tanto \u00e9xito en la gesti\u00f3n de casos de uso tan ricos a tan bajo coste sin un CBO. Lo mismo puede decirse de los sistemas NoSQL con optimizadores.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400\">El optimizador de la base de datos toma decisiones.  Las malas decisiones tienen enormes implicaciones negativas para el rendimiento. Para las cargas de trabajo del mundo real, las decisiones basadas en estad\u00edsticas son mucho mejores que las decisiones basadas en reglas. Las estad\u00edsticas lo demuestran.<\/span><\/p>\n<p><span style=\"font-weight: 400\">El optimizador, a grandes rasgos, hace lo siguiente:<\/span><\/p>\n<ol>\n<li style=\"font-weight: 400\"><b>REWRITE: <\/b><span style=\"font-weight: 400\">Reescribir la consulta a su forma equivalente \u00f3ptima para facilitar la optimizaci\u00f3n.  Esto incluye evaluar filtros constantes, convertir uniones, aplanar subconsultas, plegar las subconsultas y mucho m\u00e1s.  El tipo de reescritura depende de las capacidades y matices espec\u00edficos del optimizador en fases posteriores.\u00a0<\/span><\/li>\n<li style=\"font-weight: 400\"><b>RUTA DE ACCESO: <\/b><span style=\"font-weight: 400\">Selecci\u00f3n de \u00edndices disponibles o escaneo completo (escaneo de \u00edndice primario en el caso de Couchbase) para cada espacio clave (equivalente a tablas). Aqu\u00ed seleccionamos uno o m\u00e1s \u00edndices para cada espacio de claves, decidimos los predicados (spans) para cada solicitud de escaneo, decidimos si est\u00e1 cubriendo o no.<\/span><\/li>\n<li style=\"font-weight: 400\"><b>JOIN ORDER: <\/b><span style=\"font-weight: 400\">El objetivo es limitar el tama\u00f1o del conjunto de resultados intermedios. Los JOINS se realizan sobre dos keypaces (tablas) a la vez. Dependiendo del tipo de join, podemos cambiar el orden sin cambiar el significado y el resultado de la consulta. Por ejemplo, ((t1 INNER JOIN t2) INNER JOIN t3) es lo mismo que ((t3 INNER JOIN t2) INNER JOIN t1). Aqu\u00ed, seleccionamos la secuencia en la que se realizan las uniones.  El Optimizador N1QL a\u00fan no reordena las uniones.<\/span><\/li>\n<li style=\"font-weight: 400\"><b>TIPO DE UNI\u00d3N: <\/b><span style=\"font-weight: 400\">Cada motor de consulta es capaz de realizar ciertos tipos de uniones. Tanto el servicio de consultas como el servicio de an\u00e1lisis de Couchbase soportan el bucle anidado (NLJ) y el hash join (HJ).  Para el servicio de consulta, el bucle anidado es el predeterminado y para el servicio de an\u00e1lisis, la uni\u00f3n hash es la predeterminada. Una vez elegido el tipo de uni\u00f3n, hay que tomar decisiones adicionales sobre el orden dentro de la uni\u00f3n.  Para NLJ, tenemos que decidir qu\u00e9 tabla es la externa y cu\u00e1l es la interna. Normalmente, se elige la tabla (espacio de claves) con un conjunto de resultados m\u00e1s peque\u00f1o para que sea la tabla externa. Para HJ, tenemos que decidir qu\u00e9 tabla es el lado de construcci\u00f3n (tabla hash) y la otra se convierte en el lado de sondeo del plan.\u00a0<\/span><\/li>\n<li>Existen consideraciones adicionales para las optimizaciones (por ejemplo, optimizaci\u00f3n de la primera fila cuando se especifica la cl\u00e1usula LIMIT).<\/li>\n<li style=\"font-weight: 400\"><b>CREAR \u00c1RBOL DE EJECUCI\u00d3N<\/b><span style=\"font-weight: 400\">:  Por \u00faltimo, crea el \u00e1rbol de ejecuci\u00f3n de la consulta (plan) con los operadores y los valores de los par\u00e1metros que representan las decisiones de las fases anteriores.\u00a0<\/span><\/li>\n<\/ol>\n<p><b>Por ejemplo:\u00a0<\/b><\/p>\n<p><span class=\"theme:neon font-size:17 line-height:20 lang:mysql decode:true crayon-inline\">SELECT id, address FROM customer WHERE postalcode = 57020;<\/span><\/p>\n<p><span style=\"font-weight: 400\">La misma consulta puede operar sobre una sola fila, millones de filas o miles de millones de filas. Esto es posiblemente lo m\u00e1s sencillo que puede ser una consulta, pero la complejidad se esconde justo debajo de la superficie.  El optimizador puede tener muchas opciones para llegar a los datos.<\/span><\/p>\n<ol>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Un escaneo completo de la tabla es siempre una opci\u00f3n.  Si la tabla de clientes tiene s\u00f3lo unas pocas filas que caben en una o dos p\u00e1ginas de la base de datos, un escaneo completo de la tabla <\/span><b>puede ser <\/b><span style=\"font-weight: 400\">el camino m\u00e1s eficiente para llegar a los datos.<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Imagina que tienes un \u00edndice sobre la mesa.<\/span>\n<ol>\n<li style=\"font-weight: 400\"><span class=\"theme:neon font-size:17 line-height:20 lang:mysql decode:true crayon-inline\">CREATE INDEX i1 ON customer(postalcode)<\/span><\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<p><span style=\"font-weight: 400\">Se podr\u00eda pensar que la ruta del \u00edndice, en la que primero se escanea el \u00edndice para encontrar el rowid de las filas que coinciden con el predicado y luego se obtienen las filas para proyectar las columnas de adici\u00f3n (id, direcci\u00f3n) ser\u00e1 la mejor.  No es tan r\u00e1pido. \u00bfQu\u00e9 pasa si la tabla tiene un mill\u00f3n de filas y TODAS ellas tienen exactamente el mismo c\u00f3digo postal - 57020? Entonces la ruta de acceso al \u00edndice es realmente m\u00e1s cara que una exploraci\u00f3n de la tabla.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Consideremos ahora una ligera modificaci\u00f3n de la consulta.<\/span><\/p>\n<p><span class=\"theme:neon font-size:17 line-height:20 lang:mysql decode:true crayon-inline\">SELECT id, address FROM customer WHERE postalcode = 57020 and yob &lt; 1980;<\/span><\/p>\n<p><span style=\"font-weight: 400\">Considera que tienes los siguientes \u00edndices:<\/span><\/p>\n<pre class=\"theme:neon font-size:17 line-height:20 whitespace-before:1 whitespace-after:1 lang:mysql decode:true\">CREATE INDEX i1 ON customer(postalcode);\r\nCREATE INDEX i2 ON customer(yob);\r\nCREATE INDEX i3 ON customer(postalcode, yob);\r\nCREATE INDEX i4 ON customer(yob, postalcode);\r\nCREATE INDEX i5 ON customer(postalcode, id, address);\r\nCREATE INDEX i6 ON customer(yob, id, address);\r\nCREATE INDEX i7 ON customer(postalcode, yob, id, address);\r\nCREATE INDEX i8 ON customer(yob, postalcode, id, address);<\/pre>\n<p><span style=\"font-weight: 400\">La elecci\u00f3n de una ruta de acceso v\u00e1lida para el optimizador ser\u00e1:<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Cada \u00edndice i1 a i8 es una ruta de acceso v\u00e1lida<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Una exploraci\u00f3n de la tabla es siempre una opci\u00f3n.<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">varios \u00edndices combinados<\/span><\/li>\n<\/ul>\n<p><span style=\"font-weight: 400\">De repente, no es f\u00e1cil elegir el mejor \u00edndice para la consulta, ni siquiera para esta consulta tan sencilla.  As\u00ed que un optimizador basado en reglas mantiene un conjunto de reglas y las sigue de forma coherente para dar con el mejor plan. El conjunto de reglas que sigue <\/span><a href=\"https:\/\/dzone.com\/articles\/a-deep-dive-into-couchbase-n1ql-query-optimization\"><span style=\"font-weight: 400\">Optimizador basado en reglas N1QL<\/span><\/a><span style=\"font-weight: 400\"> est\u00e1n bien documentados.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400\">Estas reglas no estaban grabadas en piedra desde el primer d\u00eda. Empiezas a preferir rutas de \u00edndices, \u00edndices con m\u00e1s claves, etc.  Incluso entonces tendr\u00e1s conflictos.\u00a0<\/span><\/p>\n<p><b>Ejemplo<\/b><span style=\"font-weight: 400\">:<\/span><\/p>\n<p><span style=\"font-weight: 400\">Consulta: <span class=\"theme:neon font-size:17 line-height:20 lang:mysql decode:true crayon-inline\">SELECT id, address FROM customer WHERE postalcode = 57020 and yob &lt; 1980;<\/span>\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400\">\u00cdndices:\u00a0<\/span><\/p>\n<p><span class=\"theme:neon font-size:17 line-height:20 lang:mysql decode:true crayon-inline\">CREATE INDEX i7 ON customer(postalcode, yob, id, address); CREATE INDEX i8 ON customer(yob, postalcode, id, address);<\/span><\/p>\n<p><span style=\"font-weight: 400\">Un optimizador basado en reglas no puede averiguar cu\u00e1l de estos \u00edndices es el m\u00e1s eficiente.  Todo se reduce a la asimetr\u00eda de los datos: La selecci\u00f3n de \u00edndices en una base de datos no ser\u00e1 \u00f3ptima en otra.<\/span><\/p>\n<p><b>Por ejemplo:<\/b><\/p>\n<p><span style=\"font-weight: 400\">Consulta:<\/span><\/p>\n<pre class=\"theme:neon font-size:17 line-height:20 lang:mysql decode:true\">SELECT c.state, d.status, SUM(o.sale_amt) \r\nFROM order o \r\n       INNER JOIN customer c ON (o.cid = c.id) \r\n           INNER JOIN demo d ON (c.did = d.did) \r\nWHERE d.edu = \u201ccollege\u201d AND d.mstatus = \u201cmarried\u201d \r\nGROUP BY c.state, d.status<\/pre>\n<p><span style=\"font-weight: 400\">\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400\">En la cl\u00e1usula FROM dada, todos los \u00f3rdenes siguientes son v\u00e1lidos.  \u00bfCu\u00e1l de ellos debe elegir el optimizador?<\/span><\/p>\n<ol>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">((orden INNER JOIN cliente) INNER JOIN demo)<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">((cliente INNER JOIN pedido) INNER JOIN demo)<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">((orden INNER JOIN demo) INNER JOIN cliente)<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">((cliente INNER JOIN demo) INNER JOIN pedido)<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">((demo INNER JOIN pedido) INNER JOIN cliente)<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">((demo INNER JOIN cliente) INNER JOIN pedido)<\/span><\/li>\n<\/ol>\n<p><span style=\"font-weight: 400\">Las opciones aumentan y la selecci\u00f3n se complica a medida que aumenta el n\u00famero de espacios de claves (o tablas) en la cl\u00e1usula FROM.   Un orden incorrecto significa que los resultados intermedios podr\u00edan ser enormes, s\u00f3lo para descartar la mayor parte m\u00e1s adelante. Por ejemplo, en la consulta anterior, unir el orden con el cliente primero crear\u00e1 un conjunto de resultados intermedios enorme porque s\u00f3lo nos interesan los clientes casados con estudios \"universitarios\".  Un mal orden de uni\u00f3n afecta negativamente tanto a la latencia de la consulta como al rendimiento del sistema.<\/span><\/p>\n<p><b>Por ejemplo:<\/b><\/p>\n<p><span style=\"font-weight: 400\">Consulta:<\/span><\/p>\n<pre class=\"theme:neon font-size:17 line-height:20 lang:mysql decode:true\">SELECT c.state, c.zip, SUM(sale_amt) \r\nFROM order o INNER JOIN customer c ON (o.cid = c.id) \r\nWHERE o.year = \u201c2018\u201d \r\nGROUP BY state, zip;<\/pre>\n<p><span style=\"font-weight: 400\">\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400\">Aqu\u00ed hay que tomar dos decisiones.  El tipo de JOIN y el orden de las tablas.  Sin conocer las estad\u00edsticas de cada uno, es imposible decidir de forma inteligente.  Por lo tanto, los optimizadores basados en reglas simplemente elegir\u00e1n por defecto un m\u00e9todo y depender\u00e1n del usuario para cambiar del predeterminado.  Esto es ineficaz e inviable para consultas de gran tama\u00f1o. Las consecuencias para el rendimiento son enormes: de segundos a minutos o de minutos a horas.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Una vez m\u00e1s, las estimaciones estad\u00edsticas vienen al rescate.   En las aplicaciones empresariales, son habituales las consultas con muchos espacios de claves (tablas) y predicados complejos.\u00a0\u00a0<\/span><\/p>\n<p><strong>Conclusi\u00f3n<\/strong><\/p>\n<p><span style=\"font-weight: 400\">Para las cargas de trabajo del mundo real, las decisiones basadas en estad\u00edsticas son mucho mejores que las decisiones basadas en reglas. Y punto.  Esa es la raz\u00f3n por la que <\/span><a href=\"https:\/\/www.couchbase.com\/blog\/es\/cost-based-optimizer-for-couchbase-n1ql-sql-for-json\/\"><span style=\"font-weight: 400\">N1QL implement\u00f3 el CBO<\/span><\/a><span style=\"font-weight: 400\">. Descargar <\/span><a href=\"https:\/\/www.couchbase.com\/blog\/es\/downloads\/?family=server&amp;product=couchbase-server-developer\"><span style=\"font-weight: 400\">Couchbase 6.5<\/span><\/a><span style=\"font-weight: 400\"> ahora y compru\u00e9belo usted mismo.\u00a0 <\/span><\/p>\n<p><span style=\"font-weight: 400\">Y antes de decidirse por una base de datos NoSQL, pregunte al proveedor:\u00a0 <em><strong><span style=\"color: #0000ff\">\u00bfDispone de un optimizador basado en los costes?<\/span><\/strong><\/em><\/span><\/p>\n<p><strong>Referencias<\/strong><\/p>\n<ol>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">La irrazonable eficacia de SQL en las bases de datos NoSQL: Un Estudio Comparativo. <\/span><a href=\"https:\/\/www.couchbase.com\/blog\/es\/the-unreasonable-effectiveness-of-sql-in-nosql-databases\/\"><span style=\"font-weight: 400\">https:\/\/www.couchbase.com\/blog\/the-unreasonable-effectiveness-of-sql-in-nosql-databases\/<\/span><\/a><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">La irracional eficacia de SQL <\/span><a href=\"https:\/\/www.couchbase.com\/blog\/es\/unreasonable-effectiveness-of-sql\/\"><span style=\"font-weight: 400\">https:\/\/www.couchbase.com\/blog\/unreasonable-effectiveness-of-sql\/<\/span><\/a><span style=\"font-weight: 400\">\u00a0<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Descargar Couchbase 6.5: <a href=\"https:\/\/www.couchbase.com\/blog\/es\/downloads\/?family=server&amp;product=couchbase-server-developer\">https:\/\/couchbase.com\/downloads?family=server&amp;product=couchbase-server-developer<\/a><\/span><\/li>\n<li>Visi\u00f3n general de la optimizaci\u00f3n de consultas en sistemas relacionales. <a href=\"https:\/\/cs.stanford.edu\/people\/chrismre\/cs345\/rl\/chaudhuri98.pdf\">https:\/\/cs.stanford.edu\/people\/chrismre\/cs345\/rl\/chaudhuri98.pdf<\/a><\/li>\n<\/ol>","protected":false},"excerpt":{"rendered":"<p>Less is more.\u00a0 &#8212; Ludwig Mies van der Rohe There is no truer statement on the goals of a query optimizer. Do less: Less memory, less CPU, less disk, less IO, less instructions, less partitions, less overflow. Less everything for [&hellip;]<\/p>","protected":false},"author":55,"featured_media":10799,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[9417,1812],"tags":[2401,1725,1906],"ppma_author":[8929],"class_list":["post-7634","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-performance","category-n1ql-query","tag-cbo","tag-nosql-database","tag-optimizer"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.1 (Yoast SEO v26.1.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Less Is More: Why Use a Cost-Based Optimizer? - The Couchbase Blog<\/title>\n<meta name=\"description\" content=\"Couchbase includes a cost-based optimizer (CBO). Learn how having a CBO improves query performance and how to implement it.\" \/>\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\/why-cost-based-optimizer-for-nosql-n1ql-couchbase\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Less Is More: Why Use a Cost-Based Optimizer?\" \/>\n<meta property=\"og:description\" content=\"Couchbase includes a cost-based optimizer (CBO). Learn how having a CBO improves query performance and how to implement it.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/es\/why-cost-based-optimizer-for-nosql-n1ql-couchbase\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2019-09-08T06:57:32+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T03:19:34+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/09\/london-tube-2.jpeg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"800\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\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=\"8 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/why-cost-based-optimizer-for-nosql-n1ql-couchbase\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/why-cost-based-optimizer-for-nosql-n1ql-couchbase\/\"},\"author\":{\"name\":\"Keshav Murthy\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c261644262bf98e146372fe647682636\"},\"headline\":\"Less Is More: Why Use a Cost-Based Optimizer?\",\"datePublished\":\"2019-09-08T06:57:32+00:00\",\"dateModified\":\"2025-06-14T03:19:34+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/why-cost-based-optimizer-for-nosql-n1ql-couchbase\/\"},\"wordCount\":1507,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/why-cost-based-optimizer-for-nosql-n1ql-couchbase\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/09\/london-tube-2.jpeg\",\"keywords\":[\"cbo\",\"NoSQL Database\",\"Optimizer\"],\"articleSection\":[\"High Performance\",\"SQL++ \/ N1QL Query\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/why-cost-based-optimizer-for-nosql-n1ql-couchbase\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/why-cost-based-optimizer-for-nosql-n1ql-couchbase\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/why-cost-based-optimizer-for-nosql-n1ql-couchbase\/\",\"name\":\"Less Is More: Why Use a Cost-Based Optimizer? - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/why-cost-based-optimizer-for-nosql-n1ql-couchbase\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/why-cost-based-optimizer-for-nosql-n1ql-couchbase\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/09\/london-tube-2.jpeg\",\"datePublished\":\"2019-09-08T06:57:32+00:00\",\"dateModified\":\"2025-06-14T03:19:34+00:00\",\"description\":\"Couchbase includes a cost-based optimizer (CBO). Learn how having a CBO improves query performance and how to implement it.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/why-cost-based-optimizer-for-nosql-n1ql-couchbase\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/why-cost-based-optimizer-for-nosql-n1ql-couchbase\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/why-cost-based-optimizer-for-nosql-n1ql-couchbase\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/09\/london-tube-2.jpeg\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/09\/london-tube-2.jpeg\",\"width\":1200,\"height\":800,\"caption\":\"A schematic walking map of the London Tube\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/why-cost-based-optimizer-for-nosql-n1ql-couchbase\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Less Is More: Why Use a Cost-Based Optimizer?\"}]},{\"@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":"Less Is More: Why Use a Cost-Based Optimizer? - The Couchbase Blog","description":"Couchbase incluye un optimizador basado en costes (CBO). Descubre c\u00f3mo un CBO mejora el rendimiento de las consultas y c\u00f3mo implementarlo.","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\/why-cost-based-optimizer-for-nosql-n1ql-couchbase\/","og_locale":"es_MX","og_type":"article","og_title":"Less Is More: Why Use a Cost-Based Optimizer?","og_description":"Couchbase includes a cost-based optimizer (CBO). Learn how having a CBO improves query performance and how to implement it.","og_url":"https:\/\/www.couchbase.com\/blog\/es\/why-cost-based-optimizer-for-nosql-n1ql-couchbase\/","og_site_name":"The Couchbase Blog","article_published_time":"2019-09-08T06:57:32+00:00","article_modified_time":"2025-06-14T03:19:34+00:00","og_image":[{"width":1200,"height":800,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/09\/london-tube-2.jpeg","type":"image\/jpeg"}],"author":"Keshav Murthy","twitter_card":"summary_large_image","twitter_creator":"@rkeshavmurthy","twitter_misc":{"Written by":"Keshav Murthy","Est. reading time":"8 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/why-cost-based-optimizer-for-nosql-n1ql-couchbase\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/why-cost-based-optimizer-for-nosql-n1ql-couchbase\/"},"author":{"name":"Keshav Murthy","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c261644262bf98e146372fe647682636"},"headline":"Less Is More: Why Use a Cost-Based Optimizer?","datePublished":"2019-09-08T06:57:32+00:00","dateModified":"2025-06-14T03:19:34+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/why-cost-based-optimizer-for-nosql-n1ql-couchbase\/"},"wordCount":1507,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/why-cost-based-optimizer-for-nosql-n1ql-couchbase\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/09\/london-tube-2.jpeg","keywords":["cbo","NoSQL Database","Optimizer"],"articleSection":["High Performance","SQL++ \/ N1QL Query"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/why-cost-based-optimizer-for-nosql-n1ql-couchbase\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/why-cost-based-optimizer-for-nosql-n1ql-couchbase\/","url":"https:\/\/www.couchbase.com\/blog\/why-cost-based-optimizer-for-nosql-n1ql-couchbase\/","name":"Less Is More: Why Use a Cost-Based Optimizer? - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/why-cost-based-optimizer-for-nosql-n1ql-couchbase\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/why-cost-based-optimizer-for-nosql-n1ql-couchbase\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/09\/london-tube-2.jpeg","datePublished":"2019-09-08T06:57:32+00:00","dateModified":"2025-06-14T03:19:34+00:00","description":"Couchbase incluye un optimizador basado en costes (CBO). Descubre c\u00f3mo un CBO mejora el rendimiento de las consultas y c\u00f3mo implementarlo.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/why-cost-based-optimizer-for-nosql-n1ql-couchbase\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/why-cost-based-optimizer-for-nosql-n1ql-couchbase\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/why-cost-based-optimizer-for-nosql-n1ql-couchbase\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/09\/london-tube-2.jpeg","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/09\/london-tube-2.jpeg","width":1200,"height":800,"caption":"A schematic walking map of the London Tube"},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/why-cost-based-optimizer-for-nosql-n1ql-couchbase\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Less Is More: Why Use a Cost-Based Optimizer?"}]},{"@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\/7634","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=7634"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/7634\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media\/10799"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media?parent=7634"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=7634"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=7634"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=7634"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}