{"id":4065,"date":"2014-10-13T18:39:17","date_gmt":"2014-10-13T16:39:17","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/how-i-measure-oracle-index-fragmentation\/"},"modified":"2014-10-13T18:39:17","modified_gmt":"2014-10-13T16:39:17","slug":"how-i-measure-oracle-index-fragmentation","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/how-i-measure-oracle-index-fragmentation\/","title":{"rendered":"How to measure Oracle index fragmentation"},"content":{"rendered":"<h2>By Franck Pachot<\/h2>\n<p>.<br \/>\nAt Oracle Open World 2014, or rather the <a href=\"http:\/\/dbi-services.com\/blog\/oow14-day-5-not-only-oracle-open-world\/\"> Oaktable World<\/a>, Chris Antognini has presented &#8216;Indexes: Structure, Splits and Free Space Management Internals&#8217;. It&#8217;s not something new, but it&#8217;s still something that is not always well understood: how index space is managed, block splits, fragmentation, coalesce and rebuilds. Kyle Hailey has made a video of it available <a href=\"https:\/\/www.youtube.com\/watch?v=kztG9voZtMw&amp;feature=youtu.be\">here<\/a>.<br \/>\nFor me, it is the occasion to share the script I use to see if an index is fragmented or not.<\/p>\n<p>First, forget about those &#8216;analyze index validate structure&#8217; which locks the table, and the DEL_LEAF_ROWS that counts only the deletion flags that are transient. The problem is not the amount of free space. The problem is where is that free space. Because if you will insert again in the same range of values, then that space will be reused. Wasted space occurs only when lot of rows were deleted in a range where you will not insert again. For exemple, when you purge old ORDERS, then the index on the ORDER_DATE &#8211; or on the ORDER_ID coming from a sequence &#8211; will be affected. Note that the problem occurs only for sparse purges because full blocks are reclaimed when needed and can get rows from an other range of value.<\/p>\n<p>I have a script that shows the number of rows per block, as well as used and free space per block, and aggregates that by range of values.<\/p>\n<p>First, let&#8217;s create a table with a date and an index on it:<\/p>\n<pre><code>drop table DEMOTABLE;\ncreate table DEMOTABLE as select sysdate-900+rownum\/1000 order_date,decode(mod(rownum,100),0,'N','Y') delivered , dbms_random.string('U',16) cust_id  from (select * from dual connect by level &lt;= 1e4 );\ncreate index DEMOINDEX on DEMOTABLE(ORDER_DATE) pctfree 90;<\/code><\/pre>\n<p>My script shows 10 buckets with begin and end value and for each of them the averge number of rows per block and the free space:<\/p>\n<pre><code>SQL&gt; @index_fragmentation \n&nbsp;\nORDER_DAT -&gt; ORDER_DAT rows\/block bytes\/block %free space     blocks free                   \n--------- -- --------- ---------- ----------- ----------- ---------- -----                     \n24-APR-12 -&gt; 02-AUG-12        377        7163          11        266                        \n03-AUG-12 -&gt; 11-NOV-12        377        7163          11        266                        \n11-NOV-12 -&gt; 19-FEB-13        377        7163          11        266                        \n19-FEB-13 -&gt; 30-MAY-13        377        7163          11        265                        \n30-MAY-13 -&gt; 07-SEP-13        377        7163          11        265                        \n07-SEP-13 -&gt; 16-DEC-13        377        7163          11        265                        \n16-DEC-13 -&gt; 26-MAR-14        377        7163          11        265                        \n26-MAR-14 -&gt; 03-JUL-14        377        7163          11        265                        \n04-JUL-14 -&gt; 11-OCT-14        377        7163          11        265                        \n12-OCT-14 -&gt; 19-JAN-15        376        7150          11        265                        \n<\/code><\/pre>\n<p>Note that the script reads all the table (it can do a sample but here it is 100%). Not exactly the table but only the index. It counts the index leaf blocks with the undocumented function sys_op_lbid() which is used by oracle to estimate the clustering factor.<\/p>\n<p>So here I have no fragmentation. All blocks have about 377 rows and no free space. This is because I inserted them in increasing order and the so colled &#8217;90-10&#8242; block split occured.<\/p>\n<p>Let&#8217;s see what I get if I delete most of the rows before the 01-JAN-2014:<\/p>\n<pre><code>SQL&gt; delete from DEMOTABLE where order_dateSQL&gt; @index_fragmentation \n&nbsp;\nORDER_DAT -&gt; ORDER_DAT rows\/block bytes\/block %free space     blocks free                   \n--------- -- --------- ---------- ----------- ----------- ---------- -----                     \n25-APR-12 -&gt; 02-AUG-12          4          72          99        266 oooo                   \n03-AUG-12 -&gt; 11-NOV-12          4          72          99        266 oooo                   \n11-NOV-12 -&gt; 19-FEB-13          4          72          99        266 oooo                   \n19-FEB-13 -&gt; 30-MAY-13          4          72          99        265 oooo                   \n30-MAY-13 -&gt; 07-SEP-13          4          72          99        265 oooo                   \n07-SEP-13 -&gt; 16-DEC-13          4          72          99        265 oooo                   \n16-DEC-13 -&gt; 26-MAR-14          4          72          99        265 oooo                   \n26-MAR-14 -&gt; 03-JUL-14          4          72          99        265 oooo                   \n04-JUL-14 -&gt; 11-OCT-14         46         870          89        265 oooo                   \n12-OCT-14 -&gt; 19-JAN-15        376        7150          11        265                        \n<\/code><\/pre>\n<p>I have the same buckets, and same number of blocks. But blocks which are in the range below 01-JAN-2014 have only 4 rows and a lot of free space. This is exactly what I want to detect: I can check if that free space will be reused.<\/p>\n<p>Here I know I will not enter any orders with a date in the past, so those blocks will never have an insert into them. I can reclaim that free space with a COALESCE:<\/p>\n<pre><code>SQL&gt; alter index DEMOINDEX coalesce;\nIndex altered.\nSQL&gt; @index_fragmentation\nORDER_DAT to ORDER_DAT rows\/block bytes\/block %free space blocks free\n --------- -- --------- ---------- ----------- ----------- ---------- -----\n 25-APR-12 -&gt; 03-OCT-14 358 6809 15 32\n 03-OCT-14 -&gt; 15-OCT-14 377 7163 11 32\n 15-OCT-14 -&gt; 27-OCT-14 377 7163 11 32\n 27-OCT-14 -&gt; 08-NOV-14 377 7163 11 32\n 08-NOV-14 -&gt; 20-NOV-14 377 7163 11 32\n 20-NOV-14 -&gt; 02-DEC-14 377 7163 11 32\n 02-DEC-14 -&gt; 14-DEC-14 377 7163 11 32\n 14-DEC-14 -&gt; 26-DEC-14 377 7163 11 32\n 27-DEC-14 -&gt; 07-JAN-15 377 7163 11 32\n 08-JAN-15 -&gt; 19-JAN-15 371 7056 12 32<\/code><\/pre>\n<p>I still have 10 buckets because this is defined in my script, but each bucket noew has less rows. I&#8217;ve defragmented the blocks and reclaimed the free blocks.<\/p>\n<p>Time to share the script now. Here it is: <a title=\"title\" href=\"http:\/\/dbi-services.com\/blog\/images\/easyblog_images\/139\/index_fragmentation.zip\" target=\"_self\" rel=\"noopener noreferrer\">index_fragmentation.zip<\/a><\/p>\n<pre><code>\nset termout off verify off\n\ndefine owner='DEMO'         -- table owner\ndefine table='DEMOTABLE'    -- table name\ndefine index='DEMOINDEX'    -- index name\ndefine buckets=10           -- number of buckets\ndefine sample=100           -- 100% scans all the index\n\ncolumn \"free\" format A5\n\nvariable c refcursor;\n\ndeclare\n o all_indexes.owner%TYPE:='&amp;owner';\n t all_indexes.table_name%TYPE:='&amp;table';\n i all_indexes.table_name%TYPE:='&amp;index';\n oid all_objects.object_id%TYPE;\n hsz varchar2(2000);\n n number:=&amp;buckets;\n p number:=&amp;sample;\n s varchar2(2000):='';\n k_min varchar2(2000);\n k_max varchar2(2000);\n k_lst varchar2(2000);\n k_nul varchar2(2000);\n k_vsz varchar2(2000);\n p_sam varchar2(2000):='';\n cursor cols is select i.column_name,i.column_position,case when data_type in ('VARCHAR2','RAW') then 3 else 1 end length_bytes\n  from dba_ind_columns i join dba_tab_columns t \n  on (t.owner=i.table_owner and t.table_name=i.table_name and t.column_name=i.column_name)\n  where i.table_owner=o and i.table_name=t and i.index_name=i order by column_position;\n procedure add(l in varchar2,i number default 0) is begin s:=s||chr(10)||rpad(' ',i)||l; end;\nbegin\n select object_id into oid from dba_objects where object_type='INDEX' and owner=o and object_name=i;\n \/* Note:10640.1: block header size = fixed header (113 bytes) + variable transaction header (23*initrans) *\/\n select nvl(to_char(block_size - 113 - ini_trans*23),'null') header_size into hsz \n  from dba_indexes left outer join dba_tablespaces using (tablespace_name) where owner=o and index_name=i;\n for c in cols loop\n  if ( c.column_position &gt; 1 ) then k_lst:=k_lst||',' ; k_min:=k_min||',';k_max:=k_max||','; k_nul:=k_nul||' and ' ; k_vsz:=k_vsz||'+' ; end if;\n  k_lst:=k_lst||c.column_name;\n  k_nul:=k_nul||c.column_name|| ' is not null';\n  k_min:=k_min||'min('||c.column_name||') '||c.column_name;\n  k_max:=k_max||'max('||c.column_name||') '||c.column_name;\n  k_vsz:=k_vsz||'nvl(vsize('||c.column_name||'),1)+'||c.length_bytes;\n end loop;\n if p != 100 then p_sam:='sample block('||p||')'; end if;\n add('with leaf_blocks as (',0);\n add('select \/* cursor_sharing_exact dynamic_sampling(0) no_monitoring',1);\n add(' no_expand index_ffs('||t||','||i||') noparallel_index('||t||','||i||') *\/',10);\n add(k_min||','||1\/(p\/100)||'*count(rowid) num_rows',1);\n add(','||1\/(p\/100)||'*sum(1+vsize(rowid)+'||k_vsz||') vsize',1);\n add('from '||o||'.'||t||' '||p_sam||' '||t,1);\n add('where '||k_nul,1);\n add('group by sys_op_lbid('||oid||',''L'',rowid)',1);\n add('),keys as (',0);\n add('select ntile('||n||') over (order by '||k_lst||') bucket,',1);\n add(k_min||',',2);\n add('count(*) leaf_blocks, count(*)*'||hsz||' tsize,',2);\n add('sum(num_rows) num_rows,sum(vsize) vsize',2);\n add('from leaf_blocks group by '||k_lst,1);\n add(')',0);\n add('select '||k_min||',''-&gt;'' \"-&gt;\",'||k_max||',round(sum(num_rows)\/sum(leaf_blocks)) \"rows\/block\"',0);\n add(',round(sum(vsize)\/sum(leaf_blocks)) \"bytes\/block\",',1);\n add('case when sum(vsize)&lt;=sum(tsize) then 100*round(1- sum(vsize) \/ (sum(tsize)),2) else null end &quot;%free space&quot;,&#039;,1);\n add(&#039; sum(leaf_blocks) &quot;blocks&quot;,&#039;);\n --add(&#039;case when sum(vsize)&lt;=sum(tsize)\/2 then substr(rpad(&#039;&#039;o&#039;&#039;,5*round(1- sum(vsize) \/ (sum(tsize)),2),&#039;&#039;o&#039;&#039;),1,5) end &quot;free&quot;&#039;,1);\n add(&#039;substr(rpad(&#039;&#039;o&#039;&#039;,5*round(1- sum(vsize) \/ (sum(tsize)),2),&#039;&#039;o&#039;&#039;),1,5) &quot;free&quot;&#039;,1);\n add(&#039;from keys group by bucket order by bucket&#039;,0);\n begin open :c for s ; exception when others then dbms_output.put_line(s); raise; end ;\n dbms_output.put_line(s);\nend;\n\/\nset termout on \nprint c\n<\/code><\/pre>\n<p>The script is quite ugly. It&#8217;s SQL generated by PL\/SQL. It&#8217;s generated because it selects the index columns. And as I don&#8217;t want to have it too large it is not indented nor commented. However, if you run it with set servertoutput on you will see the generated query.<\/p>\n<p>How to use it? Just change the owner, table_name, and index name. It reads the whole index so if you have a very large index you may want to change the sample size.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>By Franck Pachot . At Oracle Open World 2014, or rather the Oaktable World, Chris Antognini has presented &#8216;Indexes: Structure, Splits and Free Space Management Internals&#8217;. It&#8217;s not something new, but it&#8217;s still something that is not always well understood: how index space is managed, block splits, fragmentation, coalesce and rebuilds. Kyle Hailey has made [&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":[198,59],"tags":[480,357,96,209],"type_dbi":[],"class_list":["post-4065","post","type-post","status-publish","format-standard","hentry","category-database-management","category-oracle","tag-index-fragmentation","tag-oak-table","tag-oracle","tag-oracle-12c"],"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>How to measure Oracle index fragmentation - dbi Blog<\/title>\n<meta name=\"description\" content=\"How to find our if your Oracle index is fragmented. This is not new, but it is still something that is not always well understood.\" \/>\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\/how-i-measure-oracle-index-fragmentation\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How to measure Oracle index fragmentation\" \/>\n<meta property=\"og:description\" content=\"How to find our if your Oracle index is fragmented. This is not new, but it is still something that is not always well understood.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/how-i-measure-oracle-index-fragmentation\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2014-10-13T16:39:17+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=\"8 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\/how-i-measure-oracle-index-fragmentation\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/how-i-measure-oracle-index-fragmentation\/\"},\"author\":{\"name\":\"Oracle Team\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/66ab87129f2d357f09971bc7936a77ee\"},\"headline\":\"How to measure Oracle index fragmentation\",\"datePublished\":\"2014-10-13T16:39:17+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/how-i-measure-oracle-index-fragmentation\/\"},\"wordCount\":592,\"commentCount\":0,\"keywords\":[\"Index fragmentation\",\"Oak table\",\"Oracle\",\"Oracle 12c\"],\"articleSection\":[\"Database management\",\"Oracle\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/how-i-measure-oracle-index-fragmentation\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/how-i-measure-oracle-index-fragmentation\/\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/how-i-measure-oracle-index-fragmentation\/\",\"name\":\"How to measure Oracle index fragmentation - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#website\"},\"datePublished\":\"2014-10-13T16:39:17+00:00\",\"author\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/66ab87129f2d357f09971bc7936a77ee\"},\"description\":\"How to find our if your Oracle index is fragmented. This is not new, but it is still something that is not always well understood.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/how-i-measure-oracle-index-fragmentation\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/how-i-measure-oracle-index-fragmentation\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/how-i-measure-oracle-index-fragmentation\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/www.dbi-services.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"How to measure Oracle index fragmentation\"}]},{\"@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":"How to measure Oracle index fragmentation - dbi Blog","description":"How to find our if your Oracle index is fragmented. This is not new, but it is still something that is not always well understood.","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\/how-i-measure-oracle-index-fragmentation\/","og_locale":"en_US","og_type":"article","og_title":"How to measure Oracle index fragmentation","og_description":"How to find our if your Oracle index is fragmented. This is not new, but it is still something that is not always well understood.","og_url":"https:\/\/www.dbi-services.com\/blog\/how-i-measure-oracle-index-fragmentation\/","og_site_name":"dbi Blog","article_published_time":"2014-10-13T16:39:17+00:00","author":"Oracle Team","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Oracle Team","Est. reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dbi-services.com\/blog\/how-i-measure-oracle-index-fragmentation\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/how-i-measure-oracle-index-fragmentation\/"},"author":{"name":"Oracle Team","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/66ab87129f2d357f09971bc7936a77ee"},"headline":"How to measure Oracle index fragmentation","datePublished":"2014-10-13T16:39:17+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/how-i-measure-oracle-index-fragmentation\/"},"wordCount":592,"commentCount":0,"keywords":["Index fragmentation","Oak table","Oracle","Oracle 12c"],"articleSection":["Database management","Oracle"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/how-i-measure-oracle-index-fragmentation\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/how-i-measure-oracle-index-fragmentation\/","url":"https:\/\/www.dbi-services.com\/blog\/how-i-measure-oracle-index-fragmentation\/","name":"How to measure Oracle index fragmentation - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"datePublished":"2014-10-13T16:39:17+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/66ab87129f2d357f09971bc7936a77ee"},"description":"How to find our if your Oracle index is fragmented. This is not new, but it is still something that is not always well understood.","breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/how-i-measure-oracle-index-fragmentation\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/how-i-measure-oracle-index-fragmentation\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/how-i-measure-oracle-index-fragmentation\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"How to measure Oracle index fragmentation"}]},{"@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\/4065","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=4065"}],"version-history":[{"count":0,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/4065\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=4065"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=4065"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=4065"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=4065"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}