{"id":14281,"date":"2020-06-10T05:02:18","date_gmt":"2020-06-10T03:02:18","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/oracle-12c-global-partial-index\/"},"modified":"2020-06-10T05:02:18","modified_gmt":"2020-06-10T03:02:18","slug":"oracle-12c-global-partial-index","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/oracle-12c-global-partial-index\/","title":{"rendered":"Oracle 12c &#8211; global partial index"},"content":{"rendered":"<h2>By Franck Pachot<\/h2>\n<p>.<br \/>\nWe have an incredible number of possibilities with Oracle. Yes, an index can be global (indexing many partitions without having to be partitioned itself on the same key) and partial (skipping some of the table partitions where we don&#8217;t need indexing). In the <a href=\"https:\/\/www.dbi-services.com\/blog\/oracle-12c-clustering\" rel=\"noopener noreferrer\" target=\"_blank\">previous post<\/a> of this series of small examples on recent features I partitioned a table, with covid-19 cases per day and per country, partitioned on range of date by interval. The index on the country code (GEOID) was not very efficient for data ingested per day, because countries are scattered through all the table. And then I have reorganized the old partitions to cluster them on countries. <\/p>\n<p>My global index on country code is defined as:<\/p>\n<pre><code>\nSQL&gt; create index covid_geoid on covid(geoid);\n\nIndex created.\n<\/code><\/pre>\n<p>This is efficient, thanks to clustering, except for the new rows coming again in time order. As those go to a new partition that is small (the idea in the post was to have short time range for the current partition, and larger ones for the old, using the ALTER TABLE &#8230; MERGE ONLINE to merge the newly old one to the others). For the current partition only, it is preferable to full scan this last partition. And even avoid maintaining the index entries for this partition as this will accelerate data ingestion.<\/p>\n<p>I think that partial indexing is well known for local indexes, as this is like marking some index partitions as unusable. But here I&#8217;m showing it on a global index.<\/p>\n<h3>Splitting partitions<\/h3>\n<p>In order to continue from the previous <a href=\"https:\/\/www.dbi-services.com\/blog\/oracle-12c-clustering\" rel=\"noopener noreferrer\" target=\"_blank\">previous post<\/a> where I merged all partitions, I&#8217;ll split them again, and this can be an online operation in 12cR2:<\/p>\n<pre><code>\nSQL&gt; alter table covid split partition oldmerged at (date '2020-04-01') into (partition old, partition new) online;\n\nTable altered.\n\nSQL&gt; alter index COVID_GEOID coalesce cleanup;\n\nIndex altered.\n\n<\/code><\/pre>\n<p>I have two partitions, &#8220;old&#8221; and &#8220;new&#8221;, and a global index. I also cleaned up the orphaned index entries to get clean execution plans. And it has to be done anyway.<\/p>\n<p>Here is my query, using the index:<\/p>\n<pre><code>\nSQL&gt; explain plan for select trunc(daterep,'mon'), max(cases) from covid where geoid='US' group by trunc(daterep,'mon') order by 1;\n\nExplained.\n\nSQL&gt; select * from dbms_xplan.display();\n                                                                                                              PLAN_TABLE_OUTPUT\n_______________________________________________________________________________________________________________________________\nPlan hash value: 2816502185\n\n----------------------------------------------------------------------------------------------------------------------------\n| Id  | Operation                                    | Name        | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |\n----------------------------------------------------------------------------------------------------------------------------\n|   0 | SELECT STATEMENT                             |             |   101 |  1515 |     6  (34)| 00:00:01 |       |       |\n|   1 |  SORT ORDER BY                               |             |   101 |  1515 |     6  (34)| 00:00:01 |       |       |\n|   2 |   HASH GROUP BY                              |             |   101 |  1515 |     6  (34)| 00:00:01 |       |       |\n|   3 |    TABLE ACCESS BY GLOBAL INDEX ROWID BATCHED| COVID       |   160 |  2400 |     4   (0)| 00:00:01 | ROWID | ROWID |\n|*  4 |     INDEX RANGE SCAN                         | COVID_GEOID |   160 |       |     1   (0)| 00:00:01 |       |       |\n----------------------------------------------------------------------------------------------------------------------------\n\nPredicate Information (identified by operation id):\n---------------------------------------------------\n\n   4 - access(\"GEOID\"='US')\n\n<\/code><\/pre>\n<p>This goes to all partitions, as the ROWID in a global index carries the partition information through the data object id. We see that with Pstart\/Pstop=ROWID.<\/p>\n<h3>Partial indexing<\/h3>\n<p>Now I want to set my global index on countries to be a partial index:<\/p>\n<pre><code>\nSQL&gt; alter index covid_geoid indexing partial;\n\nIndex altered.\n<\/code><\/pre>\n<p>This doesnt change anything for the moment. The indexing of partitions will depend on the partition attributes which is by default INDEXING ON.<\/p>\n<p>I set the &#8220;new&#8221; partition to not maintain indexes (INDEXING OFF), for this partition only.<\/p>\n<pre><code>\nSQL&gt; alter table covid modify partition new indexing off;\n\nTable altered.\n<\/code><\/pre>\n<p>This means that partial indexes will not reference the &#8220;new&#8221; partition. Whether they are local (which then means no index partition) or global (which then means no index entries for this partition).<\/p>\n<p>And that&#8217;s all. Now there will be no overhead in maintaining this index when ingesting new data in this partition.<\/p>\n<h3>Table Expansion<\/h3>\n<p>And then, the optimizer has a transformation to split the execution plan in two branches: one for the index access and one without. This transformation was introduced in 11g for unusable local partitions and is now used even with global indexes. :<\/p>\n<pre><code>\nSQL&gt; explain plan for \/*+ index(covid) *\/ select trunc(daterep,'mon'), max(cases) from covid where geoid='US' group by trunc(daterep,'mon') order by 1;\n\nExplained.\n\nSQL&gt; select * from dbms_xplan.display();\n                                                                                                                PLAN_TABLE_OUTPUT\n_________________________________________________________________________________________________________________________________\nPlan hash value: 1031592504\n\n------------------------------------------------------------------------------------------------------------------------------\n| Id  | Operation                                      | Name        | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |\n------------------------------------------------------------------------------------------------------------------------------\n|   0 | SELECT STATEMENT                               |             |   321 |  7062 |    37   (6)| 00:00:01 |       |       |\n|   1 |  SORT ORDER BY                                 |             |   321 |  7062 |    37   (6)| 00:00:01 |       |       |\n|   2 |   HASH GROUP BY                                |             |   321 |  7062 |    37   (6)| 00:00:01 |       |       |\n|   3 |    VIEW                                        | VW_TE_2     |   321 |  7062 |    35   (0)| 00:00:01 |       |       |\n|   4 |     UNION-ALL                                  |             |       |       |            |          |       |       |\n|*  5 |      TABLE ACCESS BY GLOBAL INDEX ROWID BATCHED| COVID       |    93 |  1395 |     4   (0)| 00:00:01 |     1 |     1 |\n|*  6 |       INDEX RANGE SCAN                         | COVID_GEOID |   160 |       |     1   (0)| 00:00:01 |       |       |\n|   7 |      PARTITION RANGE SINGLE                    |             |    68 |  1020 |    27   (0)| 00:00:01 |     2 |     2 |\n|*  8 |       TABLE ACCESS FULL                        | COVID       |    68 |  1020 |    27   (0)| 00:00:01 |     2 |     2 |\n|   9 |      TABLE ACCESS BY GLOBAL INDEX ROWID BATCHED| COVID       |   160 |  4320 |     4   (0)| 00:00:01 | ROWID | ROWID |\n|* 10 |       INDEX RANGE SCAN                         | COVID_GEOID |   160 |       |     1   (0)| 00:00:01 |       |       |\n------------------------------------------------------------------------------------------------------------------------------\n\nPredicate Information (identified by operation id):\n---------------------------------------------------\n\n   5 - filter(\"COVID\".\"DATEREP\"=TO_DATE(' 2020-04-01 00:00:00', 'syyyy-mm-dd hh24:mi:ss') AND\n              \"COVID\".\"DATEREP\"&lt;TO_DATE(&#039; 2021-01-01 00:00:00&#039;, &#039;syyyy-mm-dd hh24:mi:ss&#039;))\n  10 - access(&quot;GEOID&quot;=&#039;US&#039;)\n       filter(TBL$OR$IDX$PART$NUM(&quot;COVID&quot;,0,8,0,ROWID)=1 AND TBL$OR$IDX$PART$NUM(&quot;COVID&quot;,0,0,65535,ROWID)1 AND\n              TBL$OR$IDX$PART$NUM(\"COVID\",0,0,65535,ROWID)2)\n\n<\/code><\/pre>\n<p>The TABLE ACCESS BY GLOBAL INDEX ROWID is for partition 1 as mentioned by Pstart\/Pstop, which is the &#8220;old&#8221; one with INDEXING ON. The TABLE ACCESS FULL is for partition 2, the &#8220;new&#8221; one, that has INDEXING OFF. The optimizer uses predicates on the partition key to select the branch safely.<\/p>\n<p>But this plan has also an additional branch and this TBL$OR$IDX$PART$NUM again because I have interval partitioning. With interval partitioning, there is no known Pstop, it then it has handle the cases where a new partition has been created (with indexing on). Then, the third branch can access by index ROWID for the partitions that are not hardcoded in this plan.<\/p>\n<p>Let&#8217;s remove interval partitioning just to get the plan easier to read:<\/p>\n<pre><code>\nSQL&gt; alter table covid set interval();\n\nTable altered.\n\n\nSQL&gt; explain plan for select trunc(daterep,'mon'), max(cases) from covid where geoid='US' group by trunc(daterep,'mon') order by 1;\n\nExplained.\n\nSQL&gt; select * from dbms_xplan.display();\n                                                                                                                PLAN_TABLE_OUTPUT\n_________________________________________________________________________________________________________________________________\nPlan hash value: 3529087922\n\n------------------------------------------------------------------------------------------------------------------------------\n| Id  | Operation                                      | Name        | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |\n------------------------------------------------------------------------------------------------------------------------------\n|   0 | SELECT STATEMENT                               |             |   161 |  3542 |    35   (6)| 00:00:01 |       |       |\n|   1 |  SORT ORDER BY                                 |             |   161 |  3542 |    35   (6)| 00:00:01 |       |       |\n|   2 |   HASH GROUP BY                                |             |   161 |  3542 |    35   (6)| 00:00:01 |       |       |\n|   3 |    VIEW                                        | VW_TE_2     |   161 |  3542 |    33   (0)| 00:00:01 |       |       |\n|   4 |     UNION-ALL                                  |             |       |       |            |          |       |       |\n|*  5 |      TABLE ACCESS BY GLOBAL INDEX ROWID BATCHED| COVID       |    93 |  1395 |     6   (0)| 00:00:01 |     1 |     1 |\n|*  6 |       INDEX RANGE SCAN                         | COVID_GEOID |   160 |       |     1   (0)| 00:00:01 |       |       |\n|   7 |      PARTITION RANGE SINGLE                    |             |    68 |  1020 |    27   (0)| 00:00:01 |     2 |     2 |\n|*  8 |       TABLE ACCESS FULL                        | COVID       |    68 |  1020 |    27   (0)| 00:00:01 |     2 |     2 |\n------------------------------------------------------------------------------------------------------------------------------\n\nPredicate Information (identified by operation id):\n---------------------------------------------------\n\n   5 - filter(\"COVID\".\"DATEREP\"&lt;TO_DATE(&#039; 2020-04-01 00:00:00&#039;, &#039;syyyy-mm-dd hh24:mi:ss&#039;))\n   6 - access(&quot;GEOID&quot;=&#039;US&#039;)\n   8 - filter(&quot;GEOID&quot;=&#039;US&#039;)\n\n<\/code><\/pre>\n<p>Here it is clear: access by index to the partition 1 and full table scan for partition 2. This is exactly what I wanted because I know the clustering factor on the new partition is not very good until I reorganize it (move or merge as I did in the previous post).<\/p>\n<p>All these features help to manage the lifecycle of data. That&#8217;s a completely different approach from purpose-built databases where you have one database service for fast ingest with simple queries on recent data (NoSQL folks may think about DynamoDB for that), then streaming data to a relational database for more OLTP queries (RDS to continue with the AWS analogy), and move old data into a database dedicated to analytics (that could be Redshift then). With Oracle, which has always been a multi-purpose database, the goal is to avoid duplication and replication and manage data in-place for all usage. Through the 40 years of this database engine, many approaches have been implemented to cluster data: CLUSTER and IOT can sort (or hash) data as soon as it is inserted, in order to put them at their optimal place for future queries. But the agility of heap tables finally wins. Now, with the ease of in-database data movement (partitioning and online operations) and improvement of full scan (multiblock reads, direct-path reads, storage indexes) we can get the best of both: heap tables with few indexes for fast ingest of current data, reorganize regularly to be clustered, with additional indexes.<\/p>\n<p>I mentioned NoSQL and I mentioned fast ingest. Actually, there&#8217;s a feature called Fast Ingest for IoT (lowercase &#8216;o&#8217; there) that goes further with this idea. Instead of inserting into a persistent segment and reorganize later, rows are buffered in a &#8216;memoptimized rowstore&#8217; before going to the heap segment in bulk. But that&#8217;s an Exadata feature and I like to think about Oracle as a multiplatform database.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>By Franck Pachot . We have an incredible number of possibilities with Oracle. Yes, an index can be global (indexing many partitions without having to be partitioned itself on the same key) and partial (skipping some of the table partitions where we don&#8217;t need indexing). In the previous post of this series of small examples [&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":[955,229,59],"tags":[958,496,38,1489,1949,1231,654,96,209,1909,1419,753],"type_dbi":[],"class_list":["post-14281","post","type-post","status-publish","format-standard","hentry","category-cloud","category-database-administration-monitoring","category-oracle","tag-12cr2","tag-bi","tag-cluster","tag-dwh","tag-features","tag-move","tag-online","tag-oracle","tag-oracle-12c","tag-partition","tag-reorg","tag-split"],"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>Oracle 12c - global partial index - 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\/oracle-12c-global-partial-index\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Oracle 12c - global partial index\" \/>\n<meta property=\"og:description\" content=\"By Franck Pachot . We have an incredible number of possibilities with Oracle. Yes, an index can be global (indexing many partitions without having to be partitioned itself on the same key) and partial (skipping some of the table partitions where we don&#8217;t need indexing). In the previous post of this series of small examples [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/oracle-12c-global-partial-index\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2020-06-10T03:02:18+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=\"7 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\/oracle-12c-global-partial-index\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/oracle-12c-global-partial-index\/\"},\"author\":{\"name\":\"Oracle Team\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/66ab87129f2d357f09971bc7936a77ee\"},\"headline\":\"Oracle 12c &#8211; global partial index\",\"datePublished\":\"2020-06-10T03:02:18+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/oracle-12c-global-partial-index\/\"},\"wordCount\":943,\"commentCount\":0,\"keywords\":[\"12cR2\",\"BI\",\"Cluster\",\"DWH\",\"features\",\"Move\",\"online\",\"Oracle\",\"Oracle 12c\",\"Partition\",\"reorg\",\"SPLIT\"],\"articleSection\":[\"Cloud\",\"Database Administration &amp; Monitoring\",\"Oracle\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/oracle-12c-global-partial-index\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/oracle-12c-global-partial-index\/\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/oracle-12c-global-partial-index\/\",\"name\":\"Oracle 12c - global partial index - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#website\"},\"datePublished\":\"2020-06-10T03:02:18+00:00\",\"author\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/66ab87129f2d357f09971bc7936a77ee\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/oracle-12c-global-partial-index\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/oracle-12c-global-partial-index\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/oracle-12c-global-partial-index\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/www.dbi-services.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Oracle 12c &#8211; global partial index\"}]},{\"@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":"Oracle 12c - global partial index - 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\/oracle-12c-global-partial-index\/","og_locale":"en_US","og_type":"article","og_title":"Oracle 12c - global partial index","og_description":"By Franck Pachot . We have an incredible number of possibilities with Oracle. Yes, an index can be global (indexing many partitions without having to be partitioned itself on the same key) and partial (skipping some of the table partitions where we don&#8217;t need indexing). In the previous post of this series of small examples [&hellip;]","og_url":"https:\/\/www.dbi-services.com\/blog\/oracle-12c-global-partial-index\/","og_site_name":"dbi Blog","article_published_time":"2020-06-10T03:02:18+00:00","author":"Oracle Team","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Oracle Team","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dbi-services.com\/blog\/oracle-12c-global-partial-index\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/oracle-12c-global-partial-index\/"},"author":{"name":"Oracle Team","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/66ab87129f2d357f09971bc7936a77ee"},"headline":"Oracle 12c &#8211; global partial index","datePublished":"2020-06-10T03:02:18+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/oracle-12c-global-partial-index\/"},"wordCount":943,"commentCount":0,"keywords":["12cR2","BI","Cluster","DWH","features","Move","online","Oracle","Oracle 12c","Partition","reorg","SPLIT"],"articleSection":["Cloud","Database Administration &amp; Monitoring","Oracle"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/oracle-12c-global-partial-index\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/oracle-12c-global-partial-index\/","url":"https:\/\/www.dbi-services.com\/blog\/oracle-12c-global-partial-index\/","name":"Oracle 12c - global partial index - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"datePublished":"2020-06-10T03:02:18+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/66ab87129f2d357f09971bc7936a77ee"},"breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/oracle-12c-global-partial-index\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/oracle-12c-global-partial-index\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/oracle-12c-global-partial-index\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Oracle 12c &#8211; global partial index"}]},{"@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\/14281","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=14281"}],"version-history":[{"count":0,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/14281\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=14281"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=14281"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=14281"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=14281"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}