{"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\/pt\/why-cost-based-optimizer-for-nosql-n1ql-couchbase\/","title":{"rendered":"Menos \u00e9 mais: Por que usar um otimizador baseado em custos?"},"content":{"rendered":"<blockquote><p><span style=\"font-weight: 400\">Menos \u00e9 mais.  - <a href=\"https:\/\/en.wikipedia.org\/wiki\/Minimalism#Less_is_more_(architecture)\">Ludwig Mies van der Rohe<\/a><\/span><\/p><\/blockquote>\n<p>N\u00e3o h\u00e1 declara\u00e7\u00e3o mais verdadeira sobre os objetivos de um otimizador de consultas. Fazer menos: Menos mem\u00f3ria, menos CPU, menos disco, menos E\/S, menos instru\u00e7\u00f5es, menos parti\u00e7\u00f5es, menos excesso. Menos tudo para o plano de consulta que ele cria. Essa \u00e9 a luz que orienta o SQL e o <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/query-optimization-in-nosql-couchbase-mongodb\/\">Otimizadores de NoSQL<\/a>.<\/p>\n<p>No Couchbase 6.5, anunciamos o otimizador baseado em custo (CBO-preview) para N1QL no servi\u00e7o de consulta.  Aqui, tentei responder \u00e0s perguntas dos usu\u00e1rios de NoSQL que n\u00e3o est\u00e3o familiarizados com os benef\u00edcios do CBO.<\/p>\n<ul>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Por que realmente precisamos de um CBO?<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Quais s\u00e3o as implica\u00e7\u00f5es de desempenho sem um CBO?<\/span><\/li>\n<\/ul>\n<p><span style=\"font-weight: 400\">O t\u00f3pico \u00e9 <a href=\"https:\/\/scholar.google.com\/scholar?hl=en&amp;as_sdt=0%2C5&amp;q=SQL+optimizer&amp;btnG=\">vasto<\/a>.  As respostas aqui s\u00e3o breves e n\u00e3o exaustivas.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400\">Em 2019, quando isso for importante - como chegar a tempo ao recital do seu filho ou a um jogo de futebol - voc\u00ea usaria um mapa de dire\u00e7\u00e3o est\u00e1tico que n\u00e3o leva em conta o tr\u00e1fego?  O otimizador de rotas do Google Maps otimizar\u00e1 o tempo. Os otimizadores tentam criar um plano para executar a consulta com o m\u00ednimo de recursos: CPU, mem\u00f3ria. Sabendo disso, por que voc\u00ea aceitaria uma regra est\u00e1tica (ou <\/span><a href=\"https:\/\/docs.mongodb.com\/manual\/core\/query-plans\/\"><span style=\"font-weight: 400\">forma de consulta<\/span><\/a><span style=\"font-weight: 400\">!) em sua carga de trabalho de banco de dados cr\u00edtica para os neg\u00f3cios?<\/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\">O otimizador de banco de dados toma decis\u00f5es.  Essas decis\u00f5es t\u00eam implica\u00e7\u00f5es importantes no desempenho da consulta, na taxa de transfer\u00eancia do sistema e na sua capacidade de cumprir os SLAs. Os bancos de dados com um otimizador melhor facilitar\u00e3o o desenvolvimento, o gerenciamento e o cumprimento dos SLAs.<\/span><\/p>\n<p><span style=\"font-weight: 400\">O SQL \u00e9 a linguagem de quarta gera\u00e7\u00e3o mais bem-sucedida.  Como linguagem, ela \u00e9 extraordinariamente flex\u00edvel, mesmo quando o esquema subjacente n\u00e3o o \u00e9. Voc\u00ea pode selecionar, unir, projetar qualquer rela\u00e7\u00e3o (tabela ou rela\u00e7\u00f5es intermedi\u00e1rias) sem planejar todas as combina\u00e7\u00f5es com anteced\u00eancia.  \u00c9 poss\u00edvel selecionar, unir e projetar qualquer rela\u00e7\u00e3o (tabela ou rela\u00e7\u00f5es intermedi\u00e1rias) sem planejar todas as combina\u00e7\u00f5es com anteced\u00eancia.  Isso beneficia o desenvolvimento de aplicativos e a an\u00e1lise de dados. Isso <\/span><a href=\"https:\/\/www.couchbase.com\/blog\/pt\/the-unreasonable-effectiveness-of-sql-in-nosql-databases\/\"><span style=\"font-weight: 400\">O artigo explica como os principais bancos de dados NoSQL<\/span><\/a><span style=\"font-weight: 400\"> implementaram v\u00e1rios elementos do SQL. Portanto, at\u00e9 mesmo os bancos de dados NoSQL precisam se preocupar com a otimiza\u00e7\u00e3o.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400\">Com a extraordin\u00e1ria flexibilidade de uma linguagem de consulta, vem a extraordin\u00e1ria responsabilidade de otimizar e executar as consultas de forma eficiente. As implementa\u00e7\u00f5es iniciais do SQL usavam otimizadores baseados em regras.  Isso levou \u00e0 complexidade das regras, \u00e0s dicas do otimizador definidas pelo usu\u00e1rio e aos problemas de efici\u00eancia do plano de consulta para consultas complexas. O<\/span><a href=\"https:\/\/people.eecs.berkeley.edu\/~brewer\/cs262\/3-selinger79.pdf\"><span style=\"font-weight: 400\"> otimizador baseado em custos<\/span><\/a> (CBO)<span style=\"font-weight: 400\"> mudou tudo, otimizando corretamente a consulta para uma variedade de dados, distor\u00e7\u00f5es de dados e cargas de trabalho.  N\u00e3o \u00e9 exagero dizer que o RDBMS n\u00e3o teria sido t\u00e3o bem-sucedido em lidar com casos de uso t\u00e3o ricos a um custo t\u00e3o baixo sem um CBO. O mesmo se aplica aos sistemas NoSQL com otimizadores.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400\">O otimizador de banco de dados toma decis\u00f5es.  Decis\u00f5es ruins t\u00eam enormes implica\u00e7\u00f5es negativas no desempenho. Para cargas de trabalho do mundo real, as decis\u00f5es baseadas em estat\u00edsticas s\u00e3o muito melhores do que as decis\u00f5es baseadas em regras. As estat\u00edsticas mostram isso!<\/span><\/p>\n<p><span style=\"font-weight: 400\">O otimizador, em termos gerais, faz o seguinte:<\/span><\/p>\n<ol>\n<li style=\"font-weight: 400\"><b>REESCRITA: <\/b><span style=\"font-weight: 400\">Reescreva a consulta em sua forma equivalente ideal para facilitar a otimiza\u00e7\u00e3o.  Isso inclui a avalia\u00e7\u00e3o de filtros constantes, a convers\u00e3o de uni\u00f5es, o achatamento de subconsultas, o dobramento de subconsultas e muito mais.  O tipo de reescrita depende dos recursos espec\u00edficos e das nuances do otimizador nas fases subsequentes.\u00a0<\/span><\/li>\n<li style=\"font-weight: 400\"><b>CAMINHO DE ACESSO: <\/b><span style=\"font-weight: 400\">Selecionar entre os \u00edndices dispon\u00edveis ou a varredura completa (varredura de \u00edndice prim\u00e1rio no caso do Couchbase) para cada espa\u00e7o-chave (equivalente a tabelas). Aqui, selecionamos um ou mais \u00edndices para cada espa\u00e7o de chave, decidimos os predicados (intervalos) para cada solicita\u00e7\u00e3o de varredura e decidimos se ela est\u00e1 cobrindo ou n\u00e3o.<\/span><\/li>\n<li style=\"font-weight: 400\"><b>JOIN ORDER: <\/b><span style=\"font-weight: 400\">O objetivo \u00e9 limitar o tamanho do conjunto de resultados intermedi\u00e1rios. Os JOINS s\u00e3o executados em dois espa\u00e7os-chave (tabelas) de cada vez. Dependendo do tipo de jun\u00e7\u00e3o, podemos alterar a ordem sem alterar o significado e o resultado da consulta. Por exemplo, ((t1 INNER JOIN t2) INNER JOIN t3) \u00e9 o mesmo que ((t3 INNER JOIN t2) INNER JOIN t1). Aqui, selecionamos a sequ\u00eancia na qual as uni\u00f5es s\u00e3o executadas.  O N1QL Optimizer ainda n\u00e3o reordena as uni\u00f5es.<\/span><\/li>\n<li style=\"font-weight: 400\"><b>JOIN TYPE: <\/b><span style=\"font-weight: 400\">Cada mecanismo de consulta \u00e9 capaz de realizar determinados tipos de jun\u00e7\u00f5es. O servi\u00e7o de consulta e o servi\u00e7o de an\u00e1lise do Couchbase suportam o loop aninhado (NLJ) e a jun\u00e7\u00e3o de hash (HJ).  Para o servi\u00e7o de consulta, o loop aninhado \u00e9 o padr\u00e3o e, para o servi\u00e7o de an\u00e1lise, a jun\u00e7\u00e3o de hash \u00e9 o padr\u00e3o. Depois que o tipo de uni\u00e3o \u00e9 escolhido, outras decis\u00f5es precisam ser tomadas sobre a ordem dentro da uni\u00e3o.  Para NLJ, precisamos decidir qual tabela \u00e9 a tabela externa e qual \u00e9 a tabela interna. Normalmente, queremos escolher a tabela (espa\u00e7o-chave) com um conjunto de resultados menor para ser a tabela externa. Para HJ, precisamos decidir qual tabela \u00e9 o lado de constru\u00e7\u00e3o (tabela hash) e a outra se torna o lado de sondagem do plano.\u00a0<\/span><\/li>\n<li>H\u00e1 considera\u00e7\u00f5es adicionais para otimiza\u00e7\u00f5es (por exemplo, otimiza\u00e7\u00e3o da primeira linha quando a cl\u00e1usula LIMIT \u00e9 especificada).<\/li>\n<li style=\"font-weight: 400\"><b>CRIAR \u00c1RVORE DE EXECU\u00c7\u00c3O<\/b><span style=\"font-weight: 400\">:  Por fim, crie a \u00e1rvore de execu\u00e7\u00e3o da consulta (plano) com os operadores e os valores dos par\u00e2metros que representam as decis\u00f5es nas fases anteriores.\u00a0<\/span><\/li>\n<\/ol>\n<p><b>Exemplo:\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\">A mesma consulta pode operar em uma \u00fanica linha, milh\u00f5es de linhas ou bilh\u00f5es de linhas. \u00c9 poss\u00edvel que essa consulta seja t\u00e3o simples quanto poss\u00edvel, mas a complexidade est\u00e1 escondida logo abaixo da superf\u00edcie.  O otimizador pode ter muitas op\u00e7\u00f5es para chegar aos dados.<\/span><\/p>\n<ol>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Uma varredura completa da tabela \u00e9 sempre uma op\u00e7\u00e3o.  Se a tabela de clientes tiver apenas algumas linhas que caibam em uma ou duas p\u00e1ginas do banco de dados, uma varredura completa da tabela <\/span><b>pode ser <\/b><span style=\"font-weight: 400\">o caminho mais eficiente para chegar aos dados.<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Imagine que voc\u00ea tenha um \u00edndice na tabela.<\/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\">Voc\u00ea poderia pensar que o caminho do \u00edndice, no qual voc\u00ea primeiro examina o \u00edndice para encontrar o rowid das linhas que correspondem ao predicado e, em seguida, obt\u00e9m as linhas para projetar as colunas de adi\u00e7\u00e3o (id, endere\u00e7o), seria o melhor.  N\u00e3o t\u00e3o r\u00e1pido. E se a tabela tiver um milh\u00e3o de linhas e TODAS elas tiverem exatamente o mesmo c\u00f3digo postal - 57020? Nesse caso, o caminho de acesso ao \u00edndice \u00e9 realmente mais caro do que uma varredura de tabela.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Agora, considere uma pequena modifica\u00e7\u00e3o na 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\">Considere que voc\u00ea tem os seguintes \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\">A escolha de um caminho de acesso v\u00e1lido para o otimizador ser\u00e1:<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Cada \u00edndice de i1 a i8 \u00e9 um caminho de acesso v\u00e1lido<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Uma varredura de tabela \u00e9 sempre uma op\u00e7\u00e3o.<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">v\u00e1rios \u00edndices combinados<\/span><\/li>\n<\/ul>\n<p><span style=\"font-weight: 400\">De repente, n\u00e3o \u00e9 f\u00e1cil escolher o melhor \u00edndice para a consulta, mesmo para essa consulta simples.  Portanto, um otimizador baseado em regras mant\u00e9m um conjunto de regras e segue essas regras de forma consistente para chegar ao melhor plano. O conjunto de regras seguido por <\/span><a href=\"https:\/\/dzone.com\/articles\/a-deep-dive-into-couchbase-n1ql-query-optimization\"><span style=\"font-weight: 400\">Otimizador baseado em regras N1QL<\/span><\/a><span style=\"font-weight: 400\"> est\u00e3o bem documentados.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400\">Essas regras n\u00e3o foram definidas em pedra desde o primeiro dia. Voc\u00ea come\u00e7a a preferir caminhos de \u00edndice, \u00edndices com a maioria das chaves etc.  Mesmo assim, voc\u00ea ter\u00e1 conflitos.\u00a0<\/span><\/p>\n<p><b>Exemplo<\/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\">Um otimizador baseado em regras n\u00e3o consegue descobrir qual desses \u00edndices \u00e9 o mais eficiente.  Tudo se resume \u00e0 distor\u00e7\u00e3o dos dados: A sele\u00e7\u00e3o do \u00edndice em um banco de dados n\u00e3o ser\u00e1 ideal em outro banco de dados.<\/span><\/p>\n<p><b>Exemplo:<\/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\">Na cl\u00e1usula FROM fornecida, todas as ordens a seguir s\u00e3o v\u00e1lidas.  Qual delas o otimizador deve escolher?<\/span><\/p>\n<ol>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">((order INNER JOIN customer) INNER JOIN demo)<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">((customer INNER JOIN order) INNER JOIN demo)<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">((order INNER JOIN demo) INNER JOIN customer)<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">((customer INNER JOIN demo) INNER JOIN order)<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">((demo INNER JOIN order) INNER JOIN customer)<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">((demo INNER JOIN customer) INNER JOIN order)<\/span><\/li>\n<\/ol>\n<p><span style=\"font-weight: 400\">As op\u00e7\u00f5es aumentam e a sele\u00e7\u00e3o se torna mais complicada \u00e0 medida que o n\u00famero de keyspaces (ou tabelas) aumenta na cl\u00e1usula FROM.   Se a ordem estiver errada, os resultados intermedi\u00e1rios poder\u00e3o ser enormes, mas a maior parte deles ser\u00e1 descartada posteriormente. Por exemplo, na consulta acima, a ordem de jun\u00e7\u00e3o com o cliente primeiro criar\u00e1 um enorme conjunto de resultados intermedi\u00e1rios porque estamos interessados apenas em clientes casados e com forma\u00e7\u00e3o universit\u00e1ria.  Uma ordem de jun\u00e7\u00e3o ruim afeta negativamente a lat\u00eancia da sua consulta e a taxa de transfer\u00eancia do sistema<\/span><\/p>\n<p><b>Exemplo:<\/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\">H\u00e1 duas decis\u00f5es a serem tomadas aqui.  Tipo de JOIN e ordem das tabelas.  Sem conhecer as estat\u00edsticas de cada uma delas, \u00e9 imposs\u00edvel tomar uma decis\u00e3o inteligente.  Portanto, os otimizadores baseados em regras simplesmente usar\u00e3o um m\u00e9todo como padr\u00e3o e depender\u00e3o do usu\u00e1rio para alterar o padr\u00e3o.  Isso \u00e9 ineficiente e invi\u00e1vel para consultas grandes. As implica\u00e7\u00f5es desse fato para o desempenho s\u00e3o enormes: de segundos a minutos ou de minutos a horas.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Novamente, as estimativas estat\u00edsticas v\u00eam em socorro.   Em aplicativos corporativos, s\u00e3o comuns consultas com muitos espa\u00e7os-chave (tabelas) e predicados complexos.\u00a0\u00a0<\/span><\/p>\n<p><strong>Conclus\u00e3o<\/strong><\/p>\n<p><span style=\"font-weight: 400\">Para cargas de trabalho do mundo real, as decis\u00f5es baseadas em estat\u00edsticas s\u00e3o muito melhores do que as decis\u00f5es baseadas em regras. E ponto final.  Esse \u00e9 o motivo pelo qual <\/span><a href=\"https:\/\/www.couchbase.com\/blog\/pt\/cost-based-optimizer-for-couchbase-n1ql-sql-for-json\/\"><span style=\"font-weight: 400\">N1QL implementou a CBO<\/span><\/a><span style=\"font-weight: 400\">. Baixar <\/span><a href=\"https:\/\/www.couchbase.com\/blog\/pt\/downloads\/?family=server&amp;product=couchbase-server-developer\"><span style=\"font-weight: 400\">Couchbase 6.5<\/span><\/a><span style=\"font-weight: 400\"> agora e veja por si mesmo.\u00a0 <\/span><\/p>\n<p><span style=\"font-weight: 400\">E antes de optar por um banco de dados NoSQL, pergunte ao fornecedor:\u00a0 <em><strong><span style=\"color: #0000ff\">Voc\u00ea tem um otimizador baseado em custos?<\/span><\/strong><\/em><\/span><\/p>\n<p><strong>Refer\u00eancias<\/strong><\/p>\n<ol>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">A efic\u00e1cia irracional do SQL em bancos de dados NoSQL: Um estudo comparativo. <\/span><a href=\"https:\/\/www.couchbase.com\/blog\/pt\/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\">A efic\u00e1cia irracional do SQL <\/span><a href=\"https:\/\/www.couchbase.com\/blog\/pt\/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\">Fa\u00e7a o download do Couchbase 6.5: <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/downloads\/?family=server&amp;product=couchbase-server-developer\">https:\/\/couchbase.com\/downloads?family=server&amp;product=couchbase-server-developer<\/a><\/span><\/li>\n<li>Uma vis\u00e3o geral da otimiza\u00e7\u00e3o de consultas em sistemas relacionais. <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 v25.9 (Yoast SEO v25.9) - 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\/pt\/why-cost-based-optimizer-for-nosql-n1ql-couchbase\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\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\/pt\/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\":\"pt-BR\",\"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\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/why-cost-based-optimizer-for-nosql-n1ql-couchbase\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@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\":\"pt-BR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@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\":\"pt-BR\",\"@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\/pt\/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":"O Couchbase inclui um otimizador baseado em custo (CBO). Saiba como ter um CBO melhora o desempenho da consulta e como implement\u00e1-lo.","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\/pt\/why-cost-based-optimizer-for-nosql-n1ql-couchbase\/","og_locale":"pt_BR","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\/pt\/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":"pt-BR","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":"O Couchbase inclui um otimizador baseado em custo (CBO). Saiba como ter um CBO melhora o desempenho da consulta e como implement\u00e1-lo.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/why-cost-based-optimizer-for-nosql-n1ql-couchbase\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/why-cost-based-optimizer-for-nosql-n1ql-couchbase\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@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":"Blog do Couchbase","description":"Couchbase, o banco de dados 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":"pt-BR"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"Blog do Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"pt-BR","@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":"pt-BR","@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 \u00e9 vice-presidente de P&amp;D da Couchbase. Anteriormente, ele trabalhou na MapR, IBM, Informix e Sybase, com mais de 20 anos de experi\u00eancia em design e desenvolvimento de bancos de dados. Ele liderou a equipe de P&amp;D de SQL e NoSQL na IBM Informix. Ele recebeu dois pr\u00eamios President's Club na Couchbase e dois Outstanding Technical Achievement Awards na IBM. Keshav \u00e9 bacharel em Ci\u00eancia da Computa\u00e7\u00e3o e Engenharia pela Universidade de Mysore, \u00cdndia, det\u00e9m onze patentes nos EUA e tem quatro patentes pendentes nos EUA.","sameAs":["https:\/\/blog.planetnosql.com\/","https:\/\/x.com\/rkeshavmurthy"],"url":"https:\/\/www.couchbase.com\/blog\/pt\/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 \u00e9 vice-presidente de P&amp;D da Couchbase. Anteriormente, ele trabalhou na MapR, IBM, Informix e Sybase, com mais de 20 anos de experi\u00eancia em design e desenvolvimento de bancos de dados. Ele liderou a equipe de P&amp;D de SQL e NoSQL na IBM Informix. Recebeu dois pr\u00eamios President's Club na Couchbase e dois Outstanding Technical Achievement Awards na IBM. Keshav \u00e9 bacharel em Ci\u00eancia da Computa\u00e7\u00e3o e Engenharia pela Universidade de Mysore, \u00cdndia, det\u00e9m dez patentes nos EUA e tem tr\u00eas patentes pendentes nos EUA."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/7634","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/users\/55"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=7634"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/7634\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media\/10799"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=7634"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=7634"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=7634"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=7634"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}