{"id":8376,"date":"2020-03-31T14:25:00","date_gmt":"2020-03-31T21:25:00","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=8376"},"modified":"2025-06-13T17:21:46","modified_gmt":"2025-06-14T00:21:46","slug":"index-advisor-service-for-n1ql-march-refresh","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/index-advisor-service-for-n1ql-march-refresh\/","title":{"rendered":"Index Advisor Service for N1QL (March refresh)"},"content":{"rendered":"<p>This is our March drop for <a href=\"https:\/\/index-advisor.couchbase.com\/\">Index Advisor service<\/a> for N1QL after fixing some of the bugs that were found after our last refresh in Feb. We plan to keep improvising the Index Advisor service(<a href=\"https:\/\/www.couchbase.com\/blog\/index-advisor-service\/\">What is it?<\/a>). The fixes in Index Advisor that you would normally see in the next maintenance release will now be available to you every month.<\/p>\n<h4>Who is it for? and When should you use it?<\/h4>\n<p><a href=\"https:\/\/index-advisor.couchbase.com\/\">https:\/\/index-advisor.couchbase.com\/<\/a><\/p>\n<p>At the cost of repeating myself,<\/p>\n<p>This service will provide index recommendations to help DBAs, developers, and architects optimize query performance and meet the SLAs.<\/p>\n<p>You will find this service useful if you:<\/p>\n<ol>\n<li>Want to avoid reading the <a href=\"https:\/\/docs.couchbase.com\/server\/current\/n1ql\/n1ql-language-reference\/createindex.html\">index creation<\/a>\u00a0<a href=\"https:\/\/www.couchbase.com\/blog\/create-right-index-get-right-performance\/\">rules<\/a>, understand them, and implement them to find the appropriate indexes for your query\/queries\/workload.<\/li>\n<li>\u00a0Do not want to download the latest Couchbase 6.5 server yet.<\/li>\n<li>\u00a0Are using an\u00a0<strong>older Couchbase version(version 5.5,6.0)<\/strong>\u00a0and need help creating the right indexes for your queries.<\/li>\n<li>Want to generate advice for indexes\u00a0<strong>without creating a bucket<\/strong> or uploading the schema or data.<\/li>\n<\/ol>\n<h4>Whats new?<\/h4>\n<p>Even if you have the Couchbase Server 6.5 server downloaded and can use Index Advisor from Query Workbench, this index Advisor is a more recent version(without a great looking UI) but with the following defects fixed.<\/p>\n<p><span style=\"color: #00ccff\">1.<\/span><span class=\"s1\" style=\"color: #00ccff\">Index Advisor to support TTL (meta().expiration &amp; meta.cas)<\/span><\/p>\n<p>With this improvement, a query like<\/p>\n<pre class=\"lang:default decode:true\">ADVISE SELECT META().id, META().expiration\r\nFROM `travel-sample`\r\nWHERE META().expiration = 0\r\nORDER BY META().id\r\nLIMIT 2;<\/pre>\n<p>that used to give<\/p>\n<pre class=\"lang:default decode:true\"><span style=\"color: #ff0000\">{\r\n  \"results\": [\r\n    {\r\n      \"#operator\": \"Advise\",\r\n      \"advice\": {\r\n        \"#operator\": \"IndexAdvice\",\r\n        \"adviseinfo\": {\r\n          \"recommended_indexes\": \"No index recommendation at this time: no keyspace found.\"\r\n        }\r\n      },\r\n      \"query\": \"SELECT name, META().id\\nFROM `travel-sample`\\nWHERE META().id &gt; \\\"g\\\"\\nLIMIT 2;\"\r\n    }\r\n  ]\r\n}<\/span><\/pre>\n<p>now gives<\/p>\n<pre class=\"lang:default decode:true\"><span style=\"color: #339966\">{\r\n  \"results\": [\r\n    {\r\n      \"#operator\": \"Advise\",\r\n      \"advice\": {\r\n        \"#operator\": \"IndexAdvice\",\r\n        \"adviseinfo\": {\r\n          \"recommended_indexes\": {\r\n            \"covering_indexes\": [\r\n              {\r\n                \"index_statement\": \"CREATE INDEX adv_meta_self_expiration ON `travel-sample`(meta(self).`expiration`)\",\r\n                \"keyspace_alias\": \"travel-sample\"\r\n              }\r\n            ],\r\n            \"indexes\": [\r\n              {\r\n                \"index_statement\": \"CREATE INDEX adv_meta_self_expiration ON `travel-sample`(meta(self).`expiration`)\",\r\n                \"keyspace_alias\": \"travel-sample\",\r\n                \"recommending_rule\": \"Index keys follow order of predicate types: 2. equality\/null\/missing.\"\r\n              }\r\n            ]\r\n          }\r\n        }\r\n      },\r\n      \"query\": \"SELECT META().id, META().expiration\\nFROM `travel-sample`\\nWHERE META().expiration = 0\\nORDER BY META().id\\nLIMIT 2;\"\r\n    }\r\n<\/span>  <span style=\"color: #339966\">]\r\n}<\/span><\/pre>\n<p>or<\/p>\n<pre class=\"lang:default decode:true\">ADVISE SELECT name, META().cas\r\nFROM `travel-sample`\r\nWHERE type=\"hotel\"\r\nORDER BY META().cas DESC\r\nLIMIT 2;<\/pre>\n<p>that used to give:<\/p>\n<pre class=\"lang:default decode:true\"><span style=\"color: #ff0000\">{\r\n  \"results\": [\r\n    {\r\n      \"#operator\": \"Advise\",\r\n      \"advice\": {\r\n        \"#operator\": \"IndexAdvice\",\r\n        \"adviseinfo\": {\r\n          \"recommended_indexes\": {\r\n            \"indexes\": [\r\n              {\r\n                \"index_statement\": \"CREATE INDEX adv_type ON `travel-sample`(`type`)\",\r\n                \"keyspace_alias\": \"travel-sample\",\r\n                \"recommending_rule\": \"Index keys follow order of predicate types: 2. equality\/null\/missing.\"\r\n              }\r\n            ]\r\n          }\r\n        }\r\n      },\r\n      \"query\": \"SELECT name, META().cas FROM `travel-sample` WHERE type=\\\"hotel\\\" ORDER BY META().cas DESC LIMIT 2;\"\r\n    }\r\n  ]\r\n}<\/span><\/pre>\n<p>&nbsp;<\/p>\n<p>now gives<\/p>\n<pre class=\"lang:default decode:true\"><span style=\"color: #339966\">{\r\n  \"results\": [\r\n    {\r\n      \"#operator\": \"Advise\",\r\n      \"advice\": {\r\n        \"#operator\": \"IndexAdvice\",\r\n        \"adviseinfo\": {\r\n          \"recommended_indexes\": {\r\n            \"covering_indexes\": [\r\n              {\r\n                \"index_property\": \"ORDER pushdown, LIMIT pushdown\",\r\n                \"index_statement\": \"CREATE INDEX adv_type_meta_self_casDESC_name ON `travel-sample`(`type`,meta(self).`cas` DESC,`name`)\",\r\n                \"keyspace_alias\": \"travel-sample\"\r\n              }\r\n            ],\r\n            \"indexes\": [\r\n              {\r\n                \"index_statement\": \"CREATE INDEX adv_type ON `travel-sample`(`type`)\",\r\n                \"keyspace_alias\": \"travel-sample\",\r\n                \"recommending_rule\": \"Index keys follow order of predicate types: 2. equality\/null\/missing.\"\r\n              }\r\n            ]\r\n          }\r\n        }\r\n      },\r\n      \"query\": \"SELECT name, META().cas\\nFROM `travel-sample`\\nWHERE type=\\\"hotel\\\"\\nORDER BY META().cas DESC\\nLIMIT 2;\"\r\n    }\r\n  ]\r\n}<\/span><\/pre>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #00ccff\">2. Advise to adjust the order of index keys for functional and array predicates<\/span><\/p>\n<p>This defect slightly changed the rules we had before:<\/p>\n<ol>\n<li>Delete the rule of functional index keys.<\/li>\n<li>Add rule &#8220;like&#8221; in the same position for scenario &#8221; a like &#8220;%adv%&#8221;.This rule is applicable only when the pattern is of the type &#8220;%x&#8221;.If it is of the type &#8220;x%&#8221; the rule does not apply.<\/li>\n<li>Index Keys from functional predicates follow the order of EQ\/in\/LE\/LT<\/li>\n<\/ol>\n<p>A query like:<\/p>\n<pre class=\"lang:default decode:true\">advise select * from  shellTest where length(a21) &lt;= 3 and c21 = 3 and c22 &gt; 30<\/pre>\n<p>used to give<\/p>\n<pre class=\"lang:default decode:true\"><span style=\"color: #ff0000\">\"results\": [\r\n      {\r\n        \"#operator\": \"Advise\",\r\n        \"advice\": {\r\n          \"#operator\": \"IndexAdvice\",\r\n          \"adviseinfo\": {\r\n            \"recommended_indexes\": {\r\n              \"indexes\": [\r\n                {\r\n                  \"index_statement\": \"CREATE INDEX adv_c21_c22_length_a21 ON `shellTest`(`c21`,`c22`,length((`a21`)))\",\r\n                  \"keyspace_alias\": \"shellTest\",\r\n                  \"recommending_rule\": \"Index keys follow order of predicate types: 2. equality\/null\/missing, 5. less than\/between\/greater than, 9. function index.\"\r\n                }\r\n              ]\r\n            }\r\n          }\r\n        },\r\n        \"query\": \"update shellTest set type=\\\"left\\\" where length(a21) &lt; 3 and c21 = 3 and c22 &gt; 30<\/span><\/pre>\n<p>now gives<\/p>\n<pre class=\"lang:default decode:true\"><span style=\"color: #339966\">{ \r\n\"results\": [\r\n      {\r\n        \"#operator\": \"Advise\",\r\n        \"advice\": {\r\n          \"#operator\": \"IndexAdvice\",\r\n          \"adviseinfo\": {\r\n            \"recommended_indexes\": {\r\n              \"indexes\": [\r\n                {\r\n                  \"index_statement\": \"CREATE INDEX adv_c21_length_a21_c22 ON `shellTest`(`c21`,length((`a21`)),`c22`)\",\r\n                  \"keyspace_alias\": \"shellTest\",\r\n                  \"recommending_rule\": \"Index keys follow order of predicate types: 2. equality\/null\/missing, 4. not less than\/between\/not greater than, 5. less than\/between\/greater than.\"\r\n                }\r\n              ]\r\n            }<\/span>\r\n          <span style=\"color: #339966\">}\r\n        },\r\n        \"query\": \"update shellTest set type=\\\"left\\\" where length(a21) &lt;= 3 and c21 = 3 and c22 &gt; 30\"\r\n      }\r\n    ]\r\n  }\r\n]<\/span><\/pre>\n<p><span style=\"color: #00ccff\">3. Adjust the order of array index keys on its SATISFIES condition<\/span><\/p>\n<ol>\n<li>Put array predicates in the order of SATISFIES condition.<\/li>\n<li>For disjunction in SATISFIES: get the common terms -&gt; pick the lowest priority one -&gt; (EQ&lt;IN&lt;LE&lt;LT&lt;IS NOT NULL&lt; LIKE)<\/li>\n<li>For conjunction in SATISFIES: pick the lowest priority one.<\/li>\n<\/ol>\n<p>The new rules after fix#2 and #3:<\/p>\n<p>1: leading array index for unnest,<br \/>\n2: equality\/null\/missing,<br \/>\n3: in,<br \/>\n4: not less than\/between\/not greater than,<br \/>\n5: less than\/greater than,<br \/>\n6: derived join filter as leading key,<br \/>\n7: not null\/not missing\/valued,<br \/>\n8: like,<br \/>\n9: non-static join predicate,<br \/>\n10:flavor for partial index,<\/p>\n<pre class=\"lang:default decode:true\">advise SELECT META(p).id, ARRAY_DISTINCT(IFMISSING(rooms[*].num,[])) \r\nFROM shellTest AS p \r\nWHERE (guestCode = IFNULL($guestCode, '') OR guestCode = '') \r\nAND checkinTime BETWEEN $startTime AND $endTime<\/pre>\n<p>used to give<\/p>\n<pre class=\"lang:default decode:true\"><span style=\"color: #ff0000\">\"results\": [\r\n      {\r\n        \"#operator\": \"Advise\",\r\n        \"advice\": {\r\n          \"#operator\": \"IndexAdvice\",\r\n          \"adviseinfo\": {\r\n            \"recommended_indexes\": {\r\n              \"covering_indexes\": [\r\n                {\r\n                  \"index_statement\": \"CREATE INDEX adv_guestCode_checkinTime_DISTINCT_rooms_level_size_num_array_di1747996179 ON `shellTest`(`guestCode`,`checkinTime`,DISTINCT ARRAY [`s`.`level`, `s`.`size`, `s`.`num`] FOR s in `rooms` END,array_distinct(ifmissing((array_star((`rooms`)).`num`), [])))\",\r\n                  \"keyspace_alias\": \"shellTest_p\"\r\n                }\r\n              ],\r\n              \"indexes\": [\r\n                {\r\n                  \"index_statement\": \"CREATE INDEX adv_guestCode_checkinTime_DISTINCT_rooms_level_size_num ON `shellTest`(`guestCode`,`checkinTime`,DISTINCT ARRAY [`s`.`level`, `s`.`size`, `s`.`num`] FOR s in `rooms` END)\",\r\n                  \"keyspace_alias\": \"shellTest_p\",\r\n                  \"recommending_rule\": \"Index keys follow order of predicate types: 1. Common leading key for disjunction (2. equality\/null\/missing, 4. not less than\/between\/not greater than, 6. array predicate).\"\r\n                }\r\n              ]\r\n            }\r\n          }\r\n        },\r\n        \"query\": \"SELECT META(p).id, ARRAY_DISTINCT(IFMISSING(rooms[*].num,[])) FROM shellTest AS p WHERE (guestCode = IFNULL($guestCode, '') OR guestCode = '') AND (checkinTime BETWEEN $startTime AND $endTime) AND (ANY s IN rooms SATISFIES [s.level,s.size, s.num] = [$level, $size, $num] END)\"\r\n<\/span><\/pre>\n<p><span style=\"color: #000000\">now gives:<\/span><\/p>\n<pre class=\"lang:default decode:true\"><span style=\"color: #339966\">results\": [\r\n      {\r\n        \"#operator\": \"Advise\",\r\n        \"advice\": {\r\n          \"#operator\": \"IndexAdvice\",\r\n          \"adviseinfo\": {\r\n            \"recommended_indexes\": {\r\n              \"covering_indexes\": [\r\n                {\r\n                  \"index_statement\": \"CREATE INDEX adv_guestCode_checkinTime_array_distinct_ifmissing_array_star_rooms_num ON `shellTest`(`guestCode`,`checkinTime`,array_distinct(ifmissing((array_star((`rooms`)).`num`), [])))\",\r\n                  \"keyspace_alias\": \"shellTest_p\"\r\n                }\r\n              ],\r\n              \"indexes\": [\r\n                {\r\n                  \"index_statement\": \"CREATE INDEX adv_guestCode_checkinTime ON `shellTest`(`guestCode`,`checkinTime`)\",\r\n                  \"keyspace_alias\": \"shellTest_p\",\r\n                  \"recommending_rule\": \"Index keys follow order of predicate types: 1. Common leading key for disjunction (2. equality\/null\/missing, 4. not less than\/between\/not greater than).\"\r\n                }\r\n              ]\r\n            }\r\n          }\r\n        }<\/span><\/pre>\n<p>&nbsp;<\/p>\n<p>Give it a try and any problems you see with Indexes recommended by Index Advisor Service, you can add them as a comment to this blog<\/p>\n<h4>More about the Index Advisor feature:<\/h4>\n<p><a href=\"https:\/\/www.couchbase.com\/blog\/index-advisor-service\/\">https:\/\/www.couchbase.com\/blog\/index-advisor-service\/<\/a><\/p>\n<p><a href=\"https:\/\/www.couchbase.com\/blog\/index-advisor-service-for-couchbase-n1qlfeb-refresh\/\">https:\/\/www.couchbase.com\/blog\/index-advisor-service-for-couchbase-n1qlfeb-refresh\/<\/a><\/p>\n<p><a href=\"https:\/\/www.couchbase.com\/blog\/n1ql-index-advisor-improve-query-performance-and-productivity\/\">https:\/\/www.couchbase.com\/blog\/n1ql-index-advisor-improve-query-performance-and-productivity\/<\/a><\/p>\n<p><a href=\"https:\/\/www.couchbase.com\/blog\/index-advisor-for-query-workload\/\">https:\/\/www.couchbase.com\/blog\/index-advisor-for-query-workload\/<\/a><\/p>\n<p><a href=\"https:\/\/docs.couchbase.com\/server\/6.5\/n1ql\/n1ql-language-reference\/advise.html\">https:\/\/docs.couchbase.com\/server\/6.5\/n1ql\/n1ql-language-reference\/advise.html<\/a><\/p>\n<p><a href=\"https:\/\/docs.couchbase.com\/server\/6.5\/n1ql\/n1ql-language-reference\/advisor.html\">https:\/\/docs.couchbase.com\/server\/6.5\/n1ql\/n1ql-language-reference\/advisor.html<\/a><\/p>\n<p><a href=\"https:\/\/docs.couchbase.com\/server\/6.5\/tools\/query-workbench.html#index-advisor\">https:\/\/docs.couchbase.com\/server\/6.5\/tools\/query-workbench.html#index-advisor<\/a><\/p>\n<h4><\/h4>\n","protected":false},"excerpt":{"rendered":"<p>This is our March drop for Index Advisor service for N1QL after fixing some of the bugs that were found after our last refresh in Feb. We plan to keep improvising the Index Advisor service(What is it?). The fixes in [&hellip;]<\/p>\n","protected":false},"author":50908,"featured_media":2560,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[2225,1816,2453,1812],"tags":[2439,2440,2445,2444],"ppma_author":[9099],"class_list":["post-8376","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-cloud","category-couchbase-server","category-global-secondary-index","category-n1ql-query","tag-index-advisor","tag-indexes","tag-query-optimization","tag-secondary-indexes"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.0 (Yoast SEO v26.0) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Index Advisor Service for N1QL (March refresh) - 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\/index-advisor-service-for-n1ql-march-refresh\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Index Advisor Service for N1QL (March refresh)\" \/>\n<meta property=\"og:description\" content=\"This is our March drop for Index Advisor service for N1QL after fixing some of the bugs that were found after our last refresh in Feb. We plan to keep improvising the Index Advisor service(What is it?). The fixes in [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/index-advisor-service-for-n1ql-march-refresh\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2020-03-31T21:25:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T00:21:46+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/02\/n1ql.png\" \/>\n\t<meta property=\"og:image:width\" content=\"512\" \/>\n\t<meta property=\"og:image:height\" content=\"512\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Kamini Jagtiani\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Kamini Jagtiani\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"2 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/index-advisor-service-for-n1ql-march-refresh\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/index-advisor-service-for-n1ql-march-refresh\/\"},\"author\":{\"name\":\"Kamini Jagtiani\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/f99c5767a877147f9cf658230bc2473b\"},\"headline\":\"Index Advisor Service for N1QL (March refresh)\",\"datePublished\":\"2020-03-31T21:25:00+00:00\",\"dateModified\":\"2025-06-14T00:21:46+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/index-advisor-service-for-n1ql-march-refresh\/\"},\"wordCount\":538,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/index-advisor-service-for-n1ql-march-refresh\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/02\/n1ql.png\",\"keywords\":[\"Index Advisor\",\"Indexes\",\"Query optimization\",\"Secondary indexes\"],\"articleSection\":[\"Couchbase Capella\",\"Couchbase Server\",\"Global Secondary Index\",\"SQL++ \/ N1QL Query\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/index-advisor-service-for-n1ql-march-refresh\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/index-advisor-service-for-n1ql-march-refresh\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/index-advisor-service-for-n1ql-march-refresh\/\",\"name\":\"Index Advisor Service for N1QL (March refresh) - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/index-advisor-service-for-n1ql-march-refresh\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/index-advisor-service-for-n1ql-march-refresh\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/02\/n1ql.png\",\"datePublished\":\"2020-03-31T21:25:00+00:00\",\"dateModified\":\"2025-06-14T00:21:46+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/index-advisor-service-for-n1ql-march-refresh\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/index-advisor-service-for-n1ql-march-refresh\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/index-advisor-service-for-n1ql-march-refresh\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/02\/n1ql.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/02\/n1ql.png\",\"width\":512,\"height\":512,\"caption\":\"N1QL\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/index-advisor-service-for-n1ql-march-refresh\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Index Advisor Service for N1QL (March refresh)\"}]},{\"@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\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@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\/f99c5767a877147f9cf658230bc2473b\",\"name\":\"Kamini Jagtiani\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/257695296726c224fc7f0e85b30c9129\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/546f9f69203064f77430f14922d59be33e3f0ea674078a793fc813dd40310c5c?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/546f9f69203064f77430f14922d59be33e3f0ea674078a793fc813dd40310c5c?s=96&d=mm&r=g\",\"caption\":\"Kamini Jagtiani\"},\"description\":\"Kamini Jagtiani is a Senior Engineering Manager for the Query Team at Couchbase R&amp;D. Before Couchbase, Kamini was 7 years at Futurewei as Kernel Architect\/Manager and 13 years at IBM Informix as Software Engineer. Kamini has a Bachelors's degree in Computer Science and Engineering from Bombay University, India and holds 5 US patents.\",\"url\":\"https:\/\/www.couchbase.com\/blog\/author\/kaminijagtiani\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Index Advisor Service for N1QL (March refresh) - 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\/index-advisor-service-for-n1ql-march-refresh\/","og_locale":"en_US","og_type":"article","og_title":"Index Advisor Service for N1QL (March refresh)","og_description":"This is our March drop for Index Advisor service for N1QL after fixing some of the bugs that were found after our last refresh in Feb. We plan to keep improvising the Index Advisor service(What is it?). The fixes in [&hellip;]","og_url":"https:\/\/www.couchbase.com\/blog\/index-advisor-service-for-n1ql-march-refresh\/","og_site_name":"The Couchbase Blog","article_published_time":"2020-03-31T21:25:00+00:00","article_modified_time":"2025-06-14T00:21:46+00:00","og_image":[{"width":512,"height":512,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/02\/n1ql.png","type":"image\/png"}],"author":"Kamini Jagtiani","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Kamini Jagtiani","Est. reading time":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/index-advisor-service-for-n1ql-march-refresh\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/index-advisor-service-for-n1ql-march-refresh\/"},"author":{"name":"Kamini Jagtiani","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/f99c5767a877147f9cf658230bc2473b"},"headline":"Index Advisor Service for N1QL (March refresh)","datePublished":"2020-03-31T21:25:00+00:00","dateModified":"2025-06-14T00:21:46+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/index-advisor-service-for-n1ql-march-refresh\/"},"wordCount":538,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/index-advisor-service-for-n1ql-march-refresh\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/02\/n1ql.png","keywords":["Index Advisor","Indexes","Query optimization","Secondary indexes"],"articleSection":["Couchbase Capella","Couchbase Server","Global Secondary Index","SQL++ \/ N1QL Query"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/index-advisor-service-for-n1ql-march-refresh\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/index-advisor-service-for-n1ql-march-refresh\/","url":"https:\/\/www.couchbase.com\/blog\/index-advisor-service-for-n1ql-march-refresh\/","name":"Index Advisor Service for N1QL (March refresh) - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/index-advisor-service-for-n1ql-march-refresh\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/index-advisor-service-for-n1ql-march-refresh\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/02\/n1ql.png","datePublished":"2020-03-31T21:25:00+00:00","dateModified":"2025-06-14T00:21:46+00:00","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/index-advisor-service-for-n1ql-march-refresh\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/index-advisor-service-for-n1ql-march-refresh\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.couchbase.com\/blog\/index-advisor-service-for-n1ql-march-refresh\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/02\/n1ql.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/02\/n1ql.png","width":512,"height":512,"caption":"N1QL"},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/index-advisor-service-for-n1ql-march-refresh\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Index Advisor Service for N1QL (March refresh)"}]},{"@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":"en-US"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"The Couchbase Blog","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@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\/f99c5767a877147f9cf658230bc2473b","name":"Kamini Jagtiani","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/257695296726c224fc7f0e85b30c9129","url":"https:\/\/secure.gravatar.com\/avatar\/546f9f69203064f77430f14922d59be33e3f0ea674078a793fc813dd40310c5c?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/546f9f69203064f77430f14922d59be33e3f0ea674078a793fc813dd40310c5c?s=96&d=mm&r=g","caption":"Kamini Jagtiani"},"description":"Kamini Jagtiani is a Senior Engineering Manager for the Query Team at Couchbase R&amp;D. Before Couchbase, Kamini was 7 years at Futurewei as Kernel Architect\/Manager and 13 years at IBM Informix as Software Engineer. Kamini has a Bachelors's degree in Computer Science and Engineering from Bombay University, India and holds 5 US patents.","url":"https:\/\/www.couchbase.com\/blog\/author\/kaminijagtiani\/"}]}},"authors":[{"term_id":9099,"user_id":50908,"is_guest":0,"slug":"kaminijagtiani","display_name":"Kamini Jagtiani","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/546f9f69203064f77430f14922d59be33e3f0ea674078a793fc813dd40310c5c?s=96&d=mm&r=g","author_category":"","last_name":"Jagtiani","first_name":"Kamini","job_title":"","user_url":"","description":"Kamini Jagtiani is a Senior Engineering Manager for the Query Team at Couchbase R&amp;D. Before Couchbase, Kamini was 7 years at Futurewei as Kernel Architect\/Manager and 13 years at IBM Informix as Software Engineer. Kamini has a Bachelors's degree in Computer Science and Engineering from Bombay University, India and holds 5 US patents."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts\/8376","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/users\/50908"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/comments?post=8376"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts\/8376\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/media\/2560"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/media?parent=8376"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/categories?post=8376"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/tags?post=8376"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/ppma_author?post=8376"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}