{"id":6990,"date":"2023-07-13T00:00:00","date_gmt":"2023-07-13T04:00:00","guid":{"rendered":"https:\/\/www.sisense.com\/how-joins-work\/"},"modified":"2024-09-23T15:29:03","modified_gmt":"2024-09-23T19:29:03","slug":"how-joins-work","status":"publish","type":"post","link":"https:\/\/www.sisense.com\/blog\/how-joins-work\/","title":{"rendered":"How Joins Work"},"content":{"rendered":"\r\n<p>The SQL join operation is one of the most powerful and commonly used SQL operations, but little attention is paid to how the internal SQL engine breaks down the tasks of join operations. This post will explore the common algorithms that databases use to compute them, including nested loop, hash, and merge joins. Our aim is to act as a resource for SQL users interested in exploring optimizations.<\/p>\r\n\r\n\r\n\r\n<p>The examples use Postgres version 9.5.4.2 and the \u2018world\u2019 sample database that can be downloaded from pgfoundry.<\/p>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">Nested loop join<\/h2>\r\n\r\n\r\n\r\n<p>A join is defined as the cartesian product of two tables followed by a filter on the join predicate. The nested loop algorithm follow directly from the definition. For two tables INNER and OUTER and a join predicate P, nested loop joins concatenate every record in OUTER with every record in INNER and filter each result record on P.<\/p>\r\n\r\n\r\n\r\n<p>Consider the following query:<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>SELECT\r\n  *\r\nFROM\r\n  country\r\n  JOIN countrylanguage ON\r\n    True<\/code><\/pre>\r\n\r\n\r\n\r\n<p>Running \u2018explain\u2019 on it returns:<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code> QUERY PLAN\r\n-------------------------------------------------------------------\r\nNested Loop (cost=0.00..2963.53 rows=235176 width=130)\r\n -&gt; Seq Scan on countrylanguage (cost=0.00..15.84 rows=984 width=17)\r\n -&gt; Materialize (cost=0.00..8.59 rows=239 width=113)\r\n     -&gt; Seq Scan on country (cost=0.00..7.39 rows=239 width=113)<\/code><\/pre>\r\n\r\n\r\n\r\n<p>The query asks for every record in one table combined with every record in another. There\u2019s no opportunity for pruning, so the query planner has no choice but to choose the nested loop join.<\/p>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">Hash join<\/h2>\r\n\r\n\r\n\r\n<p>For queries with equijoins \u2014 or joins that exclusively use the equality operator \u2014 nested loops can be slower than necessary. Instead of iterating through each record in an inner table for each record in the outer, hash joins build a temporary hash table to index the values of the field whose equality is being tested. This saves time at the cost of memory. The outer table applies a hash function over the comparison fields and navigates to the matching stored values created in the earlier step, reducing the number of records it must traverse.<\/p>\r\n\r\n\r\n\r\n<p>To get each city paired with its country, we can perform an equijoin.<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>SELECT\r\n  city.name\r\n  , country.name\r\nFROM\r\n  city\r\n  JOIN country ON\r\n    city.countrycode = country.code<\/code><\/pre>\r\n\r\n\r\n\r\n<p>This yields the following query plan:<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code> QUERY PLAN\r\n------------------------------------------------------------------\r\nHash Join (cost=10.38..139.25 rows=4079 width=20)\r\n Hash Cond: (city.countrycode = country.code)\r\n -&gt;  Seq Scan on city (cost=0.00..72.79 rows=4079 width=13)\r\n -&gt;  Hash  (cost=7.39..7.39 rows=239 width=15)\r\n       -&gt;  Seq Scan on country (cost=0.00..7.39 rows=239 width=15)<\/code><\/pre>\r\n\r\n\r\n\r\n<p>First, the query planner performs a full table scan on the country table to create a hash table for the possible values of country.code. Finally, a full table scan on city uses the hash table to return records whose countrycode equals country.code. Note that the query planner chose to build the hash table from the smaller table. Building it from the larger city table will return the same result but will take slightly longer and, more importantly, use more RAM. Databases optimize for memory accesses. I\/O operations are orders of magnitude slower.<\/p>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">Merge join<\/h2>\r\n\r\n\r\n\r\n<p>As tables get large, nested loop and hash joins can become costly. Large datasets quickly use up RAM and force the query planner to perform many expensive I\/O operations to move data in and out of memory. For these cases, query planners will likely use a merge join.<\/p>\r\n\r\n\r\n\r\n<p>Like hash join, merge join consists of two steps. First, both tables of the join are sorted on the join attribute. This can be done with just two passes through each table via an external merge sort. Finally, the result tuples are generated as the next ordered element is pulled from each table and the join attributes are compared.<\/p>\r\n\r\n\r\n\r\n<p>To see the merge join in action, we join two large tables by creating a query to count how many pairs of unique cities have the sum of their populations equal to the difference of populations of any two unique cities.<\/p>\r\n\r\n\r\n\r\n<p>To simplify the size of the SQL, we create two views; one for all the possible sums and one for all the possible differences:<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>CREATE\r\n  VIEW sum_any2 AS SELECT city1.population + city2.population\r\n    AS pop\r\n  FROM\r\n    city AS city1\r\n    , city AS city2\r\n  WHERE\r\n    city1.id &lt; city2.id\r\nCREATE\r\n  VIEW diff_any2 AS SELECT city1.population - city2.population\r\n    AS pop\r\n  FROM\r\n    city AS city1\r\n    , city AS city2\r\n  WHERE\r\n    city1.population &gt; city2.population<\/code><\/pre>\r\n\r\n\r\n\r\n<p>These two views generate tables of over 8 million records each. The count query follows:<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>SELECT\r\n  count(1)\r\nFROM\r\n  sum_any2\r\n  JOIN diff_any2 ON\r\n    sum_any2.pop = diff_any2.pop<\/code><\/pre>\r\n\r\n\r\n\r\n<p>Run \u2018explain\u2019 to see the query plan. Note, that this may vary depending on your Postgres setup.<\/p>\r\n\r\n\r\n\r\n<p>Here we see each view is generated with a nested loop join that feed into sort operations that feed into a merge join operation, just as we expected.<\/p>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">Gaining a greater understanding of joins<\/h2>\r\n\r\n\r\n\r\n<p>While the knowledge of how joins occur is not required for most day-to-day work, understanding the process promotes a greater appreciation for the algorithms that drive the SQL engine.<\/p>\r\n","protected":false},"excerpt":{"rendered":"<p>The SQL join operation is one of the most powerful and commonly used SQL operations, but little attention is paid to how the internal SQL engine breaks down the tasks of join operations. This post will explore the common algorithms&#8230;<\/p>\n","protected":false},"author":4,"featured_media":8297,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_searchwp_excluded":"","footnotes":"","_links_to":"","_links_to_target":""},"categories":[44],"tags":[472],"application":[10],"buyer-role":[],"buyer-stage":[],"department":[6],"industry":[],"topic":[],"class_list":["post-6990","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tech-talk","tag-data-team","application-cloud-data-teams","department-it"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v23.5 (Yoast SEO v23.8) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>How Joins Work | Sisense<\/title>\n<meta name=\"description\" content=\"This post will explore the common algorithms that databases use to compute them, including nested loop, hash, and merge joins.\" \/>\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.sisense.com\/blog\/how-joins-work\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How Joins Work\" \/>\n<meta property=\"og:description\" content=\"The SQL join operation is one of the most powerful and commonly used SQL operations, but little attention is paid to how the internal SQL engine breaks\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.sisense.com\/blog\/how-joins-work\/\" \/>\n<meta property=\"og:site_name\" content=\"Sisense\" \/>\n<meta property=\"article:published_time\" content=\"2023-07-13T04:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-09-23T19:29:03+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/cdn.sisense.com\/wp-content\/uploads\/pd-blog-yoast-how-joins-work.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"628\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Sisense Team\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/cdn.sisense.com\/wp-content\/uploads\/pd-blog-yoast-how-joins-work.jpg\" \/>\n<meta name=\"twitter:creator\" content=\"@sisense\" \/>\n<meta name=\"twitter:site\" content=\"@sisense\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Sisense Team\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.sisense.com\/blog\/how-joins-work\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.sisense.com\/blog\/how-joins-work\/\"},\"author\":{\"name\":\"Sisense Team\",\"@id\":\"https:\/\/www.sisense.com\/#\/schema\/person\/e70aa3a7bbc471e4b7b8c5a7d2b36115\"},\"headline\":\"How Joins Work\",\"datePublished\":\"2023-07-13T04:00:00+00:00\",\"dateModified\":\"2024-09-23T19:29:03+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.sisense.com\/blog\/how-joins-work\/\"},\"wordCount\":671,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.sisense.com\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.sisense.com\/blog\/how-joins-work\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/cdn.sisense.com\/wp-content\/uploads\/pd-blog-featured-how-joins-work-min-1.jpg\",\"keywords\":[\"data team\"],\"articleSection\":[\"Tech Talk\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.sisense.com\/blog\/how-joins-work\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.sisense.com\/blog\/how-joins-work\/\",\"url\":\"https:\/\/www.sisense.com\/blog\/how-joins-work\/\",\"name\":\"How Joins Work | Sisense\",\"isPartOf\":{\"@id\":\"https:\/\/www.sisense.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.sisense.com\/blog\/how-joins-work\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.sisense.com\/blog\/how-joins-work\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/cdn.sisense.com\/wp-content\/uploads\/pd-blog-featured-how-joins-work-min-1.jpg\",\"datePublished\":\"2023-07-13T04:00:00+00:00\",\"dateModified\":\"2024-09-23T19:29:03+00:00\",\"description\":\"This post will explore the common algorithms that databases use to compute them, including nested loop, hash, and merge joins.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.sisense.com\/blog\/how-joins-work\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.sisense.com\/blog\/how-joins-work\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.sisense.com\/blog\/how-joins-work\/#primaryimage\",\"url\":\"https:\/\/cdn.sisense.com\/wp-content\/uploads\/pd-blog-featured-how-joins-work-min-1.jpg\",\"contentUrl\":\"https:\/\/cdn.sisense.com\/wp-content\/uploads\/pd-blog-featured-how-joins-work-min-1.jpg\",\"width\":1200,\"height\":628,\"caption\":\"pd blog featured how joins work min 1\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.sisense.com\/blog\/how-joins-work\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.sisense.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"How Joins Work\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.sisense.com\/#website\",\"url\":\"https:\/\/www.sisense.com\/\",\"name\":\"Sisense\",\"description\":\"Build your business with anywhere-analytics\",\"publisher\":{\"@id\":\"https:\/\/www.sisense.com\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.sisense.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.sisense.com\/#organization\",\"name\":\"Sisense\",\"url\":\"https:\/\/www.sisense.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.sisense.com\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/cdn.sisense.com\/wp-content\/uploads\/sisense-yoast-og.jpg\",\"contentUrl\":\"https:\/\/cdn.sisense.com\/wp-content\/uploads\/sisense-yoast-og.jpg\",\"width\":1200,\"height\":600,\"caption\":\"Sisense\"},\"image\":{\"@id\":\"https:\/\/www.sisense.com\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/x.com\/sisense\",\"https:\/\/www.linkedin.com\/company\/sisense\",\"https:\/\/github.com\/sisense\/\"],\"description\":\"Sisense accelerates product innovation through AI\/ML capabilities. Our global analytics platform lets customers drive better, faster decisions for their business and end users.\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.sisense.com\/#\/schema\/person\/e70aa3a7bbc471e4b7b8c5a7d2b36115\",\"name\":\"Sisense Team\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.sisense.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/213e415f47bc3c7f0155a0755b1cea8c?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/213e415f47bc3c7f0155a0755b1cea8c?s=96&d=mm&r=g\",\"caption\":\"Sisense Team\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"How Joins Work | Sisense","description":"This post will explore the common algorithms that databases use to compute them, including nested loop, hash, and merge joins.","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.sisense.com\/blog\/how-joins-work\/","og_locale":"en_US","og_type":"article","og_title":"How Joins Work","og_description":"The SQL join operation is one of the most powerful and commonly used SQL operations, but little attention is paid to how the internal SQL engine breaks","og_url":"https:\/\/www.sisense.com\/blog\/how-joins-work\/","og_site_name":"Sisense","article_published_time":"2023-07-13T04:00:00+00:00","article_modified_time":"2024-09-23T19:29:03+00:00","og_image":[{"width":1200,"height":628,"url":"https:\/\/cdn.sisense.com\/wp-content\/uploads\/pd-blog-yoast-how-joins-work.jpg","type":"image\/jpeg"}],"author":"Sisense Team","twitter_card":"summary_large_image","twitter_image":"https:\/\/cdn.sisense.com\/wp-content\/uploads\/pd-blog-yoast-how-joins-work.jpg","twitter_creator":"@sisense","twitter_site":"@sisense","twitter_misc":{"Written by":"Sisense Team","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.sisense.com\/blog\/how-joins-work\/#article","isPartOf":{"@id":"https:\/\/www.sisense.com\/blog\/how-joins-work\/"},"author":{"name":"Sisense Team","@id":"https:\/\/www.sisense.com\/#\/schema\/person\/e70aa3a7bbc471e4b7b8c5a7d2b36115"},"headline":"How Joins Work","datePublished":"2023-07-13T04:00:00+00:00","dateModified":"2024-09-23T19:29:03+00:00","mainEntityOfPage":{"@id":"https:\/\/www.sisense.com\/blog\/how-joins-work\/"},"wordCount":671,"commentCount":0,"publisher":{"@id":"https:\/\/www.sisense.com\/#organization"},"image":{"@id":"https:\/\/www.sisense.com\/blog\/how-joins-work\/#primaryimage"},"thumbnailUrl":"https:\/\/cdn.sisense.com\/wp-content\/uploads\/pd-blog-featured-how-joins-work-min-1.jpg","keywords":["data team"],"articleSection":["Tech Talk"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.sisense.com\/blog\/how-joins-work\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.sisense.com\/blog\/how-joins-work\/","url":"https:\/\/www.sisense.com\/blog\/how-joins-work\/","name":"How Joins Work | Sisense","isPartOf":{"@id":"https:\/\/www.sisense.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.sisense.com\/blog\/how-joins-work\/#primaryimage"},"image":{"@id":"https:\/\/www.sisense.com\/blog\/how-joins-work\/#primaryimage"},"thumbnailUrl":"https:\/\/cdn.sisense.com\/wp-content\/uploads\/pd-blog-featured-how-joins-work-min-1.jpg","datePublished":"2023-07-13T04:00:00+00:00","dateModified":"2024-09-23T19:29:03+00:00","description":"This post will explore the common algorithms that databases use to compute them, including nested loop, hash, and merge joins.","breadcrumb":{"@id":"https:\/\/www.sisense.com\/blog\/how-joins-work\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.sisense.com\/blog\/how-joins-work\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.sisense.com\/blog\/how-joins-work\/#primaryimage","url":"https:\/\/cdn.sisense.com\/wp-content\/uploads\/pd-blog-featured-how-joins-work-min-1.jpg","contentUrl":"https:\/\/cdn.sisense.com\/wp-content\/uploads\/pd-blog-featured-how-joins-work-min-1.jpg","width":1200,"height":628,"caption":"pd blog featured how joins work min 1"},{"@type":"BreadcrumbList","@id":"https:\/\/www.sisense.com\/blog\/how-joins-work\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.sisense.com\/"},{"@type":"ListItem","position":2,"name":"How Joins Work"}]},{"@type":"WebSite","@id":"https:\/\/www.sisense.com\/#website","url":"https:\/\/www.sisense.com\/","name":"Sisense","description":"Build your business with anywhere-analytics","publisher":{"@id":"https:\/\/www.sisense.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.sisense.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.sisense.com\/#organization","name":"Sisense","url":"https:\/\/www.sisense.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.sisense.com\/#\/schema\/logo\/image\/","url":"https:\/\/cdn.sisense.com\/wp-content\/uploads\/sisense-yoast-og.jpg","contentUrl":"https:\/\/cdn.sisense.com\/wp-content\/uploads\/sisense-yoast-og.jpg","width":1200,"height":600,"caption":"Sisense"},"image":{"@id":"https:\/\/www.sisense.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/x.com\/sisense","https:\/\/www.linkedin.com\/company\/sisense","https:\/\/github.com\/sisense\/"],"description":"Sisense accelerates product innovation through AI\/ML capabilities. Our global analytics platform lets customers drive better, faster decisions for their business and end users."},{"@type":"Person","@id":"https:\/\/www.sisense.com\/#\/schema\/person\/e70aa3a7bbc471e4b7b8c5a7d2b36115","name":"Sisense Team","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.sisense.com\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/213e415f47bc3c7f0155a0755b1cea8c?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/213e415f47bc3c7f0155a0755b1cea8c?s=96&d=mm&r=g","caption":"Sisense Team"}}]}},"_links":{"self":[{"href":"https:\/\/www.sisense.com\/wp-json\/wp\/v2\/posts\/6990"}],"collection":[{"href":"https:\/\/www.sisense.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.sisense.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.sisense.com\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/www.sisense.com\/wp-json\/wp\/v2\/comments?post=6990"}],"version-history":[{"count":0,"href":"https:\/\/www.sisense.com\/wp-json\/wp\/v2\/posts\/6990\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.sisense.com\/wp-json\/wp\/v2\/media\/8297"}],"wp:attachment":[{"href":"https:\/\/www.sisense.com\/wp-json\/wp\/v2\/media?parent=6990"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.sisense.com\/wp-json\/wp\/v2\/categories?post=6990"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.sisense.com\/wp-json\/wp\/v2\/tags?post=6990"},{"taxonomy":"application","embeddable":true,"href":"https:\/\/www.sisense.com\/wp-json\/wp\/v2\/application?post=6990"},{"taxonomy":"buyer-role","embeddable":true,"href":"https:\/\/www.sisense.com\/wp-json\/wp\/v2\/buyer-role?post=6990"},{"taxonomy":"buyer-stage","embeddable":true,"href":"https:\/\/www.sisense.com\/wp-json\/wp\/v2\/buyer-stage?post=6990"},{"taxonomy":"department","embeddable":true,"href":"https:\/\/www.sisense.com\/wp-json\/wp\/v2\/department?post=6990"},{"taxonomy":"industry","embeddable":true,"href":"https:\/\/www.sisense.com\/wp-json\/wp\/v2\/industry?post=6990"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/www.sisense.com\/wp-json\/wp\/v2\/topic?post=6990"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}