{"id":1766,"date":"2018-03-18T18:40:49","date_gmt":"2018-03-18T18:40:49","guid":{"rendered":"http:\/\/nenadnoveljic.com\/blog\/?p=1766"},"modified":"2018-03-18T18:40:49","modified_gmt":"2018-03-18T18:40:49","slug":"join-cardinality-misestimate-adjustment-to-zero-issue-in-oracle-12-2-part-2","status":"publish","type":"post","link":"https:\/\/nenadnoveljic.com\/blog\/join-cardinality-misestimate-adjustment-to-zero-issue-in-oracle-12-2-part-2\/","title":{"rendered":"Join Cardinality Misestimate (&#8220;Adjustment-to-Zero Issue&#8221;) in Oracle 12.2 &#8211; Part 2"},"content":{"rendered":"<p>As you may remember, in <a href=\"http:\/\/nenadnoveljic.com\/blog\/join-cardinality-misestimate\/\">one of my previous blog posts<\/a> I wrote about the problem with wrong join cardinalities related to SQL plan directives. In a nutshell, join cardinalities are being adjusted to zero, irrespective of the dynamic sampling result. <\/p>\n<p>In fact, you can find the evidence of that anomaly in the optimizer trace file:<\/p>\n<pre><code>Join Card adjusted from 444734.345351 to 0.000000 due to adaptive dynamic sampling, prelen=2<\/code><\/pre>\n<p>In the example from the previous article, I used the no_unnest hint to reproduce the problem. Therefore, the example might appear just too artificial. So, I&#8217;m expanding it now to something that looks a bit more realistic. What I mean by that is that I engineered a new test case where CBO rather himself decides not to do subquery unnesting. This means that no hint is needed any more for reproducing the problem. In addition, the issue becomes even more obvious as, unlike in the previous test case, a wrong cardinality estimation leads to a disastrous execution plan.<\/p>\n<p>Obviously, the original test case has undergone some changes. To begin with, I added the fourth table t4:<\/p>\n<pre><code>create table t1 ( n1 number ) ;\r\n\r\ninsert into t1\r\n  select trunc(level\/4)+1\r\n    from dual connect by level <= 320000 ;\r\n\r\n<span style=\"color: #ff0000;\">create table t4 ( n1 number ) ;\r\ninsert into t4\r\n  select level\r\n    from dual connect by level <= 80000 ;   <\/span>\r\ncommit ;\r\n\r\nexec dbms_stats.gather_table_stats( null, 'T1' ) ;\r\nexec dbms_stats.gather_table_stats( null, 'T4' ) ;\r\n\r\ncreate table t2 ( n1 number , n2 number ) ;  \r\ncreate table t3 ( n1 number , n2 number ) ;    \r\n\r\nexec dbms_stats.gather_table_stats( null, 'T2' ) ;\r\nexec dbms_stats.gather_table_stats( null, 'T3' ) ;\r\n\r\ninsert into t2\r\n  select level, level\r\n    from dual connect by level <=150000 ;\r\n\r\ninsert into t3\r\n  select level, trunc(level\/3) \r\n    from dual connect by level <=450000 ;\r\n\r\ncommit ;\r\n\r\nselect distinct t3.n1\r\nfrom t3 \r\n  join t2 on t3.n2 = t2.n2 \r\nwhere t2.n1 = 1  ;\r\n\r\n\/\r\n\r\nexec dbms_spd.flush_sql_plan_directive ;\r\n\r\nEXEC dbms_stats.gather_table_stats( null, 'T2' );\r\nEXEC dbms_stats.gather_table_stats( null, 'T3' );<\/code><\/pre>\n<p>And then I referenced the table t4 in the subquery:<\/p>\n<pre><code>SELECT \/*+ gather_plan_statistics *\/ t3.n1\r\n  FROM t3 JOIN t2 ON t3.n2 = t2.n2\r\n  WHERE t2.n1 IN (SELECT n1 FROM t1 <span style=\"color: #ff0000;\">MINUS SELECT n1 FROM t4<\/span> ) ;\r\n\r\n------------------------------------------------------------------------------------------------------------------\r\n| Id  | Operation            | Name | Starts | E-Rows | A-Rows |   A-Time   | Buffers |  OMem |  1Mem | Used-Mem |\r\n------------------------------------------------------------------------------------------------------------------\r\n|   0 | SELECT STATEMENT     |      |      1 |        |      3 |<span style=\"color: #ff0000;\">00:16:06.57 |      84M<\/span>|       |       |          |\r\n|*  1 |  FILTER              |      |      1 |        |      3 |00:16:06.57 |      84M|       |       |          |\r\n|*  2 |   HASH JOIN          |      |      1 |      <span style=\"color: #ff0000;\">1 |    449K<\/span>|00:00:01.00 |    1248 |  9268K|  2474K| 8122K (0)|\r\n|   3 |    TABLE ACCESS FULL | T2   |      1 |    150K|    150K|00:00:00.01 |     314 |       |       |          |\r\n|   4 |    TABLE ACCESS FULL | T3   |      1 |    450K|    450K|00:00:00.16 |     931 |       |       |          |\r\n|   5 |   MINUS              |      |    150K|        |      1 |00:27:21.22 |      84M|       |       |          |\r\n|   6 |    SORT UNIQUE NOSORT|      |    150K|      4 |  80001 |00:24:06.86 |      73M|       |       |          |\r\n|*  7 |     TABLE ACCESS FULL| T1   |    150K|      4 |    320K|00:17:40.57 |      73M|       |       |          |\r\n|   8 |    SORT UNIQUE NOSORT|      |  80001 |      1 |  80000 |00:03:14.01 |      10M|       |       |          |\r\n|*  9 |     TABLE ACCESS FULL| T4   |  80001 |      1 |  80000 |00:03:13.69 |      10M|       |       |          |\r\n------------------------------------------------------------------------------------------------------------------\r\n\r\nPredicate Information (identified by operation id):\r\n---------------------------------------------------\r\n\r\n   1 - filter( IS NOT NULL)\r\n   2 - access(\"T3\".\"N2\"=\"T2\".\"N2\")\r\n   7 - filter(\"N1\"=:B1)\r\n   9 - filter(\"N1\"=:B1)\r\n\r\nNote\r\n-----\r\n   - dynamic statistics used: dynamic sampling (level=2)\r\n   - 1 Sql Plan Directive used for this statement<\/code><\/pre>\n<p>As you can see, the query performed 84 million logical reads and executed in 16:06 minutes. The main reason for the bad plan is the misestimate in the step 2, which, in turn, is a consequence of the adjustment-to-zero issue.<\/p>\n<p>However, the subsequent executions yield a far better execution plan:<\/p>\n<pre><code>------------------------------------------------------------------------------------------------------------------------\r\n| Id  | Operation              | Name     | Starts | E-Rows | A-Rows |   A-Time   | Buffers |  OMem |  1Mem | Used-Mem |\r\n------------------------------------------------------------------------------------------------------------------------\r\n|   0 | SELECT STATEMENT       |          |      1 |        |      3 |<span style=\"color: #ff0000;\">00:00:00.40 |    1864<\/span> |       |       |          |\r\n|*  1 |  HASH JOIN             |          |      1 |    948K|      3 |00:00:00.40 |    1864 |    25M|  4946K|   38M (0)|\r\n|   2 |   TABLE ACCESS FULL    | T3       |      1 |    450K|    450K|00:00:00.01 |     930 |       |       |          |\r\n|*  3 |   HASH JOIN            |          |      1 |    320K|      1 |00:00:00.12 |     934 |  9268K|  2474K| 8066K (0)|\r\n|   4 |    TABLE ACCESS FULL   | T2       |      1 |    150K|    150K|00:00:00.01 |     314 |       |       |          |\r\n|   5 |    VIEW                | VW_NSO_1 |      1 |    320K|      1 |00:00:00.08 |     620 |       |       |          |\r\n|   6 |     MINUS              |          |      1 |        |      1 |00:00:00.08 |     620 |       |       |          |\r\n|   7 |      SORT UNIQUE       |          |      1 |    320K|  80001 |00:00:00.05 |     492 |  3667K|  1421K| 3259K (0)|\r\n|   8 |       TABLE ACCESS FULL| T1       |      1 |    320K|    320K|00:00:00.01 |     492 |       |       |          |\r\n|   9 |      SORT UNIQUE       |          |      1 |  80000 |  80000 |00:00:00.02 |     128 |  3667K|   822K| 3259K (0)|\r\n|  10 |       TABLE ACCESS FULL| T4       |      1 |  80000 |  80000 |00:00:00.01 |     128 |       |       |          |\r\n------------------------------------------------------------------------------------------------------------------------\r\n\r\nPredicate Information (identified by operation id):\r\n---------------------------------------------------\r\n\r\n   1 - access(\"T3\".\"N2\"=\"T2\".\"N2\")\r\n   3 - access(\"T2\".\"N1\"=\"N1\")<\/code><\/pre>\n<p>This time, the query ran in less than a second and did only 1864 logical reads. Hadn't the optimizer erroneously adjusted the join cardinality to zero, the optimal plan would have been generated at the first execution.<\/p>\n<p>In conclusion, the magnitude of the potential damage is even more visible in the modified test case.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Enhanced example of join cardinality misestimate caused by adjustment-to-zero issue <a href=\"https:\/\/nenadnoveljic.com\/blog\/join-cardinality-misestimate-adjustment-to-zero-issue-in-oracle-12-2-part-2\/\" class=\"more-link\">Continue Reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[22,10,11,5],"tags":[],"class_list":["post-1766","post","type-post","status-publish","format-standard","hentry","category-12-2","category-adaptive-query-optimization","category-cost-based-optimizer","category-oracle"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Join Cardinality Misestimate (&quot;Adjustment-to-Zero Issue&quot;) in Oracle 12.2 - Part 2 - All-round Database Topics<\/title>\n<meta name=\"description\" content=\"Enhanced example of join cardinality misestimate caused by adjustment-to-zero issue\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/nenadnoveljic.com\/blog\/join-cardinality-misestimate-adjustment-to-zero-issue-in-oracle-12-2-part-2\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Join Cardinality Misestimate (&quot;Adjustment-to-Zero Issue&quot;) in Oracle 12.2 - Part 2 - All-round Database Topics\" \/>\n<meta property=\"og:description\" content=\"Enhanced example of join cardinality misestimate caused by adjustment-to-zero issue\" \/>\n<meta property=\"og:url\" content=\"https:\/\/nenadnoveljic.com\/blog\/join-cardinality-misestimate-adjustment-to-zero-issue-in-oracle-12-2-part-2\/\" \/>\n<meta property=\"og:site_name\" content=\"All-round Database Topics\" \/>\n<meta property=\"article:published_time\" content=\"2018-03-18T18:40:49+00:00\" \/>\n<meta name=\"author\" content=\"Nenad Noveljic\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@NenadNoveljic\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Nenad Noveljic\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"1 minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/join-cardinality-misestimate-adjustment-to-zero-issue-in-oracle-12-2-part-2\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/join-cardinality-misestimate-adjustment-to-zero-issue-in-oracle-12-2-part-2\\\/\"},\"author\":{\"name\":\"Nenad Noveljic\",\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/#\\\/schema\\\/person\\\/51458d9dd86dbbdd19f5add451d44efa\"},\"headline\":\"Join Cardinality Misestimate (&#8220;Adjustment-to-Zero Issue&#8221;) in Oracle 12.2 &#8211; Part 2\",\"datePublished\":\"2018-03-18T18:40:49+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/join-cardinality-misestimate-adjustment-to-zero-issue-in-oracle-12-2-part-2\\\/\"},\"wordCount\":294,\"commentCount\":0,\"articleSection\":[\"12.2\",\"adaptive query optimization\",\"cost based optimizer\",\"Oracle\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/join-cardinality-misestimate-adjustment-to-zero-issue-in-oracle-12-2-part-2\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/join-cardinality-misestimate-adjustment-to-zero-issue-in-oracle-12-2-part-2\\\/\",\"url\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/join-cardinality-misestimate-adjustment-to-zero-issue-in-oracle-12-2-part-2\\\/\",\"name\":\"Join Cardinality Misestimate (\\\"Adjustment-to-Zero Issue\\\") in Oracle 12.2 - Part 2 - All-round Database Topics\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/#website\"},\"datePublished\":\"2018-03-18T18:40:49+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/#\\\/schema\\\/person\\\/51458d9dd86dbbdd19f5add451d44efa\"},\"description\":\"Enhanced example of join cardinality misestimate caused by adjustment-to-zero issue\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/join-cardinality-misestimate-adjustment-to-zero-issue-in-oracle-12-2-part-2\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/join-cardinality-misestimate-adjustment-to-zero-issue-in-oracle-12-2-part-2\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/join-cardinality-misestimate-adjustment-to-zero-issue-in-oracle-12-2-part-2\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Join Cardinality Misestimate (&#8220;Adjustment-to-Zero Issue&#8221;) in Oracle 12.2 &#8211; Part 2\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/\",\"name\":\"All-round Database Topics\",\"description\":\"Nenad Noveljic\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/#\\\/schema\\\/person\\\/51458d9dd86dbbdd19f5add451d44efa\",\"name\":\"Nenad Noveljic\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a97b796613ea48ec8a7b79c8ffe1c685dcffc920c68121f6238d5caab5070670?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a97b796613ea48ec8a7b79c8ffe1c685dcffc920c68121f6238d5caab5070670?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a97b796613ea48ec8a7b79c8ffe1c685dcffc920c68121f6238d5caab5070670?s=96&d=mm&r=g\",\"caption\":\"Nenad Noveljic\"},\"sameAs\":[\"nenad-noveljic-9b746a6\",\"https:\\\/\\\/x.com\\\/NenadNoveljic\"],\"url\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/author\\\/nenad\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Join Cardinality Misestimate (\"Adjustment-to-Zero Issue\") in Oracle 12.2 - Part 2 - All-round Database Topics","description":"Enhanced example of join cardinality misestimate caused by adjustment-to-zero issue","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:\/\/nenadnoveljic.com\/blog\/join-cardinality-misestimate-adjustment-to-zero-issue-in-oracle-12-2-part-2\/","og_locale":"en_US","og_type":"article","og_title":"Join Cardinality Misestimate (\"Adjustment-to-Zero Issue\") in Oracle 12.2 - Part 2 - All-round Database Topics","og_description":"Enhanced example of join cardinality misestimate caused by adjustment-to-zero issue","og_url":"https:\/\/nenadnoveljic.com\/blog\/join-cardinality-misestimate-adjustment-to-zero-issue-in-oracle-12-2-part-2\/","og_site_name":"All-round Database Topics","article_published_time":"2018-03-18T18:40:49+00:00","author":"Nenad Noveljic","twitter_card":"summary_large_image","twitter_creator":"@NenadNoveljic","twitter_misc":{"Written by":"Nenad Noveljic","Est. reading time":"1 minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/nenadnoveljic.com\/blog\/join-cardinality-misestimate-adjustment-to-zero-issue-in-oracle-12-2-part-2\/#article","isPartOf":{"@id":"https:\/\/nenadnoveljic.com\/blog\/join-cardinality-misestimate-adjustment-to-zero-issue-in-oracle-12-2-part-2\/"},"author":{"name":"Nenad Noveljic","@id":"https:\/\/nenadnoveljic.com\/blog\/#\/schema\/person\/51458d9dd86dbbdd19f5add451d44efa"},"headline":"Join Cardinality Misestimate (&#8220;Adjustment-to-Zero Issue&#8221;) in Oracle 12.2 &#8211; Part 2","datePublished":"2018-03-18T18:40:49+00:00","mainEntityOfPage":{"@id":"https:\/\/nenadnoveljic.com\/blog\/join-cardinality-misestimate-adjustment-to-zero-issue-in-oracle-12-2-part-2\/"},"wordCount":294,"commentCount":0,"articleSection":["12.2","adaptive query optimization","cost based optimizer","Oracle"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/nenadnoveljic.com\/blog\/join-cardinality-misestimate-adjustment-to-zero-issue-in-oracle-12-2-part-2\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/nenadnoveljic.com\/blog\/join-cardinality-misestimate-adjustment-to-zero-issue-in-oracle-12-2-part-2\/","url":"https:\/\/nenadnoveljic.com\/blog\/join-cardinality-misestimate-adjustment-to-zero-issue-in-oracle-12-2-part-2\/","name":"Join Cardinality Misestimate (\"Adjustment-to-Zero Issue\") in Oracle 12.2 - Part 2 - All-round Database Topics","isPartOf":{"@id":"https:\/\/nenadnoveljic.com\/blog\/#website"},"datePublished":"2018-03-18T18:40:49+00:00","author":{"@id":"https:\/\/nenadnoveljic.com\/blog\/#\/schema\/person\/51458d9dd86dbbdd19f5add451d44efa"},"description":"Enhanced example of join cardinality misestimate caused by adjustment-to-zero issue","breadcrumb":{"@id":"https:\/\/nenadnoveljic.com\/blog\/join-cardinality-misestimate-adjustment-to-zero-issue-in-oracle-12-2-part-2\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/nenadnoveljic.com\/blog\/join-cardinality-misestimate-adjustment-to-zero-issue-in-oracle-12-2-part-2\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/nenadnoveljic.com\/blog\/join-cardinality-misestimate-adjustment-to-zero-issue-in-oracle-12-2-part-2\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/nenadnoveljic.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Join Cardinality Misestimate (&#8220;Adjustment-to-Zero Issue&#8221;) in Oracle 12.2 &#8211; Part 2"}]},{"@type":"WebSite","@id":"https:\/\/nenadnoveljic.com\/blog\/#website","url":"https:\/\/nenadnoveljic.com\/blog\/","name":"All-round Database Topics","description":"Nenad Noveljic","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/nenadnoveljic.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/nenadnoveljic.com\/blog\/#\/schema\/person\/51458d9dd86dbbdd19f5add451d44efa","name":"Nenad Noveljic","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/a97b796613ea48ec8a7b79c8ffe1c685dcffc920c68121f6238d5caab5070670?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/a97b796613ea48ec8a7b79c8ffe1c685dcffc920c68121f6238d5caab5070670?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/a97b796613ea48ec8a7b79c8ffe1c685dcffc920c68121f6238d5caab5070670?s=96&d=mm&r=g","caption":"Nenad Noveljic"},"sameAs":["nenad-noveljic-9b746a6","https:\/\/x.com\/NenadNoveljic"],"url":"https:\/\/nenadnoveljic.com\/blog\/author\/nenad\/"}]}},"_links":{"self":[{"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/posts\/1766","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/comments?post=1766"}],"version-history":[{"count":1,"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/posts\/1766\/revisions"}],"predecessor-version":[{"id":1779,"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/posts\/1766\/revisions\/1779"}],"wp:attachment":[{"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/media?parent=1766"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/categories?post=1766"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/tags?post=1766"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}