{"id":304,"date":"2008-12-28T13:51:03","date_gmt":"2008-12-28T12:51:03","guid":{"rendered":"http:\/\/bar-solutions.com\/wordpress\/?p=304"},"modified":"2008-12-28T13:51:03","modified_gmt":"2008-12-28T12:51:03","slug":"useless-joins","status":"publish","type":"post","link":"https:\/\/blog.bar-solutions.com\/?p=304","title":{"rendered":"Useless joins&#8230;"},"content":{"rendered":"<p>Sometimes when you\u2019re building queries you end up joining tables which you don\u2019t really need (anymore). They are just there to join some other table from which you do need some data. The join is just there to satisfy some foreign key references. It can however greatly impact the speed of your query. If the database doesn\u2019t need to look at the data in the table it is normally much faster (if you don\u2019t have to do the work, you\u2019re always finished).<\/p>\n<p> <!--more-->  <\/p>\n<p>Look at the following test script and see how it can be done without the extra join:<\/p>\n<div>\n<div style=\"padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none\">\n<pre style=\"padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none\"><span style=\"color: #0000ff\">select<\/span> blog1.*<\/pre>\n<pre style=\"padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none\">     , blog2.*<\/pre>\n<pre style=\"padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none\">  <span style=\"color: #0000ff\">from<\/span> blog1<\/pre>\n<pre style=\"padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none\">  <span style=\"color: #0000ff\">join<\/span> blog3 <span style=\"color: #0000ff\">on<\/span> blog1.blog3_id = blog3.id<\/pre>\n<pre style=\"padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none\">  <span style=\"color: #0000ff\">join<\/span> blog2 <span style=\"color: #0000ff\">on<\/span> blog2.blog3_id = blog3.id<\/pre>\n<pre style=\"padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none\">\/<\/pre>\n<\/p><\/div>\n<\/div>\n<p>and:<\/p>\n<div>\n<div style=\"padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none\">\n<pre style=\"padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none\"><span style=\"color: #0000ff\">select<\/span> blog1.*<\/pre>\n<pre style=\"padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none\">     , blog2.*<\/pre>\n<pre style=\"padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none\">  <span style=\"color: #0000ff\">from<\/span> blog1<\/pre>\n<pre style=\"padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none\">  <span style=\"color: #0000ff\">join<\/span> blog2 <span style=\"color: #0000ff\">on<\/span> blog2.blog3_id = blog1.blog3_id<\/pre>\n<pre style=\"padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none\">\/<\/pre>\n<\/p><\/div>\n<\/div>\n<p>The results for both queries are the same, but the second query has to do less work. When you look at the explain plans you see that the second query is&#160; doing less work<\/p>\n<p><font face=\"Courier New\" size=\"2\">PLAN_TABLE_OUTPUT<br \/>\n    <br \/>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; <\/p>\n<p>Plan hash value: 3385940288 <\/p>\n<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; <\/p>\n<p>| Id&#160; | Operation&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | Name&#160;&#160;&#160;&#160;&#160;&#160;&#160; | Rows&#160; | Bytes | Cost (%CPU)| Time <\/p>\n<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; <\/p>\n<p>|&#160;&#160; 0 | SELECT STATEMENT&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160; 3 |&#160;&#160; 279 |&#160;&#160;&#160;&#160; 7&#160; (15)| 00:00:0 <\/p>\n<p>|*&#160; 1 |&#160; HASH JOIN&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160; 3 |&#160;&#160; 279 |&#160;&#160;&#160;&#160; 7&#160; (15)| 00:00:0 <\/p>\n<p>|&#160;&#160; 2 |&#160;&#160; NESTED LOOPS&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160; 3 |&#160;&#160; 159 |&#160;&#160;&#160;&#160; 3&#160;&#160; (0)| 00:00:0 <\/p>\n<p>|&#160;&#160; 3 |&#160;&#160;&#160; TABLE ACCESS FULL| BLOG1&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160; 3 |&#160;&#160; 120 |&#160;&#160;&#160;&#160; 3&#160;&#160; (0)| 00:00:0 <\/p>\n<p>|*&#160; 4 |&#160;&#160;&#160; INDEX UNIQUE SCAN| PK_BLOG3_ID |&#160;&#160;&#160;&#160; 1 |&#160;&#160;&#160; 13 |&#160;&#160;&#160;&#160; 0&#160;&#160; (0)| 00:00:0 <\/p>\n<p>|&#160;&#160; 5 |&#160;&#160; TABLE ACCESS FULL | BLOG2&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160; 3 |&#160;&#160; 120 |&#160;&#160;&#160;&#160; 3&#160;&#160; (0)| 00:00:0 <\/p>\n<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; <\/p>\n<p>Predicate Information (identified by operation id): <\/p>\n<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; <\/p>\n<p>&#160;&#160; 1 &#8211; access(&quot;BLOG2&quot;.&quot;BLOG3_ID&quot;=&quot;BLOG3&quot;.&quot;ID&quot;) <\/p>\n<p>&#160;&#160; 4 &#8211; access(&quot;BLOG1&quot;.&quot;BLOG3_ID&quot;=&quot;BLOG3&quot;.&quot;ID&quot;) <\/p>\n<p>Note <\/p>\n<p>&#160;&#160; &#8211; dynamic sampling used for this statement <\/p>\n<p>22 rows selected<\/font><\/p>\n<p><font face=\"Courier New\" size=\"2\">PLAN_TABLE_OUTPUT<br \/>\n    <br \/>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; <\/p>\n<p>Plan hash value: 2974663523 <\/p>\n<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;- <\/p>\n<p>| Id&#160; | Operation&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | Name&#160; | Rows&#160; | Bytes | Cost (%CPU)| Time&#160;&#160;&#160;&#160; | <\/p>\n<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;- <\/p>\n<p>|&#160;&#160; 0 | SELECT STATEMENT&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160; 3 |&#160;&#160; 240 |&#160;&#160;&#160;&#160; 7&#160; (15)| 00:00:01 | <\/p>\n<p>|*&#160; 1 |&#160; HASH JOIN&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160; 3 |&#160;&#160; 240 |&#160;&#160;&#160;&#160; 7&#160; (15)| 00:00:01 | <\/p>\n<p>|&#160;&#160; 2 |&#160;&#160; TABLE ACCESS FULL| BLOG1 |&#160;&#160;&#160;&#160; 3 |&#160;&#160; 120 |&#160;&#160;&#160;&#160; 3&#160;&#160; (0)| 00:00:01 | <\/p>\n<p>|&#160;&#160; 3 |&#160;&#160; TABLE ACCESS FULL| BLOG2 |&#160;&#160;&#160;&#160; 3 |&#160;&#160; 120 |&#160;&#160;&#160;&#160; 3&#160;&#160; (0)| 00:00:01 | <\/p>\n<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;- <\/p>\n<p>Predicate Information (identified by operation id): <\/p>\n<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; <\/p>\n<p>&#160;&#160; 1 &#8211; access(&quot;BLOG2&quot;.&quot;BLOG3_ID&quot;=&quot;BLOG1&quot;.&quot;BLOG3_ID&quot;) <\/p>\n<p>Note <\/p>\n<p>&#8212;&#8211; <\/p>\n<p>&#160;&#160; &#8211; dynamic sampling used for this statement <\/p>\n<p>19 rows selected<\/font><\/p>\n<p>Note that is this demo there is little work done and you may not even note the difference in performance, but using real tables with real data in them can make your queries speed up an order of magnitude when you exterminate the useless joins.<\/p>\n<div><script language=\"javascript\" type=\"text\/javascript\">function showHide(ADiv) {if (document.getElementById) {  divhandle = document.getElementById(ADiv).style;} else { if (document.layers) {  divhandle = document.ADiv;} else {  divhandle = document.all.ADiv.style; }}if (divhandle.display == \"\") { divhandle.display = \"none\";} else { divhandle.display = \"\"; } }<\/script><a href=\"javascript:showHide('10cb1ae5-d2fe-4f79-a049-323a50441160')\">show entire test script<\/a> <\/p>\n<div id=\"10cb1ae5-d2fe-4f79-a049-323a50441160\" style=\"display: none\"><font face=\"Courier New\" size=\"2\">clear screen<br \/>\n      <br \/>set serveroutput on <\/p>\n<p>set echo off <\/font><\/p>\n<p><font face=\"Courier New\" size=\"2\">drop table blog1 purge<br \/>\n        <br \/>\/ <\/p>\n<p>drop table blog2 purge <\/p>\n<p>\/ <\/p>\n<p>drop table blog3 purge <\/p>\n<p>\/ <\/p>\n<p>&#8212; truncate the explain plan table <\/p>\n<p>truncate table plan_table <\/p>\n<p>\/ <\/font><\/p>\n<p><font face=\"Courier New\" size=\"2\">create table blog1<br \/>\n        <br \/>( id number(35) <\/p>\n<p>, value1 varchar2(10) <\/p>\n<p>, value2 varchar2(10) <\/p>\n<p>, blog3_id number(35) <\/p>\n<p>) <\/p>\n<p>\/ <\/p>\n<p>create table blog2 <\/p>\n<p>( id number(35) <\/p>\n<p>, value1 varchar2(10) <\/p>\n<p>, value2 varchar2(10) <\/p>\n<p>, blog3_id number(35) <\/p>\n<p>) <\/p>\n<p>\/ <\/p>\n<p>create table blog3 <\/p>\n<p>( id number(35) <\/p>\n<p>, value1 varchar2(10) <\/p>\n<p>, value2 varchar2(10) <\/p>\n<p>) <\/p>\n<p>\/ <\/p>\n<p>&#8212; add the constraints <\/p>\n<p>alter table blog1 add constraint pk_blog1_id primary key (ID); <\/p>\n<p>alter table blog2 add constraint pk_blog2_id primary key (ID); <\/p>\n<p>alter table blog3 add constraint pk_blog3_id primary key (ID); <\/p>\n<p>alter table blog1 add constraint fk_blog1_blog3_id foreign key (BLOG3_ID) references blog3 (ID); <\/p>\n<p>alter table blog2 add constraint fk_blog2_blog3_id foreign key (BLOG3_ID) references blog3 (ID); <\/p>\n<p>&#8212; add some records <\/p>\n<p>insert into blog3(id, value1, value2) values (1, &#8216;one&#8217;, &#8216;first&#8217;) <\/p>\n<p>\/ <\/p>\n<p>insert into blog3(id, value1, value2) values (2, &#8216;two&#8217;, &#8216;second&#8217;) <\/p>\n<p>\/ <\/p>\n<p>insert into blog3(id, value1, value2) values (3, &#8216;three&#8217;, &#8216;third&#8217;) <\/p>\n<p>\/ <\/p>\n<p>&#8212; <\/p>\n<p>insert into blog1(id, value1, value2, blog3_id) values (1, &#8216;one&#8217;, &#8216;first&#8217;, 1) <\/p>\n<p>\/ <\/p>\n<p>insert into blog1(id, value1, value2, blog3_id) values (2, &#8216;two&#8217;, &#8216;second&#8217;, 2) <\/p>\n<p>\/ <\/p>\n<p>insert into blog1(id, value1, value2, blog3_id) values (3, &#8216;three&#8217;, &#8216;third&#8217;, 3) <\/p>\n<p>\/ <\/p>\n<p>&#8212; <\/p>\n<p>insert into blog2(id, value1, value2, blog3_id) values (1, &#8216;one&#8217;, &#8216;first&#8217;, 1) <\/p>\n<p>\/ <\/p>\n<p>insert into blog2(id, value1, value2, blog3_id) values (2, &#8216;two&#8217;, &#8216;second&#8217;, 2) <\/p>\n<p>\/ <\/p>\n<p>insert into blog2(id, value1, value2, blog3_id) values (3, &#8216;three&#8217;, &#8216;third&#8217;, 3) <\/p>\n<p>\/ <\/p>\n<p>set timing on <\/font><\/p>\n<p><font face=\"Courier New\" size=\"2\">select blog1.*<br \/>\n        <br \/>&#160;&#160;&#160;&#160; , blog2.* <\/p>\n<p>&#160; from blog1 <\/p>\n<p>&#160; join blog3 on blog1.blog3_id = blog3.id <\/p>\n<p>&#160; join blog2 on blog2.blog3_id = blog3.id <\/p>\n<p>\/ <\/p>\n<p>select blog1.* <\/p>\n<p>&#160;&#160;&#160;&#160; , blog2.* <\/p>\n<p>&#160; from blog1 <\/p>\n<p>&#160; join blog2 on blog2.blog3_id = blog1.blog3_id <\/p>\n<p>\/ <\/font><\/p>\n<p><font face=\"Courier New\" size=\"2\">EXPLAIN PLAN FOR<br \/>\n        <br \/>select blog1.* <\/p>\n<p>&#160;&#160;&#160;&#160; , blog2.* <\/p>\n<p>&#160; from blog1 <\/p>\n<p>&#160; join blog3 on blog1.blog3_id = blog3.id <\/p>\n<p>&#160; join blog2 on blog2.blog3_id = blog3.id <\/p>\n<p>\/ <\/p>\n<p>SELECT PLAN_TABLE_OUTPUT FROM TABLE(DBMS_XPLAN.DISPLAY()) <\/p>\n<p>\/ <\/p>\n<p>&#8212; <\/p>\n<p>&#8212; <\/p>\n<p>EXPLAIN PLAN FOR <\/p>\n<p>select blog1.* <\/p>\n<p>&#160;&#160;&#160;&#160; , blog2.* <\/p>\n<p>&#160; from blog1 <\/p>\n<p>&#160; join blog2 on blog2.blog3_id = blog1.blog3_id <\/p>\n<p>\/ <\/p>\n<p>SELECT PLAN_TABLE_OUTPUT FROM TABLE(DBMS_XPLAN.DISPLAY()) <\/p>\n<p>\/ <\/p>\n<p>commit; <\/p>\n<p>set timing off <\/font><\/p>\n<p><font face=\"Courier New\" size=\"2\">&#8212; clean up<br \/>\n        <br \/>drop table blog1 purge <\/p>\n<p>\/ <\/p>\n<p>drop table blog2 purge <\/p>\n<p>\/ <\/p>\n<p>drop table blog3 purge <\/p>\n<p>\/<\/font> <\/p>\n<\/p><\/div>\n<p>links used in this post:<\/p>\n<p><a title=\"http:\/\/download.oracle.com\/docs\/cd\/B28359_01\/server.111\/b28274\/ex_plan.htm\" href=\"http:\/\/download.oracle.com\/docs\/cd\/B28359_01\/server.111\/b28274\/ex_plan.htm\" target=\"_blank\">http:\/\/download.oracle.com\/docs\/cd\/B28359_01\/server.111\/b28274\/ex_plan.htm<\/a><\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Sometimes when you\u2019re building queries you end up joining tables which you don\u2019t really need (anymore). They are just there to join some other table from which you do need some data. The join is just there to satisfy some foreign key references. It can however greatly impact the speed of your query. If the [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2,9],"tags":[],"class_list":["post-304","post","type-post","status-publish","format-standard","hentry","category-oracle","category-sql"],"_links":{"self":[{"href":"https:\/\/blog.bar-solutions.com\/index.php?rest_route=\/wp\/v2\/posts\/304","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.bar-solutions.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.bar-solutions.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.bar-solutions.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.bar-solutions.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=304"}],"version-history":[{"count":0,"href":"https:\/\/blog.bar-solutions.com\/index.php?rest_route=\/wp\/v2\/posts\/304\/revisions"}],"wp:attachment":[{"href":"https:\/\/blog.bar-solutions.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=304"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.bar-solutions.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=304"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.bar-solutions.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=304"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}