{"id":5855,"date":"2015-10-10T21:23:26","date_gmt":"2015-10-10T19:23:26","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/in-memory-trickle-repopulation\/"},"modified":"2015-10-10T21:23:26","modified_gmt":"2015-10-10T19:23:26","slug":"in-memory-trickle-repopulation","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/in-memory-trickle-repopulation\/","title":{"rendered":"In-memory trickle repopulation"},"content":{"rendered":"<h2>By Franck Pachot<\/h2>\n<p>.<br \/>\nIn the &#8216;traditional&#8217; row store, the indexes are maintained at the same time as rows are changed. It&#8217;s different with the In-memory Column Store. Changes are maintained by background processes. When rows are changed, the Snapshot Metadata Units (SMU) logs the changes and In-Memory Compression Units (IMCU) are re-populated asynchronously. Let&#8217;s see an example.<br \/>\n<!--more--><\/p>\n<h3>test case<\/h3>\n<p>I create a one million rows table inmemory and I ensure that it is populated in memory:<\/p>\n<pre><code>\nSQL&gt; create table DEMO inmemory tablespace IOPS as select rownum num,mod(rownum,10) ten from xmltable('1 to 1000000');\nTable created.\n&nbsp;\nSQL&gt; alter session set \"_inmemory_populate_wait\"=true;\nSession altered.\n&nbsp;\nSQL&gt; set timing on\nSQL&gt; select count(*) from DEMO;\n&nbsp;\n  COUNT(*)\n----------\n   1000000\n&nbsp;\nElapsed: 00:00:04.32\n<\/code><\/pre>\n<p>I&#8217;ve used the &#8220;_inmemory_populate_wait&#8221; to wait for the first population and see how long it takes. It is not set for the following sessions.<\/p>\n<h3>Invalidation and repopulation statistics<\/h3>\n<p>For the moment, all rows are populated in memory<\/p>\n<pre><code>\nSQL&gt; select to_char(sysdate,'hh24:mi:ss') \"now\",load_scn,total_rows,invalid_rows,invalid_blocks from V$IM_SMU_HEAD;\n&nbsp;\nnow      LOAD_SCN         TOTAL_ROWS INVALID_ROWS INVALID_BLOCKS\n-------- ---------------- ---------- ------------ --------------\n16:03:19 940920160            491079            0              0\n16:03:19 940920160            508921            0              0\n&nbsp;\nSQL&gt; select prepopulated,repopulated,trickle_repopulated,num_rows,num_blocks,time_to_populate,to_char(timestamp,'hh24:mi:ss') timestamp from V$IM_HEADER;\n&nbsp;\nPREPOPULATED REPOPULATED TRICKLE_REPOPULATED   NUM_ROWS NUM_BLOCKS TIME_TO_POPULATE TIMESTAM\n------------ ----------- ------------------- ---------- ---------- ---------------- --------\n           0           0                   0     491079        874              534 16:03:16\n           0           0                   0     508921        908              506 16:03:16\n<\/code><\/pre>\n<p>As far as i know the TIME_TO_POPULATE is in milliseconds. It&#8217;s the minimum I ever seen with In-memory.<\/p>\n<h3>Consistent gets<\/h3>\n<p>Everything being in memory, a select should not read any block from the buffer cache:<\/p>\n<pre><code>\nExecution Plan\n----------------------------------------------------------\nPlan hash value: 4000794843\n-----------------------------------------------------------------------------------\n| Id  | Operation                  | Name | Rows  | Bytes | Cost (%CPU)| Time     |\n-----------------------------------------------------------------------------------\n|   0 | SELECT STATEMENT           |      |   100K|   781K|    32   (4)| 00:00:01 |\n|*  1 |  TABLE ACCESS INMEMORY FULL| DEMO |   100K|   781K|    32   (4)| 00:00:01 |\n-----------------------------------------------------------------------------------\nPredicate Information (identified by operation id):\n---------------------------------------------------\n   1 - inmemory(\"TEN\"&lt;0)\n       filter(&quot;TEN&quot;&lt;0)\nStatistics\n----------------------------------------------------------\n          0  recursive calls\n          0  db block gets\n          3  consistent gets\n          0  physical reads\n          0  redo size\n        307  bytes sent via SQL*Net to client\n        489  bytes received via SQL*Net from client\n          1  SQL*Net roundtrips to\/from client\n          0  sorts (memory)\n          0  sorts (disk)\n          0  rows processed\n<\/code><\/pre>\n<p>3 consistent gets are (probably) from the dictionary.<br \/>\nThe IM statistics show that all rows have been read from the IM columns store:<\/p>\n<pre><code>\nNAME                                                                  VALUE\n---------------------------------------------------------------- ----------\nIM scan rows                                                        1000000\nIM scan rows optimized                                              1000000\n<\/code><\/pre>\n<h3>Update<\/h3>\n<p>Let&#8217;s update 20000 rows (that is 2% of total rows)<\/p>\n<pre><code>\nSQL&gt;  UPDATE DEMO set ten=ten+1 where rownum&lt;=20000\n20000 rows updated.\n&nbsp;\nSQL&gt; commit;\nCommit complete.\n<\/code><\/pre>\n<h3>Invalid rows<\/h3>\n<p>The updated rows are now stale in the IMCS, they are marked as &#8216;invalid&#8217; in the IMCS metadata:<\/p>\n<pre><code>\nSQL&gt; select to_char(sysdate,'hh24:mi:ss') \"now\",load_scn,total_rows,invalid_rows,invalid_blocks from V$IM_SMU_HEAD;\n&nbsp;\nnow      LOAD_SCN         TOTAL_ROWS INVALID_ROWS INVALID_BLOCKS\n-------- ---------------- ---------- ------------ --------------\n16:03:30 940920160            491079        20000             35\n16:03:30 940920160            508921            0              0\n&nbsp;\nSQL&gt; select prepopulated,repopulated,trickle_repopulated,num_rows,num_blocks,time_to_populate,to_char(timestamp,'hh24:mi:ss') timestamp from V$IM_HEADER;\n&nbsp;\nPREPOPULATED REPOPULATED TRICKLE_REPOPULATED   NUM_ROWS NUM_BLOCKS TIME_TO_POPULATE TIMESTAM\n------------ ----------- ------------------- ---------- ---------- ---------------- --------\n           0           0                   0     491079        874              534 16:03:16\n           0           0                   0     508921        908              506 16:03:16\n<\/code><\/pre>\n<p>No repopulation yet, the updates are only marked as invalid.<br \/>\nThere are 20000 invalid rows and they are stored in 35 blocks in the row store.<\/p>\n<h3>Hybrid select<\/h3>\n<p>In that state, a select will have to read those 20000 rows from the buffer cache. Here are the statistics:<\/p>\n<pre><code>\nStatistics\n----------------------------------------------------------\n          0  recursive calls\n          0  db block gets\n         38  consistent gets\n          0  physical reads\n          0  redo size\n        307  bytes sent via SQL*Net to client\n        489  bytes received via SQL*Net from client\n          1  SQL*Net roundtrips to\/from client\n          0  sorts (memory)\n          0  sorts (disk)\n          0  rows processed\n&nbsp;\nNAME                                                                  VALUE\n---------------------------------------------------------------- ----------\nIM scan rows                                                        1000000\nIM scan rows optimized                                              1000000\nIM scan rows cache                                                    20000\nIM scan blocks cache                                                     35\n<\/code><\/pre>\n<p>35 additional consistent gets, which is the number of invalid blocks for gotten from buffer cache.<\/p>\n<p>This is where In-Memory may not be very efficient for tables that have concurrent updates. The FULL TABLE SCAN plan is used, but may have to get some blocks from the row store. Of course, if the changes are not committed or were commited after the start of your query, some undo blocks have to be read as well.<\/p>\n<h3>Repopulation<\/h3>\n<p>Repopulation is asynchronous. Even after my select which had to read the 20000 updated rows nothing has changed in the IMCS:<\/p>\n<pre><code>\nSQL&gt; select to_char(sysdate,'hh24:mi:ss') \"now\",load_scn,total_rows,invalid_rows,invalid_blocks from V$IM_SMU_HEAD;\n&nbsp;\nnow      LOAD_SCN         TOTAL_ROWS INVALID_ROWS INVALID_BLOCKS\n-------- ---------------- ---------- ------------ --------------\n16:03:35 940920160            491079        20000             35\n16:03:35 940920160            508921            0              0\n&nbsp;\nSQL&gt; select prepopulated,repopulated,trickle_repopulated,num_rows,num_blocks,time_to_populate,to_char(timestamp,'hh24:mi:ss') timestamp from V$IM_HEADER;\n&nbsp;\nPREPOPULATED REPOPULATED TRICKLE_REPOPULATED   NUM_ROWS NUM_BLOCKS TIME_TO_POPULATE TIMESTAM\n------------ ----------- ------------------- ---------- ---------- ---------------- --------\n           0           0                   0     491079        874              534 16:03:16\n           0           0                   0     508921        908              506 16:03:16\n<\/code><\/pre>\n<p>The IMCO process that coordinates repopulation wakes up every two minutes and checks to see if any population tasks need to be completed (described <a href=\"http:\/\/www.oracle.com\/technetwork\/database\/in-memory\/overview\/twp-oracle-database-in-memory-2245633.html\" target=\"_blank\" rel=\"noopener noreferrer\">here<\/a>) so we may have that suboptimal behaviour (read invalid blocks from buffer cache) for a few minutes.<br \/>\nHere is how I wait until there is no invalid rows:<\/p>\n<pre><code>\nSQL&gt; declare n number; begin for i in 1..500 loop select sum(invalid_rows) into n from V$IM_SMU_HEAD; exit when n=0; dbms_lock.sleep(1); end loop; end;\n  2  \/\nPL\/SQL procedure successfully completed.\n<\/code><\/pre>\n<p>It took a bit less than 2 minutes here.<br \/>\nLet&#8217;s check now the statistics:<\/p>\n<pre><code>\nSQL&gt; select to_char(sysdate,'hh24:mi:ss') \"now\",load_scn,total_rows,invalid_rows,invalid_blocks from V$IM_SMU_HEAD;\n&nbsp;\nnow      LOAD_SCN         TOTAL_ROWS INVALID_ROWS INVALID_BLOCKS\n-------- ---------------- ---------- ------------ --------------\n16:05:17 940920320            491079            0              0\n16:05:17 940920160            508921            0              0\n&nbsp;\nSQL&gt; select prepopulated,repopulated,trickle_repopulated,num_rows,num_blocks,time_to_populate,to_char(timestamp,'hh24:mi:ss') timestamp from V$IM_HEADER;\n&nbsp;\nPREPOPULATED REPOPULATED TRICKLE_REPOPULATED   NUM_ROWS NUM_BLOCKS TIME_TO_POPULATE TIMESTAM\n------------ ----------- ------------------- ---------- ---------- ---------------- --------\n           0           1                   1     491079        874              539 16:05:16\n           0           0                   0     508921        908              506 16:03:16\n<\/code><\/pre>\n<p>No invalid rows anymore, 1 repopulation.<br \/>\nIt&#8217;s &#8216;trickle&#8217; repopulation here &#8211; the one that occur when a small percentage of rows are invalid. When there is more rows, then full repopulation is done.<\/p>\n<p>I don&#8217;t know the exact threshold for trickle repopulation. I&#8217;ve shown the 20000 rows update here because its about the limit for trickle repopulation. When updating 3% of rows I got full repopulation. Here is the stats after changing 30000 rows:<\/p>\n<pre><code>\nPREPOPULATED REPOPULATED TRICKLE_REPOPULATED   NUM_ROWS NUM_BLOCKS TIME_TO_POPULATE TIMESTAM\n------------ ----------- ------------------- ---------- ---------- ---------------- --------\n           0           1                   0     491079        874              577 16:51:08\n           0           0                   0     508921        908              466 16:50:55\n<\/code><\/pre>\n<p>There is something to note here. It seems that the trickle repopulation has taken the same time (5 seconds) than the full repopulation. I&#8217;ve a small exemple here, and there may be some minimal time which is not proportional to data to repopulate.<\/p>\n<h3>So what?<\/h3>\n<p>For sure, if you want to implement In-Memory option, you should do a Proof of Concept and measure the benefit in your context. Then you have to analyze which tables to put in memory, which compression level, how many repopulation servers (and you need CPU for them) and the maximum percentage used for trickle repopulation.<br \/>\nIn-Memory option is a very good way to improve analytics on OLTP databases, but it is not as straightforward as a simple &#8216;flip a switch&#8217;.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>By Franck Pachot . In the &#8216;traditional&#8217; row store, the indexes are maintained at the same time as rows are changed. It&#8217;s different with the In-memory Column Store. Changes are maintained by background processes. When rows are changed, the Snapshot Metadata Units (SMU) logs the changes and In-Memory Compression Units (IMCU) are re-populated asynchronously. Let&#8217;s [&hellip;]<\/p>\n","protected":false},"author":27,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[229,59],"tags":[222,209,679,680],"type_dbi":[],"class_list":["post-5855","post","type-post","status-publish","format-standard","hentry","category-database-administration-monitoring","category-oracle","tag-in-memory","tag-oracle-12c","tag-repopulation","tag-trickle"],"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>In-memory trickle repopulation - dbi Blog<\/title>\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\/in-memory-trickle-repopulation\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"In-memory trickle repopulation\" \/>\n<meta property=\"og:description\" content=\"By Franck Pachot . In the &#8216;traditional&#8217; row store, the indexes are maintained at the same time as rows are changed. It&#8217;s different with the In-memory Column Store. Changes are maintained by background processes. When rows are changed, the Snapshot Metadata Units (SMU) logs the changes and In-Memory Compression Units (IMCU) are re-populated asynchronously. Let&#8217;s [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/in-memory-trickle-repopulation\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2015-10-10T19:23:26+00:00\" \/>\n<meta name=\"author\" content=\"Oracle 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=\"Oracle Team\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 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\/in-memory-trickle-repopulation\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/in-memory-trickle-repopulation\/\"},\"author\":{\"name\":\"Oracle Team\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/66ab87129f2d357f09971bc7936a77ee\"},\"headline\":\"In-memory trickle repopulation\",\"datePublished\":\"2015-10-10T19:23:26+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/in-memory-trickle-repopulation\/\"},\"wordCount\":616,\"commentCount\":0,\"keywords\":[\"In-memory\",\"Oracle 12c\",\"repopulation\",\"trickle\"],\"articleSection\":[\"Database Administration &amp; Monitoring\",\"Oracle\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/in-memory-trickle-repopulation\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/in-memory-trickle-repopulation\/\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/in-memory-trickle-repopulation\/\",\"name\":\"In-memory trickle repopulation - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#website\"},\"datePublished\":\"2015-10-10T19:23:26+00:00\",\"author\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/66ab87129f2d357f09971bc7936a77ee\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/in-memory-trickle-repopulation\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/in-memory-trickle-repopulation\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/in-memory-trickle-repopulation\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/www.dbi-services.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"In-memory trickle repopulation\"}]},{\"@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\/66ab87129f2d357f09971bc7936a77ee\",\"name\":\"Oracle Team\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/secure.gravatar.com\/avatar\/f711f7cd2c9b09bf2627133755b569fb5be0694810cfd33033bdd095fedba86d?s=96&d=mm&r=g\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/f711f7cd2c9b09bf2627133755b569fb5be0694810cfd33033bdd095fedba86d?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/f711f7cd2c9b09bf2627133755b569fb5be0694810cfd33033bdd095fedba86d?s=96&d=mm&r=g\",\"caption\":\"Oracle Team\"},\"url\":\"https:\/\/www.dbi-services.com\/blog\/author\/oracle-team\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"In-memory trickle repopulation - dbi Blog","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\/in-memory-trickle-repopulation\/","og_locale":"en_US","og_type":"article","og_title":"In-memory trickle repopulation","og_description":"By Franck Pachot . In the &#8216;traditional&#8217; row store, the indexes are maintained at the same time as rows are changed. It&#8217;s different with the In-memory Column Store. Changes are maintained by background processes. When rows are changed, the Snapshot Metadata Units (SMU) logs the changes and In-Memory Compression Units (IMCU) are re-populated asynchronously. Let&#8217;s [&hellip;]","og_url":"https:\/\/www.dbi-services.com\/blog\/in-memory-trickle-repopulation\/","og_site_name":"dbi Blog","article_published_time":"2015-10-10T19:23:26+00:00","author":"Oracle Team","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Oracle Team","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dbi-services.com\/blog\/in-memory-trickle-repopulation\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/in-memory-trickle-repopulation\/"},"author":{"name":"Oracle Team","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/66ab87129f2d357f09971bc7936a77ee"},"headline":"In-memory trickle repopulation","datePublished":"2015-10-10T19:23:26+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/in-memory-trickle-repopulation\/"},"wordCount":616,"commentCount":0,"keywords":["In-memory","Oracle 12c","repopulation","trickle"],"articleSection":["Database Administration &amp; Monitoring","Oracle"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/in-memory-trickle-repopulation\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/in-memory-trickle-repopulation\/","url":"https:\/\/www.dbi-services.com\/blog\/in-memory-trickle-repopulation\/","name":"In-memory trickle repopulation - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"datePublished":"2015-10-10T19:23:26+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/66ab87129f2d357f09971bc7936a77ee"},"breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/in-memory-trickle-repopulation\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/in-memory-trickle-repopulation\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/in-memory-trickle-repopulation\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"In-memory trickle repopulation"}]},{"@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\/66ab87129f2d357f09971bc7936a77ee","name":"Oracle Team","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/f711f7cd2c9b09bf2627133755b569fb5be0694810cfd33033bdd095fedba86d?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/f711f7cd2c9b09bf2627133755b569fb5be0694810cfd33033bdd095fedba86d?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/f711f7cd2c9b09bf2627133755b569fb5be0694810cfd33033bdd095fedba86d?s=96&d=mm&r=g","caption":"Oracle Team"},"url":"https:\/\/www.dbi-services.com\/blog\/author\/oracle-team\/"}]}},"_links":{"self":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/5855","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\/27"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/comments?post=5855"}],"version-history":[{"count":0,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/5855\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=5855"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=5855"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=5855"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=5855"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}