{"id":4270,"date":"2022-06-28T16:43:42","date_gmt":"2022-06-28T16:43:42","guid":{"rendered":"https:\/\/nenadnoveljic.com\/blog\/?p=4270"},"modified":"2023-01-18T12:48:12","modified_gmt":"2023-01-18T12:48:12","slug":"window-sort-pushed-rank-performance-regression-in-oracle-21c","status":"publish","type":"post","link":"https:\/\/nenadnoveljic.com\/blog\/window-sort-pushed-rank-performance-regression-in-oracle-21c\/","title":{"rendered":"WINDOW SORT PUSHED RANK Performance Regression in Oracle 21c"},"content":{"rendered":"<p>Merge with a WINDOW SORT PUSHED RANK in the execution plan can perform drastically worse in Oracle 21c than in 19c (tested on 21.6 and 19.15, respectively).<\/p>\n<p>Here&#8217;s the test case:<\/p>\n<pre><code>create table t1 (n1 number, c1 varchar2(10)) ;\ncreate table t2 (n1 number, c1 varchar2(10), n2 number) ;\n\ninsert into t1 select level, null from dual connect by level &lt;= 5*1e5 ;\ninsert into t2 select 5*1e5 + level, 'X', 1 from dual connect by level &lt;= 4*1e5 ;\ncommit ;\n\nexec dbms_stats.gather_table_stats(null, 'T1');\nexec dbms_stats.gather_table_stats(null, 'T2');\n\nset timing on \n\nmerge \/*+ gather_plan_statistics monitor *\/ --nenad\ninto t1 using\n( select n1,c1 from \n  ( select n1,c1, \n      row_number() over (partition by n1 order by n2 desc) rn\n\tfrom t2\n  ) where rn = 1\n) v1\non ( v1.n1 = t1.n1 )\nwhen matched then \nupdate set t1.c1 = v1.c1 ;<\/code><\/pre>\n<p>On 19c, merge took less than a second to complete:<\/p>\n<pre><code>Global Stats\n=========================================\n| Elapsed |   Cpu   |  Other   | Buffer |\n| Time(s) | Time(s) | Waits(s) |  Gets  |\n=========================================\n|    <span style=\"color:green\">0.41<\/span> |    0.40 |     0.01 |   1683 |\n=========================================\n\nSQL Plan Monitoring Details (Plan Hash Value=3917951292)\n===========================================================================================================================================\n| Id |           Operation           | Name |  Rows   | Cost |   Time    | Start  | Execs |   Rows   |  Mem  | Activity | Activity Detail |\n|    |                               |      | (Estim) |      | Active(s) | Active |       | (Actual) | (Max) |   (%)    |   (# samples)   |\n===========================================================================================================================================\n|  0 | MERGE STATEMENT               |      |         |      |         1 |     +1 |     1 |        1 |     . |          |                 |\n|  1 |   MERGE                       | T1   |         |      |         1 |     +1 |     1 |        1 |     . |          |                 |\n|  2 |    VIEW                       |      |         |      |           |        |     1 |          |     . |          |                 |\n|  3 |     HASH JOIN                 |      |       1 | 3161 |         1 |     +1 |     1 |        0 |  32MB |          |                 |\n|  4 |      TABLE ACCESS FULL        | T1   |    500K |  155 |         1 |     +1 |     1 |     500K |     . |          |                 |\n|  5 |      VIEW                     |      |    400K | 1750 |         1 |     +1 |     1 |     400K |     . |          |                 |\n|  6 |       WINDOW SORT PUSHED RANK |      |    400K | 1750 |         1 |     +1 |     1 |     400K |  23MB |          |                 |\n|  7 |        TABLE ACCESS FULL      | T2   |    400K |  155 |         1 |     +1 |     1 |     400K |     . |          |                 |\n===========================================================================================================================================<\/code><\/pre>\n<p>On 21c, the identical execution plan took 185s, mostly on CPU:<\/p>\n<pre><code>Global Stats\n=========================================\n| Elapsed |   Cpu   |  Other   | Buffer |\n| Time(s) | Time(s) | Waits(s) |  Gets  |\n=========================================\n|     <span style=\"color:red\">185<\/span> |     180 |     4.55 |   1639 |\n=========================================\n\nSQL Plan Monitoring Details (Plan Hash Value=3917951292)\n===========================================================================================================================================\n| Id |           Operation           | Name |  Rows   | Cost |   Time    | Start  | Execs |   Rows   |  Mem  | Activity | Activity Detail |\n|    |                               |      | (Estim) |      | Active(s) | Active |       | (Actual) | (Max) |   (%)    |   (# samples)   |\n===========================================================================================================================================\n|  0 | MERGE STATEMENT               |      |         |      |         1 |   +184 |     1 |        1 |     . |          |                 |\n|  1 |   MERGE                       | T1   |         |      |         1 |   +184 |     1 |        1 |     . |          |                 |\n|  2 |    VIEW                       |      |         |      |           |        |     1 |          |     . |          |                 |\n|  3 |     HASH JOIN                 |      |       1 | 3161 |       183 |     +2 |     1 |        0 |  32MB |          |                 |\n|  4 |      TABLE ACCESS FULL        | T1   |    500K |  155 |         1 |     +2 |     1 |     500K |     . |          |                 |\n|  5 |      VIEW                     |      |    400K | 1750 |       183 |     +2 |     1 |     400K |     . |          |                 |\n|  6 |       <span style=\"color:red\">WINDOW SORT PUSHED RANK<\/span> |      |    400K | 1750 |       <span style=\"color:red\">184<\/span> |     +1 |     1 |     400K |  23MB |          |                 |\n|  7 |        TABLE ACCESS FULL      | T2   |    400K |  155 |         1 |     +2 |     1 |     400K |     . |          |                 |\n===========================================================================================================================================<\/code><\/pre>\n<p>In spite of the identical execution plan and the same number of logical reads, the execution was much longer in 21c. All the extra time was spent in the <span style=\"color:red\">WINDOW SORT PUSHED RANK<\/span> step. In particular, the profiled execution shows that the most of the time was spent in the Oracle C function <span style=\"color:red\">smbgetqbPart<\/span>:<\/p>\n<pre><code>export BPFTRACE_CACHE_USER_SYMBOLS=1\nbpftrace -e 'profile:hz:99 \n\/ pid == 2990815 \/ \n{ \n  @[ustack()] = count(); \n}'\n\n@[\n<span style=\"color:red\">smbgetqbPart<\/span>+477\nsorgetqbf+599\nqerwnFetch+718\nqerstFetch+534\nqervwFetch+163\nqerstFetch+534\nrwsfcd+151\nqerstFetch+534\nqerhnFetch+6565\nqerstFetch+534\nqervwFetch+163\nqerstFetch+534\nrwsfcd+151\nqerstFetch+534\nqerusFetch+685\nqerstFetch+534\nupdaul+3457\nupdThreePhaseExe+325\nupsexe+1024\nopiexe+12237\nkpoal8+2239\nopiodr+1256\nttcpip+1257\nopitsk+1906\nopiino+1008\nopiodr+1256\nopidrv+1067\nsou2o+165\nopimai_real+400\nssthrdmain+412\nmain+292\n__libc_start_main+243\n0x5541f689495641d7\n]: 1886<\/code><\/pre>\n<p>Based on the naming, I&#8217;m guessing that the function <span style=\"color:red\">smbgetqbPart<\/span> gets the query block window partition. The problem is a very high number of executions (<span style=\"color:red\">800001<\/span>), which, intuitively, seems unnecessary:<\/p>\n<pre><code>bpftrace -e 'uprobe:\/u00\/oracle\/orabase\/product\/21.6.0.0.220419_b\/bin\/oracle:smbgetqbPart+2\n\/ pid == 2990815 \/ \n{ \n  @ = count(); \n}'\n\n@: <span style=\"color:red\">800001<\/span><\/code><\/pre>\n<p>In contrast, in 19c the function hasn&#8217;t been executed at all:<\/p>\n<pre><code>bpftrace -e 'uprobe:\/u00\/oracle\/orabase\/product\/19.15.0.0.220419_a\/bin\/oracle:smbgetqbPart+2\n\/ pid == 3139940 \/ \n{ \n  @ = count(); \n}'\n\n@: <span style=\"color:green\">0<\/span><\/code><\/pre>\n<p>Simply put, the window partitioning execution changed between two releases. In particular, the following optimization introduced the problem:<\/p>\n<pre><code>select bugno, value, sql_feature, description, optimizer_feature_enable \n  from v$system_fix_control \n  where lower(description) like '%pushed rank%' ;\n\n     BUGNO      VALUE\n---------- ----------\nSQL_FEATURE\n----------------------------------------------------------------\nDESCRIPTION\n----------------------------------------------------------------\nOPTIMIZER_FEATURE_ENABLE\n-------------------------\n  30822446          1\nQKSFM_EXECUTION_30822446\nenable window pushed rank optimization with partition by keys\n21.1.0<\/code><\/pre>\n<p>After switching off the bug fix:<\/p>\n<pre><code>alter session set \"_FIX_CONTROL\"='30822446:OFF'  ;<\/code><\/pre>\n<p>the execution time reduced to the normal levels:<\/p>\n<pre><code>Elapsed: 00:00:00.40<\/code><\/pre>\n<p>Also, the function smbgetqbPart isn&#8217;t being executed anymore:<\/p>\n<pre><code>bpftrace -e 'uprobe:\/u00\/oracle\/orabase\/product\/21.6.0.0.220419_b\/bin\/oracle:smbgetqbPart+2\n\/ pid == 3154842 \/ \n{ \n  @ = count(); \n}'\n\n@: 0<\/code><\/pre>\n<p>In conclusion, the new window pushed rank optimization can cause a severe performance degradation in Oracle 21c. Fortunately, the change can be switched off with the fix control (not documented in the Oracle support database).<\/p>\n<h1>Update on January 18, 2023<\/h1>\n<p>Oracle released the patch &#8220;34381258 MERGE PERFORMANCE ISSUE AFTER BUG FIX 30822446&#8221; to fix the problem. Thanks to Martin Decker for mentioning this in the <a href=\"https:\/\/nenadnoveljic.com\/blog\/window-sort-pushed-rank-performance-regression-in-oracle-21c\/#comment-29531\">comment<\/a>. The patch is currently available for 19c but not for 21c. I tested it on top of 19.17.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>New optimization causing severe performance degradation. It can be switched off with the fix control. <a href=\"https:\/\/nenadnoveljic.com\/blog\/window-sort-pushed-rank-performance-regression-in-oracle-21c\/\" 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":[46,53,5],"tags":[],"class_list":["post-4270","post","type-post","status-publish","format-standard","hentry","category-21c","category-ebpf","category-oracle"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>WINDOW SORT PUSHED RANK Performance Regression in Oracle 21c - All-round Database Topics<\/title>\n<meta name=\"description\" content=\"New optimization causing severe performance degradation. It can be switched off with the fix control.\" \/>\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\/window-sort-pushed-rank-performance-regression-in-oracle-21c\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"WINDOW SORT PUSHED RANK Performance Regression in Oracle 21c - All-round Database Topics\" \/>\n<meta property=\"og:description\" content=\"New optimization causing severe performance degradation. It can be switched off with the fix control.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/nenadnoveljic.com\/blog\/window-sort-pushed-rank-performance-regression-in-oracle-21c\/\" \/>\n<meta property=\"og:site_name\" content=\"All-round Database Topics\" \/>\n<meta property=\"article:published_time\" content=\"2022-06-28T16:43:42+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-01-18T12:48:12+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=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/window-sort-pushed-rank-performance-regression-in-oracle-21c\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/window-sort-pushed-rank-performance-regression-in-oracle-21c\\\/\"},\"author\":{\"name\":\"Nenad Noveljic\",\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/#\\\/schema\\\/person\\\/51458d9dd86dbbdd19f5add451d44efa\"},\"headline\":\"WINDOW SORT PUSHED RANK Performance Regression in Oracle 21c\",\"datePublished\":\"2022-06-28T16:43:42+00:00\",\"dateModified\":\"2023-01-18T12:48:12+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/window-sort-pushed-rank-performance-regression-in-oracle-21c\\\/\"},\"wordCount\":276,\"commentCount\":10,\"articleSection\":[\"21c\",\"eBPF\",\"Oracle\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/window-sort-pushed-rank-performance-regression-in-oracle-21c\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/window-sort-pushed-rank-performance-regression-in-oracle-21c\\\/\",\"url\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/window-sort-pushed-rank-performance-regression-in-oracle-21c\\\/\",\"name\":\"WINDOW SORT PUSHED RANK Performance Regression in Oracle 21c - All-round Database Topics\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/#website\"},\"datePublished\":\"2022-06-28T16:43:42+00:00\",\"dateModified\":\"2023-01-18T12:48:12+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/#\\\/schema\\\/person\\\/51458d9dd86dbbdd19f5add451d44efa\"},\"description\":\"New optimization causing severe performance degradation. It can be switched off with the fix control.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/window-sort-pushed-rank-performance-regression-in-oracle-21c\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/window-sort-pushed-rank-performance-regression-in-oracle-21c\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/window-sort-pushed-rank-performance-regression-in-oracle-21c\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"WINDOW SORT PUSHED RANK Performance Regression in Oracle 21c\"}]},{\"@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":"WINDOW SORT PUSHED RANK Performance Regression in Oracle 21c - All-round Database Topics","description":"New optimization causing severe performance degradation. It can be switched off with the fix control.","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\/window-sort-pushed-rank-performance-regression-in-oracle-21c\/","og_locale":"en_US","og_type":"article","og_title":"WINDOW SORT PUSHED RANK Performance Regression in Oracle 21c - All-round Database Topics","og_description":"New optimization causing severe performance degradation. It can be switched off with the fix control.","og_url":"https:\/\/nenadnoveljic.com\/blog\/window-sort-pushed-rank-performance-regression-in-oracle-21c\/","og_site_name":"All-round Database Topics","article_published_time":"2022-06-28T16:43:42+00:00","article_modified_time":"2023-01-18T12:48:12+00:00","author":"Nenad Noveljic","twitter_card":"summary_large_image","twitter_creator":"@NenadNoveljic","twitter_misc":{"Written by":"Nenad Noveljic","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/nenadnoveljic.com\/blog\/window-sort-pushed-rank-performance-regression-in-oracle-21c\/#article","isPartOf":{"@id":"https:\/\/nenadnoveljic.com\/blog\/window-sort-pushed-rank-performance-regression-in-oracle-21c\/"},"author":{"name":"Nenad Noveljic","@id":"https:\/\/nenadnoveljic.com\/blog\/#\/schema\/person\/51458d9dd86dbbdd19f5add451d44efa"},"headline":"WINDOW SORT PUSHED RANK Performance Regression in Oracle 21c","datePublished":"2022-06-28T16:43:42+00:00","dateModified":"2023-01-18T12:48:12+00:00","mainEntityOfPage":{"@id":"https:\/\/nenadnoveljic.com\/blog\/window-sort-pushed-rank-performance-regression-in-oracle-21c\/"},"wordCount":276,"commentCount":10,"articleSection":["21c","eBPF","Oracle"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/nenadnoveljic.com\/blog\/window-sort-pushed-rank-performance-regression-in-oracle-21c\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/nenadnoveljic.com\/blog\/window-sort-pushed-rank-performance-regression-in-oracle-21c\/","url":"https:\/\/nenadnoveljic.com\/blog\/window-sort-pushed-rank-performance-regression-in-oracle-21c\/","name":"WINDOW SORT PUSHED RANK Performance Regression in Oracle 21c - All-round Database Topics","isPartOf":{"@id":"https:\/\/nenadnoveljic.com\/blog\/#website"},"datePublished":"2022-06-28T16:43:42+00:00","dateModified":"2023-01-18T12:48:12+00:00","author":{"@id":"https:\/\/nenadnoveljic.com\/blog\/#\/schema\/person\/51458d9dd86dbbdd19f5add451d44efa"},"description":"New optimization causing severe performance degradation. It can be switched off with the fix control.","breadcrumb":{"@id":"https:\/\/nenadnoveljic.com\/blog\/window-sort-pushed-rank-performance-regression-in-oracle-21c\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/nenadnoveljic.com\/blog\/window-sort-pushed-rank-performance-regression-in-oracle-21c\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/nenadnoveljic.com\/blog\/window-sort-pushed-rank-performance-regression-in-oracle-21c\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/nenadnoveljic.com\/blog\/"},{"@type":"ListItem","position":2,"name":"WINDOW SORT PUSHED RANK Performance Regression in Oracle 21c"}]},{"@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\/4270","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=4270"}],"version-history":[{"count":1,"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/posts\/4270\/revisions"}],"predecessor-version":[{"id":4380,"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/posts\/4270\/revisions\/4380"}],"wp:attachment":[{"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/media?parent=4270"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/categories?post=4270"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/tags?post=4270"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}