{"id":5507,"date":"2015-09-10T18:12:39","date_gmt":"2015-09-10T16:12:39","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/join-transitive-closure-and-query-simplification-considerations\/"},"modified":"2015-09-10T18:12:39","modified_gmt":"2015-09-10T16:12:39","slug":"join-transitive-closure-and-query-simplification-considerations","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/join-transitive-closure-and-query-simplification-considerations\/","title":{"rendered":"Join transitive closure and query simplification considerations"},"content":{"rendered":"<p>Yesterday, I had a discussion with one of my friend who works with Oracle about some different behaviours between each query optimizer against one particular query. You can read his blog post and get the repro script <a href=\"http:\/\/blog.dba-ob.com\/post\/2015\/09\/09\/optimisation-de-requete\">here<\/a>. I decided to write a blog post because our discussion has introduced some interesting concepts and I wanted to explain more things from the SQL Server side.<\/p>\n<p>First of all let me set the scene that is pretty basic as shown below:<\/p>\n<p><a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/blog-60-1-case-description.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-3776\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/blog-60-1-case-description.jpg\" alt=\"blog 60- 1 - case description\" width=\"611\" height=\"110\" \/><\/a><\/p>\n<p>Note the implementation of the foreign keys that is very important because they will allow to the query optimizer to assume safely some assumptions: col2a column values in the Table2 exist in the Col1a column in the Table1 and in the same manner, Col2b column values in the Table2 and the Col3c column values in the Table3.<\/p>\n<p>Now let\u2019s execute the following query with SQL Server as my friend did on Oracle \u2026<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">select \n\tt1.col1a,\n\tt2.*,\n\tt3.col3b\nfrom table1 t1\ninner join table2 t2 \n\ton t1.col1a=t2.col2a\ninner join table3 t3 \n\ton t2.col2b=t3.col3b\nwhere t3.col3b=51\n\tOR t1.col1a=50;\n<\/pre>\n<p>&nbsp;<\/p>\n<p>\u2026 and let\u2019s get the execution plan:<\/p>\n<p><a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/blog-60-2-Execution-plan.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-3777\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/blog-60-2-Execution-plan.jpg\" alt=\"blog 60- 2 - Execution plan\" width=\"336\" height=\"142\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>My first conclusion was that this execution plan is pretty normal because we want to retrieve values from columns in the 3 tables (projection) and in the same time we use the predicates that concern the columns of both the Table1 and Table3 tables. At this point, I didn\u2019t have in mind the definition of these tables. However, my friend told me that this query can be simplified because of the transitive property of the join predicates and he was right. Indeed, the query optimizer may potentially use them with some transitive closure strategies to produce a more efficient query plan.<\/p>\n<p>The transitive properties can be located here:<\/p>\n<p><span style=\"color: #000000;font-family: Calibri\">t2.col2b = t3.col3b = 51<br \/>\nt2.col2a = t1.col1a = 50<\/span><\/p>\n<p>Go ahead and now let\u2019s assume we can also apply some commutative rules here in the projection. The columns below are concerned by the foreign key and we can assume safely that their values are equal<\/p>\n<p><span style=\"color: #000000;font-family: Calibri\">t1.col1a = t2.col2a<br \/>\nt3.col3b = t2.col2b<\/span><\/p>\n<p>Then, from these two rules we may now deduce that the following query is equivalent to our first query:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">select \n\tt2.col2a,\n\tt2.*,\n\tt2.col2b\nfrom table1 t1\ninner join table2 t2\n\t on t1.col1a=t2.col2a\ninner join table3 t3 \n\ton t2.col2b=t3.col3b\nwhere t2.col2b=51\n\tOR t2.col2a=50;<\/pre>\n<p>&nbsp;<\/p>\n<p>We can still simplify the query as follows \u2026<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">select \n\tt2.*\nfrom table1 t1\ninner join table2 t2\n\t on t1.col1a=t2.col2a\ninner join table3 t3 \n\ton t2.col2b=t3.col3b\nwhere t2.col2b=51\n\tOR t2.col2a=50;<\/pre>\n<p>&nbsp;<\/p>\n<p>\u2026 and finally get the following execution plan:<\/p>\n<p><a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/blog-60-3-Execution-plan-simplified.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-3778\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/blog-60-3-Execution-plan-simplified.jpg\" alt=\"blog 60- 3 - Execution plan simplified\" width=\"184\" height=\"89\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>This is exactly the kind of simplification that my friend got from Oracle\u2019s query optimizer. Let\u2019s go back to the first query and let\u2019s display the join simplification phase of the query optimization process by implementing the query trace 8606<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">select \n\tt1.col1a,\n\tt2.*,\n\tt3.col3b\nfrom table1 t1\ninner join table2 t2 \n\ton t1.col1a=t2.col2a\ninner join table3 t3 \n\ton t2.col2b=t3.col3b\nwhere t3.col3b=51\n\tOR t1.col1a=50\noption\n(\n    querytraceon 3604,  -- Output to console\n    querytraceon 8606  -- Logical operators tree\n)\ngo<\/pre>\n<p>&nbsp;<\/p>\n<p>Here, our focus is on Join-collapsed Tree section (the tree after initial join reordering and removing unnecessary joins) and unfortunately we don\u2019t see any relevant stuff performed by the query optimizer (at least what we can expect).<\/p>\n<p><a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/blog-60-4-join-simplification.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-3779\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/blog-60-4-join-simplification.jpg\" alt=\"blog 60- 4 - join simplification\" width=\"849\" height=\"319\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>Let\u2019s take a look at the same phase with the simplified query this time:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">select \n\tt2.*\nfrom table1 t1\ninner join table2 t2\n\t on t1.col1a=t2.col2a\ninner join table3 t3 \n\ton t2.col2b=t3.col3b\nwhere t2.col2b=51\n\tOR t2.col2a=50\noption\n(\n    querytraceon 3604,  -- Output to console\n    querytraceon 8606  -- Logical operators tree\n)\ngo<\/pre>\n<p><a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/blog-60-5-join-simplification-2.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-3780\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/blog-60-5-join-simplification-2.jpg\" alt=\"blog 60- 5 - join simplification 2\" width=\"847\" height=\"181\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>This time the story is not the same because the query optimizer is able to perform the necessary eliminations joins but we had to help it a little bit ..<\/p>\n<p>Hope this helps.<\/p>\n<p>By David Barbarin<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Yesterday, I had a discussion with one of my friend who works with Oracle about some different behaviours between each query optimizer against one particular query. You can read his blog post and get the repro script here. I decided to write a blog post because our discussion has introduced some interesting concepts and I [&hellip;]<\/p>\n","protected":false},"author":26,"featured_media":5513,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[368],"tags":[649,67,650,51,651],"type_dbi":[],"class_list":["post-5507","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development-performance","tag-join","tag-performance","tag-query-optimizer","tag-sql-server","tag-transitive"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.2 (Yoast SEO v27.2) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Join transitive closure and query simplification considerations<\/title>\n<meta name=\"description\" content=\"Join transitive closure and query simplification considerations\" \/>\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.dbi-services.com\/blog\/join-transitive-closure-and-query-simplification-considerations\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Join transitive closure and query simplification considerations\" \/>\n<meta property=\"og:description\" content=\"Join transitive closure and query simplification considerations\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/join-transitive-closure-and-query-simplification-considerations\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2015-09-10T16:12:39+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/blog-60-1-case-description-1.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"611\" \/>\n\t<meta property=\"og:image:height\" content=\"110\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Microsoft Team\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Microsoft 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.dbi-services.com\/blog\/join-transitive-closure-and-query-simplification-considerations\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/join-transitive-closure-and-query-simplification-considerations\/\"},\"author\":{\"name\":\"Microsoft Team\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/bfab48333280d616e1170e7369df90a4\"},\"headline\":\"Join transitive closure and query simplification considerations\",\"datePublished\":\"2015-09-10T16:12:39+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/join-transitive-closure-and-query-simplification-considerations\/\"},\"wordCount\":512,\"commentCount\":0,\"image\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/join-transitive-closure-and-query-simplification-considerations\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/blog-60-1-case-description-1.jpg\",\"keywords\":[\"Join\",\"Performance\",\"query optimizer\",\"SQL Server\",\"Transitive\"],\"articleSection\":[\"Development &amp; Performance\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/join-transitive-closure-and-query-simplification-considerations\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/join-transitive-closure-and-query-simplification-considerations\/\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/join-transitive-closure-and-query-simplification-considerations\/\",\"name\":\"Join transitive closure and query simplification considerations\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/join-transitive-closure-and-query-simplification-considerations\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/join-transitive-closure-and-query-simplification-considerations\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/blog-60-1-case-description-1.jpg\",\"datePublished\":\"2015-09-10T16:12:39+00:00\",\"author\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/bfab48333280d616e1170e7369df90a4\"},\"description\":\"Join transitive closure and query simplification considerations\",\"breadcrumb\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/join-transitive-closure-and-query-simplification-considerations\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/join-transitive-closure-and-query-simplification-considerations\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/join-transitive-closure-and-query-simplification-considerations\/#primaryimage\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/blog-60-1-case-description-1.jpg\",\"contentUrl\":\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/blog-60-1-case-description-1.jpg\",\"width\":611,\"height\":110},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/join-transitive-closure-and-query-simplification-considerations\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/www.dbi-services.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Join transitive closure and query simplification considerations\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#website\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/\",\"name\":\"dbi Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.dbi-services.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/bfab48333280d616e1170e7369df90a4\",\"name\":\"Microsoft Team\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/secure.gravatar.com\/avatar\/c44a1a792c059f24055763aa77d80a244467f6eef724a8bd13db8d4a350b7a4c?s=96&d=mm&r=g\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/c44a1a792c059f24055763aa77d80a244467f6eef724a8bd13db8d4a350b7a4c?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/c44a1a792c059f24055763aa77d80a244467f6eef724a8bd13db8d4a350b7a4c?s=96&d=mm&r=g\",\"caption\":\"Microsoft Team\"},\"url\":\"https:\/\/www.dbi-services.com\/blog\/author\/microsoft-team\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Join transitive closure and query simplification considerations","description":"Join transitive closure and query simplification considerations","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.dbi-services.com\/blog\/join-transitive-closure-and-query-simplification-considerations\/","og_locale":"en_US","og_type":"article","og_title":"Join transitive closure and query simplification considerations","og_description":"Join transitive closure and query simplification considerations","og_url":"https:\/\/www.dbi-services.com\/blog\/join-transitive-closure-and-query-simplification-considerations\/","og_site_name":"dbi Blog","article_published_time":"2015-09-10T16:12:39+00:00","og_image":[{"width":611,"height":110,"url":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/blog-60-1-case-description-1.jpg","type":"image\/jpeg"}],"author":"Microsoft Team","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Microsoft Team","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dbi-services.com\/blog\/join-transitive-closure-and-query-simplification-considerations\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/join-transitive-closure-and-query-simplification-considerations\/"},"author":{"name":"Microsoft Team","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/bfab48333280d616e1170e7369df90a4"},"headline":"Join transitive closure and query simplification considerations","datePublished":"2015-09-10T16:12:39+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/join-transitive-closure-and-query-simplification-considerations\/"},"wordCount":512,"commentCount":0,"image":{"@id":"https:\/\/www.dbi-services.com\/blog\/join-transitive-closure-and-query-simplification-considerations\/#primaryimage"},"thumbnailUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/blog-60-1-case-description-1.jpg","keywords":["Join","Performance","query optimizer","SQL Server","Transitive"],"articleSection":["Development &amp; Performance"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/join-transitive-closure-and-query-simplification-considerations\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/join-transitive-closure-and-query-simplification-considerations\/","url":"https:\/\/www.dbi-services.com\/blog\/join-transitive-closure-and-query-simplification-considerations\/","name":"Join transitive closure and query simplification considerations","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/join-transitive-closure-and-query-simplification-considerations\/#primaryimage"},"image":{"@id":"https:\/\/www.dbi-services.com\/blog\/join-transitive-closure-and-query-simplification-considerations\/#primaryimage"},"thumbnailUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/blog-60-1-case-description-1.jpg","datePublished":"2015-09-10T16:12:39+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/bfab48333280d616e1170e7369df90a4"},"description":"Join transitive closure and query simplification considerations","breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/join-transitive-closure-and-query-simplification-considerations\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/join-transitive-closure-and-query-simplification-considerations\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.dbi-services.com\/blog\/join-transitive-closure-and-query-simplification-considerations\/#primaryimage","url":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/blog-60-1-case-description-1.jpg","contentUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/blog-60-1-case-description-1.jpg","width":611,"height":110},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/join-transitive-closure-and-query-simplification-considerations\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Join transitive closure and query simplification considerations"}]},{"@type":"WebSite","@id":"https:\/\/www.dbi-services.com\/blog\/#website","url":"https:\/\/www.dbi-services.com\/blog\/","name":"dbi Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.dbi-services.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/bfab48333280d616e1170e7369df90a4","name":"Microsoft Team","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/c44a1a792c059f24055763aa77d80a244467f6eef724a8bd13db8d4a350b7a4c?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/c44a1a792c059f24055763aa77d80a244467f6eef724a8bd13db8d4a350b7a4c?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/c44a1a792c059f24055763aa77d80a244467f6eef724a8bd13db8d4a350b7a4c?s=96&d=mm&r=g","caption":"Microsoft Team"},"url":"https:\/\/www.dbi-services.com\/blog\/author\/microsoft-team\/"}]}},"_links":{"self":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/5507","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/users\/26"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/comments?post=5507"}],"version-history":[{"count":0,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/5507\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media\/5513"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=5507"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=5507"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=5507"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=5507"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}