{"id":3703,"date":"2014-04-11T12:25:49","date_gmt":"2014-04-11T10:25:49","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/oracle-12c-adaptive-plan-inflexion-point\/"},"modified":"2014-04-11T12:25:49","modified_gmt":"2014-04-11T10:25:49","slug":"oracle-12c-adaptive-plan-inflexion-point","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/oracle-12c-adaptive-plan-inflexion-point\/","title":{"rendered":"Oracle 12c Adaptive Plan &amp; inflection point"},"content":{"rendered":"<h2>By Franck Pachot<\/h2>\n<p>.<br \/>\nThe Oracle 12c Adaptive Plan feature was already presented by Nicolas Jardot in <a href=\"\/oracle-open-world-2013-solving-customer-issues-with-12c-i-adaptive-execution-plans\">OOW 2013: Solving customer issues with the 12c Optimizer<\/a>.<\/p>\n<p>I recently had to answer several questions about its behavior at execution time. Maybe the term &#8216;adaptive&#8217; is misleading. It&#8217;s not that a join will stop and restart to another join method. Even with adaptive plan there will only be one join method to be applied. The feature only defers a decision that was made at parse time in previous versions and that will now be made at execution time &#8211; after reading a few rows.<\/p>\n<p>In order to show what happens exactly at execution time, I will reproduce the kind of exercise that we do in our training session <a href=\"https:\/\/www.dbi-services.com\/trainings\/type\/oracle-en\/\">Oracle 12c New Features workshop<\/a> in this posting.<\/p>\n<p>First I set the current schema to &#8220;HR&#8221; &#8211; the one that is delivered as a demo with Oracle.<\/p>\n<pre><code>SQL&gt;\u00a0alter\u00a0session\u00a0set\u00a0current_schema=HR; \n \nSession\u00a0altered.<\/code><\/pre>\n<p>Then I get the execution plan for a join between DEPARTMENTS and EMPLOYEES where SALARY&gt;20000 and departement like &#8216;%ing&#8217;;<\/p>\n<pre><code>SQL&gt;\u00a0explain\u00a0plan\u00a0for \n\u00a0\u00a02\u00a0\u00a0\u00a0select\u00a0distinct\u00a0DEPARTMENT_NAME\u00a0from\u00a0DEPARTMENTS \n\u00a0\u00a03\u00a0\u00a0\u00a0join\u00a0EMPLOYEES\u00a0using(DEPARTMENT_ID) \n\u00a0\u00a04\u00a0\u00a0\u00a0where\u00a0DEPARTMENT_NAME\u00a0like\u00a0'%ing'\u00a0and\u00a0SALARY&gt;20000; \n \nExplained.<\/code><\/pre>\n<p>&nbsp;<\/p>\n<p>I&#8217;ve chosen such a predicate because I know that a lot of department names are ending with &#8216;ing&#8217; (Marketing, Purchasing, Shipping, Accounting, etc). But I know also that the optimizer cannot guess that and will underestimate then number of departements.<\/p>\n<pre><code>SQL&gt;\u00a0set\u00a0linesize\u00a0150\u00a0pagesize\u00a01000 \n\nSQL&gt;\u00a0select\u00a0*\u00a0from\u00a0table(\u00a0dbms_xplan.display\u00a0); \n \nPLAN_TABLE_OUTPUT \n---------------------------------------------------------------------------------------------- \nPlan\u00a0hash\u00a0value:\u00a03041748347 \n \n---------------------------------------------------------------------------------------------- \n|\u00a0Id\u00a0\u00a0|\u00a0Operation\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0|\u00a0Name\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0|Rows |\u00a0Bytes\u00a0|\u00a0Cost\u00a0(%CPU)| \n---------------------------------------------------------------------------------------------- \n|\u00a0\u00a0\u00a00\u00a0|\u00a0SELECT\u00a0STATEMENT\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0|\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0| \u00a0 1\u00a0|\u00a0\u00a0\u00a0\u00a023\u00a0|\u00a0\u00a0\u00a0\u00a0\u00a03\u00a0\u00a0\u00a0(0)| \n|\u00a0\u00a0\u00a01\u00a0|\u00a0\u00a0HASH\u00a0UNIQUE\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0|\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0| \u00a0 1\u00a0|\u00a0\u00a0\u00a0\u00a023\u00a0|\u00a0\u00a0\u00a0\u00a0\u00a03\u00a0\u00a0\u00a0(0)| \n|\u00a0\u00a0\u00a02\u00a0|\u00a0\u00a0\u00a0NESTED\u00a0LOOPS\u00a0SEMI\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0|\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0| \u00a0 1\u00a0|\u00a0\u00a0\u00a0\u00a023\u00a0|\u00a0\u00a0\u00a0\u00a0\u00a03\u00a0\u00a0\u00a0(0)| \n|*\u00a0\u00a03\u00a0|\u00a0\u00a0\u00a0\u00a0TABLE\u00a0ACCESS\u00a0FULL\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0|\u00a0DEPARTMENTS\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0| \u00a0 1\u00a0|\u00a0\u00a0\u00a0\u00a016\u00a0|\u00a0\u00a0\u00a0\u00a0\u00a02\u00a0\u00a0\u00a0(0)| \n|*\u00a0\u00a04\u00a0|\u00a0\u00a0\u00a0\u00a0TABLE\u00a0ACCESS\u00a0BY\u00a0INDEX\u00a0ROWID\u00a0BATCHED|\u00a0EMPLOYEES\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0| \u00a0 1\u00a0|\u00a0\u00a0\u00a0\u00a0\u00a07\u00a0|\u00a0\u00a0\u00a0\u00a0\u00a01\u00a0\u00a0\u00a0(0)| \n|*\u00a0\u00a05\u00a0|\u00a0\u00a0\u00a0\u00a0\u00a0INDEX\u00a0RANGE\u00a0SCAN\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0|\u00a0EMP_DEP_IX \u00a0 \u00a0 \u00a0 \u00a0| \u00a010\u00a0|\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0|\u00a0\u00a0\u00a0\u00a0\u00a00\u00a0\u00a0\u00a0(0)| \n---------------------------------------------------------------------------------------------- \n \nPredicate\u00a0Information\u00a0(identified\u00a0by\u00a0operation\u00a0id): \n--------------------------------------------------- \n \n\u00a0\u00a0\u00a03\u00a0-\u00a0filter(\"DEPARTMENTS\".\"DEPARTMENT_NAME\"\u00a0LIKE\u00a0'%ing') \n\u00a0\u00a0\u00a04\u00a0-\u00a0filter(\"EMPLOYEES\".\"SALARY\"&gt;20000) \n\u00a0\u00a0\u00a05\u00a0-\u00a0access(\"DEPARTMENTS\".\"DEPARTMENT_ID\"=\"EMPLOYEES\".\"DEPARTMENT_ID\") \n \nNote \n----- \n\u00a0\u00a0\u00a0-\u00a0this\u00a0is\u00a0an\u00a0adaptive\u00a0plan <\/code><\/pre>\n<p>NESTED LOOP was picked because of the low cardinality that is estimated (estimation is only one department with a specific suffix), but the plan is adaptive.<\/p>\n<p>DBMS_XPLAN in 12c has a new &#8216;adaptive&#8217; format that show the inactive operations:<\/p>\n<pre><code>SQL&gt;\u00a0select\u00a0*\u00a0from\u00a0table(\u00a0dbms_xplan.display(format=&gt;'adaptive')\u00a0); \n \nPLAN_TABLE_OUTPUT \n------------------------------------------------------------------------------------------- \nPlan\u00a0hash\u00a0value:\u00a03041748347 \n \n------------------------------------------------------------------------------------------- \n|\u00a0\u00a0\u00a0Id\u00a0\u00a0|\u00a0Operation\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0|\u00a0Name\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0| Rows|\u00a0Bytes\u00a0|\u00a0Cost\u00a0| \n------------------------------------------------------------------------------------------- \n|\u00a0\u00a0\u00a0\u00a0\u00a00\u00a0|\u00a0SELECT\u00a0STATEMENT\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0|\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0| \u00a0 1\u00a0|\u00a0\u00a0\u00a0\u00a023\u00a0|\u00a0\u00a0\u00a0\u00a0\u00a03| \n|\u00a0\u00a0\u00a0\u00a0\u00a01\u00a0|\u00a0\u00a0HASH\u00a0UNIQUE\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0|\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0| \u00a0 1\u00a0|\u00a0\u00a0\u00a0\u00a023\u00a0|\u00a0\u00a0\u00a0\u00a0\u00a03| \n|-\u00a0*\u00a0\u00a02\u00a0|\u00a0\u00a0\u00a0HASH\u00a0JOIN\u00a0SEMI\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0|\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0| \u00a0 1\u00a0|\u00a0\u00a0\u00a0\u00a023\u00a0|\u00a0\u00a0\u00a0\u00a0\u00a03| \n|\u00a0\u00a0\u00a0\u00a0\u00a03\u00a0|\u00a0\u00a0\u00a0\u00a0NESTED\u00a0LOOPS\u00a0SEMI\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0|\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0| \u00a0 1\u00a0|\u00a0\u00a0\u00a0\u00a023\u00a0|\u00a0\u00a0\u00a0\u00a0\u00a03| \n|-\u00a0\u00a0\u00a0\u00a04\u00a0|\u00a0\u00a0\u00a0\u00a0\u00a0STATISTICS\u00a0COLLECTOR\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0|\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0| \u00a0 \u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0|\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0| \n|\u00a0\u00a0*\u00a0\u00a05\u00a0|\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0TABLE\u00a0ACCESS\u00a0FULL\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0|\u00a0DEPARTMENTS\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0| \u00a0 1\u00a0|\u00a0\u00a0\u00a0\u00a016\u00a0|\u00a0\u00a0\u00a0\u00a0\u00a02| \n|\u00a0\u00a0*\u00a0\u00a06\u00a0|\u00a0\u00a0\u00a0\u00a0\u00a0TABLE\u00a0ACCESS\u00a0BY\u00a0INDEX\u00a0ROWID\u00a0BATCHED|\u00a0EMPLOYEES\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0| \u00a0 1\u00a0|\u00a0\u00a0\u00a0\u00a0\u00a07\u00a0|\u00a0\u00a0\u00a0\u00a0\u00a01| \n|\u00a0\u00a0*\u00a0\u00a07\u00a0|\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0INDEX\u00a0RANGE\u00a0SCAN\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0|\u00a0EMP_DEP_IX \u00a0 \u00a0 \u00a0 \u00a0| \u00a010\u00a0|\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0|\u00a0\u00a0\u00a0\u00a0\u00a00| \n|-\u00a0*\u00a0\u00a08\u00a0|\u00a0\u00a0\u00a0\u00a0TABLE\u00a0ACCESS\u00a0FULL\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0|\u00a0EMPLOYEES \u00a0 \u00a0 \u00a0 \u00a0 |\u00a0 \u00a01\u00a0|\u00a0\u00a0\u00a0\u00a0\u00a07\u00a0|\u00a0\u00a0\u00a0\u00a0\u00a01| \n------------------------------------------------------------------------------------------- \n \nPredicate\u00a0Information\u00a0(identified\u00a0by\u00a0operation\u00a0id): \n--------------------------------------------------- \n \n\u00a0\u00a0\u00a02\u00a0-\u00a0access(\"DEPARTMENTS\".\"DEPARTMENT_ID\"=\"EMPLOYEES\".\"DEPARTMENT_ID\") \n\u00a0\u00a0\u00a05\u00a0-\u00a0filter(\"DEPARTMENTS\".\"DEPARTMENT_NAME\"\u00a0LIKE\u00a0'%ing') \n\u00a0\u00a0\u00a06\u00a0-\u00a0filter(\"EMPLOYEES\".\"SALARY\"&gt;20000) \n\u00a0\u00a0\u00a07\u00a0-\u00a0access(\"DEPARTMENTS\".\"DEPARTMENT_ID\"=\"EMPLOYEES\".\"DEPARTMENT_ID\") \n\u00a0\u00a0\u00a08\u00a0-\u00a0filter(\"EMPLOYEES\".\"SALARY\"&gt;20000) \n \nNote \n----- \n\u00a0\u00a0\u00a0-\u00a0this\u00a0is\u00a0an\u00a0adaptive\u00a0plan\u00a0(rows\u00a0marked\u00a0'-'\u00a0are\u00a0inactive)<\/code><\/pre>\n<p>Look at the STATISTICS COLLECTOR. It buffers the rows and it is able to switch to HASH JOIN when cardinality becomes higher than what was estimated.<\/p>\n<p>That was only explain plan. Now I run it and gather execution statistics:<\/p>\n<pre><code>SQL&gt;\u00a0select\u00a0\/*+\u00a0gather_plan_statistics\u00a0\u00a0*\/\u00a0distinct\u00a0DEPARTMENT_NAME \n\u00a0\u00a02\u00a0\u00a0\u00a0from\u00a0DEPARTMENTS\u00a0join\u00a0EMPLOYEES\u00a0using(DEPARTMENT_ID) \n\u00a0\u00a03\u00a0\u00a0\u00a0where\u00a0DEPARTMENT_NAME\u00a0like\u00a0'%ing'\u00a0and\u00a0SALARY&gt;20000; \n \nno\u00a0rows\u00a0selected \n \nSQL&gt;\u00a0select\u00a0*\u00a0from\u00a0table(\u00a0dbms_xplan.display_cursor(format=&gt;'rowstats\u00a0last\u00a0adaptive')\u00a0); \n \nPLAN_TABLE_OUTPUT \n--------------------------------------------------------------------------------------- \nSQL_ID\u00a0\u00a0gys8mb9n367gq,\u00a0child\u00a0number\u00a00 \n------------------------------------- \nselect\u00a0\/*+\u00a0gather_plan_statistics\u00a0\u00a0*\/\u00a0distinct\u00a0DEPARTMENT_NAME\u00a0\u00a0from \nDEPARTMENTS\u00a0join\u00a0EMPLOYEES\u00a0using(DEPARTMENT_ID)\u00a0\u00a0where\u00a0DEPARTMENT_NAME \nlike\u00a0'%ing'\u00a0and\u00a0SALARY&gt;20000 \n \nPlan\u00a0hash\u00a0value:\u00a01983137394 \n \n--------------------------------------------------------------------------------------- \n|\u00a0\u00a0\u00a0Id\u00a0\u00a0|\u00a0Operation\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0|\u00a0Name \u00a0 \u00a0 \u00a0 \u00a0 |Starts|E-Rows|\u00a0A-Rows| \n--------------------------------------------------------------------------------------- \n|\u00a0\u00a0\u00a0\u00a0\u00a00\u00a0|\u00a0SELECT\u00a0STATEMENT\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0| \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0| \u00a0 \u00a01\u00a0| \u00a0 \u00a0 \u00a0| \u00a0 \u00a0 0\u00a0| \n|\u00a0\u00a0\u00a0\u00a0\u00a01\u00a0|\u00a0\u00a0HASH\u00a0UNIQUE\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0| \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0| \u00a0 \u00a01\u00a0| \u00a0 \u00a01\u00a0| \u00a0 \u00a0 0\u00a0| \n|\u00a0\u00a0*\u00a0\u00a02\u00a0|\u00a0\u00a0\u00a0HASH\u00a0JOIN\u00a0SEMI\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0| \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0| \u00a0 \u00a01\u00a0| \u00a0 \u00a01\u00a0| \u00a0 \u00a0 0\u00a0| \n|-\u00a0\u00a0\u00a0\u00a03\u00a0|\u00a0\u00a0\u00a0\u00a0NESTED\u00a0LOOPS\u00a0SEMI\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0| \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0| \u00a0 \u00a01\u00a0| \u00a0 \u00a01\u00a0| \u00a0 \u00a0 7\u00a0| \n|-\u00a0\u00a0\u00a0\u00a04\u00a0|\u00a0\u00a0\u00a0\u00a0\u00a0STATISTICS\u00a0COLLECTOR\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0| \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0| \u00a0 \u00a01\u00a0| \u00a0 \u00a0 \u00a0| \u00a0 \u00a0 7\u00a0| \n|\u00a0\u00a0*\u00a0\u00a05\u00a0|\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0TABLE\u00a0ACCESS\u00a0FULL\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0|\u00a0DEPARTMENTS \u00a0| \u00a0 \u00a01\u00a0| \u00a0 \u00a01\u00a0| \u00a0 \u00a0 7\u00a0| \n|-\u00a0*\u00a0\u00a06\u00a0|\u00a0\u00a0\u00a0\u00a0\u00a0TABLE\u00a0ACCESS\u00a0BY\u00a0INDEX\u00a0ROWID\u00a0BATCHED|\u00a0EMPLOYEES \u00a0 \u00a0| \u00a0 \u00a00\u00a0| \u00a0 \u00a01\u00a0| \u00a0 \u00a0 0\u00a0| \n|-\u00a0*\u00a0\u00a07\u00a0|\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0INDEX\u00a0RANGE\u00a0SCAN\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0|\u00a0EMP_DEP_IX \u00a0 | \u00a0 \u00a00\u00a0| \u00a0 10\u00a0| \u00a0 \u00a0 0\u00a0| \n|\u00a0\u00a0*\u00a0\u00a08\u00a0|\u00a0\u00a0\u00a0\u00a0TABLE\u00a0ACCESS\u00a0FULL\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0|\u00a0EMPLOYEES \u00a0 \u00a0| \u00a0 \u00a01\u00a0| \u00a0 \u00a01\u00a0| \u00a0 \u00a0 1\u00a0| \n--------------------------------------------------------------------------------------- \n \nPredicate\u00a0Information\u00a0(identified\u00a0by\u00a0operation\u00a0id): \n--------------------------------------------------- \n \n\u00a0\u00a0\u00a02\u00a0-\u00a0access(\"DEPARTMENTS\".\"DEPARTMENT_ID\"=\"EMPLOYEES\".\"DEPARTMENT_ID\") \n\u00a0\u00a0\u00a05\u00a0-\u00a0filter(\"DEPARTMENTS\".\"DEPARTMENT_NAME\"\u00a0LIKE\u00a0'%ing') \n\u00a0\u00a0\u00a06\u00a0-\u00a0filter(\"EMPLOYEES\".\"SALARY\"&gt;20000) \n\u00a0\u00a0\u00a07\u00a0-\u00a0access(\"DEPARTMENTS\".\"DEPARTMENT_ID\"=\"EMPLOYEES\".\"DEPARTMENT_ID\") \n\u00a0\u00a0\u00a08\u00a0-\u00a0filter(\"EMPLOYEES\".\"SALARY\"&gt;20000) \n \nNote \n----- \n\u00a0\u00a0\u00a0-\u00a0this\u00a0is\u00a0an\u00a0adaptive\u00a0plan\u00a0(rows\u00a0marked\u00a0'-'\u00a0are\u00a0inactive)<\/code><\/pre>\n<p>Here I can see that the hash join is now activated instead of the nested loop. The actual number of rows (A-Rows) is higher than the estimated (E-Rows). The nested loop operations have never occured (Starts=0).<\/p>\n<p>The STATISTICS COLLECTOR has buffered the rows and decided to switch to hash join when it reached the inflection point that has been calculated at optimization time. Then the join is done with the buffered rows and with the remaing rows that will be read.<\/p>\n<p>Let&#8217;s see how that inflection point was calculated.<br \/>\nI&#8217;ll dump CBO trace (also known as 10053 event):<\/p>\n<pre><code>SQL&gt;\u00a0alter\u00a0session\u00a0set\u00a0tracefile_identifier='cbo_trace'; \n \nSession\u00a0altered. \n \nSQL&gt;\u00a0exec\u00a0dbms_sqldiag.dump_trace(p_sql_id=&gt;'gys8mb9n367gq',p_child_number=&gt;0,p_component=&gt;'Compiler',p_file_id=&gt;''); \n \nPL\/SQL\u00a0procedure\u00a0successfully\u00a0completed.<\/code><\/pre>\n<p>&nbsp;<\/p>\n<p>Now I am looking for dynamic plan lines which starts by DP:<\/p>\n<pre><code>SQL&gt;\u00a0host\u00a0grep\u00a0-hE \"^DP|^AP\"\u00a0..\/trace\/DB1_ora_*cbo_trace.tr?\u00a0|\u00a0tail \u00a0\nAP: Searching for inflection point at value 33.35\n DP: Costing Nested Loops Join for inflection point at card 17.35\n DP: Costing Hash Join for inflection point at card 17.35\n AP: lcost=8.93, rcost=4.02\n AP: Searching for inflection point at value 17.35\n DP: Costing Nested Loops Join for inflection point at card 9.35\n DP: Costing Hash Join for inflection point at card 9.35\n AP: lcost=5.67, rcost=4.02\n AP: Searching for inflection point at value 9.35\n DP: Costing Nested Loops Join for inflection point at card 5.35\n DP: Costing Hash Join for inflection point at card 5.35\n AP: lcost=4.04, rcost=4.02\n AP: Searching for inflection point at value 5.35\n DP: Costing Nested Loops Join for inflection point at card 3.35\n DP: Costing Hash Join for inflection point at card 3.35\n AP: lcost=3.22, rcost=4.02\n AP: Searching for inflection point at value 3.35\n DP: Costing Nested Loops Join for inflection point at card 4.35\n DP: Costing Hash Join for inflection point at card 4.35\n AP: lcost=3.63, rcost=4.02\n DP: Costing Hash Join for inflection point at card 4.35\n DP: Found point of inflection for NLJ vs. HJ: card = 4.35<\/code><\/pre>\n<p>&nbsp;<\/p>\n<p>You can see how it was calculated: the CBO sets a cardinality and calculates the cost of a Nested Loop join and Hash join for this cardinality. I reproduced only the last lines here but in my example the costing has started at card 262144.00 which is a large power of two.<\/p>\n<p>Then the CBO divides the cardinality by 2 and calculates the costs again. The point where the cost of one join is lower than the other one will be the inflection point. Here the inflection point is 4.35.<\/p>\n<p>So, when rows coming from DEPARTMENTS are less than 4, a nested loop will be chosen (as in the first explain plan which estimates card=1) and if the actual number of rows is higher then a hash join will be used.<\/p>\n<p>I&#8217;ve made a graph about all the costs calculated for each cardinality from the whole dump file. I&#8217;m showing only the lower part because the nested loop cost is quickly exponential:<\/p>\n<p>&nbsp;<\/p>\n<p style=\"padding-left: 30px\"><a class=\"easyblog-thumb-preview\" title=\"CaptureInflectionPoint.PNG\" href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CaptureInflectionPoint.png\"><img decoding=\"async\" title=\"CaptureInflectionPoint.PNG\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CaptureInflectionPoint.png\" alt=\"CaptureInflectionPoint.PNG\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>The aim of adaptive plan is to avoid the zone where Nested Loop occur with high number of rows because of an underestimated cardinality.<\/p>\n<p>Here, I have only small tables. If the table is bigger, then the horizontal line for Hash Join will be higher. If the clustering factor of the index is better, then the slope for Nested Loop line wil be lower. All that will determine how far the inflection point goes.<\/p>\n<p>Note that when the actual number of rows is in the same ballpark as the inflection point, CBO has to make a choice anyway, but I consider in that case that none of the plans are optimal, both being probably too expensive. And that&#8217;s also bad for plan stability because a few additional rows will change the plan on a new parse (see Jonathan Lewis&#8217; <a href=\"http:\/\/jonathanlewis.wordpress.com\/2011\/07\/15\/philosophy-15\/trackback\/\">philosophy<\/a>). When this is the case, I advise to check the index efficiency (selectivity and clustering factor) or see how to lower to full scan (partition, smart scan,&#8230;).<\/p>\n<p>This adaptive plan behaviour only occurs at the first execution. The goal is not to be adaptive over time, but just to defer the optimization decision from parse time to execution time. It&#8217;s even better than dynamic sampling: the actual number of rows is used to make the decision.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>By Franck Pachot . The Oracle 12c Adaptive Plan feature was already presented by Nicolas Jardot in OOW 2013: Solving customer issues with the 12c Optimizer. I recently had to answer several questions about its behavior at execution time. Maybe the term &#8216;adaptive&#8217; is misleading. It&#8217;s not that a join will stop and restart to [&hellip;]<\/p>\n","protected":false},"author":27,"featured_media":3704,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[198,59],"tags":[395,349,209],"type_dbi":[],"class_list":["post-3703","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-database-management","category-oracle","tag-adaptive-execution-plan","tag-optimizer","tag-oracle-12c"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.2 (Yoast SEO v27.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Oracle 12c Adaptive Plan &amp; inflection point - dbi Blog<\/title>\n<meta name=\"description\" content=\"Oracle 12c Adaptive Plan description\" \/>\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-adaptive-plan-inflexion-point\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Oracle 12c Adaptive Plan &amp; inflection point\" \/>\n<meta property=\"og:description\" content=\"Oracle 12c Adaptive Plan description\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/oracle-12c-adaptive-plan-inflexion-point\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2014-04-11T10:25:49+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CaptureInflectionPoint.png\" \/>\n\t<meta property=\"og:image:width\" content=\"555\" \/>\n\t<meta property=\"og:image:height\" content=\"263\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\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-adaptive-plan-inflexion-point\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/oracle-12c-adaptive-plan-inflexion-point\\\/\"},\"author\":{\"name\":\"Oracle Team\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/66ab87129f2d357f09971bc7936a77ee\"},\"headline\":\"Oracle 12c Adaptive Plan &amp; inflection point\",\"datePublished\":\"2014-04-11T10:25:49+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/oracle-12c-adaptive-plan-inflexion-point\\\/\"},\"wordCount\":793,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/oracle-12c-adaptive-plan-inflexion-point\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2022\\\/04\\\/CaptureInflectionPoint.png\",\"keywords\":[\"Adaptive execution plan\",\"Optimizer\",\"Oracle 12c\"],\"articleSection\":[\"Database management\",\"Oracle\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/oracle-12c-adaptive-plan-inflexion-point\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/oracle-12c-adaptive-plan-inflexion-point\\\/\",\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/oracle-12c-adaptive-plan-inflexion-point\\\/\",\"name\":\"Oracle 12c Adaptive Plan &amp; inflection point - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/oracle-12c-adaptive-plan-inflexion-point\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/oracle-12c-adaptive-plan-inflexion-point\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2022\\\/04\\\/CaptureInflectionPoint.png\",\"datePublished\":\"2014-04-11T10:25:49+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/66ab87129f2d357f09971bc7936a77ee\"},\"description\":\"Oracle 12c Adaptive Plan description\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/oracle-12c-adaptive-plan-inflexion-point\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/oracle-12c-adaptive-plan-inflexion-point\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/oracle-12c-adaptive-plan-inflexion-point\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2022\\\/04\\\/CaptureInflectionPoint.png\",\"contentUrl\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2022\\\/04\\\/CaptureInflectionPoint.png\",\"width\":555,\"height\":263},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/oracle-12c-adaptive-plan-inflexion-point\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Oracle 12c Adaptive Plan &amp; inflection point\"}]},{\"@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 Adaptive Plan &amp; inflection point - dbi Blog","description":"Oracle 12c Adaptive Plan description","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-adaptive-plan-inflexion-point\/","og_locale":"en_US","og_type":"article","og_title":"Oracle 12c Adaptive Plan &amp; inflection point","og_description":"Oracle 12c Adaptive Plan description","og_url":"https:\/\/www.dbi-services.com\/blog\/oracle-12c-adaptive-plan-inflexion-point\/","og_site_name":"dbi Blog","article_published_time":"2014-04-11T10:25:49+00:00","og_image":[{"width":555,"height":263,"url":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CaptureInflectionPoint.png","type":"image\/png"}],"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-adaptive-plan-inflexion-point\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/oracle-12c-adaptive-plan-inflexion-point\/"},"author":{"name":"Oracle Team","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/66ab87129f2d357f09971bc7936a77ee"},"headline":"Oracle 12c Adaptive Plan &amp; inflection point","datePublished":"2014-04-11T10:25:49+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/oracle-12c-adaptive-plan-inflexion-point\/"},"wordCount":793,"commentCount":0,"image":{"@id":"https:\/\/www.dbi-services.com\/blog\/oracle-12c-adaptive-plan-inflexion-point\/#primaryimage"},"thumbnailUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CaptureInflectionPoint.png","keywords":["Adaptive execution plan","Optimizer","Oracle 12c"],"articleSection":["Database management","Oracle"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/oracle-12c-adaptive-plan-inflexion-point\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/oracle-12c-adaptive-plan-inflexion-point\/","url":"https:\/\/www.dbi-services.com\/blog\/oracle-12c-adaptive-plan-inflexion-point\/","name":"Oracle 12c Adaptive Plan &amp; inflection point - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/oracle-12c-adaptive-plan-inflexion-point\/#primaryimage"},"image":{"@id":"https:\/\/www.dbi-services.com\/blog\/oracle-12c-adaptive-plan-inflexion-point\/#primaryimage"},"thumbnailUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CaptureInflectionPoint.png","datePublished":"2014-04-11T10:25:49+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/66ab87129f2d357f09971bc7936a77ee"},"description":"Oracle 12c Adaptive Plan description","breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/oracle-12c-adaptive-plan-inflexion-point\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/oracle-12c-adaptive-plan-inflexion-point\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.dbi-services.com\/blog\/oracle-12c-adaptive-plan-inflexion-point\/#primaryimage","url":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CaptureInflectionPoint.png","contentUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CaptureInflectionPoint.png","width":555,"height":263},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/oracle-12c-adaptive-plan-inflexion-point\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Oracle 12c Adaptive Plan &amp; inflection point"}]},{"@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\/3703","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=3703"}],"version-history":[{"count":0,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/3703\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media\/3704"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=3703"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=3703"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=3703"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=3703"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}