{"id":1673,"date":"2018-01-28T17:35:06","date_gmt":"2018-01-28T17:35:06","guid":{"rendered":"http:\/\/nenadnoveljic.com\/blog\/?p=1673"},"modified":"2021-02-08T15:34:02","modified_gmt":"2021-02-08T15:34:02","slug":"cost-based-or-expansion-transformation","status":"publish","type":"post","link":"https:\/\/nenadnoveljic.com\/blog\/cost-based-or-expansion-transformation\/","title":{"rendered":"Cost-Based OR Expansion Transformation"},"content":{"rendered":"<p>In the relase 12.2 Oracle improved the OR expansion by implementing it as a cost based transformation. As a consequence, this enhancement opened up new possibilities for finding better execution plans. In fact, there are already couple of excellent articles listed in References which explain how this transformation works. So, there is no point in repeating what was already said. What I&#8217;m going to do instead is, describe boundary conditions under which the optimizer decides to discard the OR Expansion entirely. This omission, in turn, can lead to a severe decline in performance after upgrade to 12.2.<\/p>\n<p>Firstly, I&#8217;ll create two tables with a couple of indexes:<\/p>\n<pre><code>create table t1 (n1 number, c1 varchar2(255)) ;\n\ncreate table t2 (n1 number, c1 varchar2(255), c2 varchar2(1)) ;\ncreate index t2_idx1 on t2(n1);\ncreate index t2_idx2 on t2(c1);<\/code><\/pre>\n<p>Secondly, I&#8217;ll examine the execution plan of the statement, where the OR expansion doesn&#8217;t kick in:<\/p>\n<pre><code>MERGE INTO t2 USING (\n  SELECT  n1,c1 FROM t1 \n) at1 ON (  \n  at1.n1 = t2.n1 or at1.c1 = t2.c1 \n) \nWHEN MATCHED THEN  UPDATE SET c2 = 'a'\nWHEN NOT MATCHED THEN INSERT (n1) VALUES (1) ;\n\n------------------------------------------------------------------------------------------\n| Id  | Operation              | Name            | Rows  | Bytes | Cost (%CPU)| Time     |\n------------------------------------------------------------------------------------------\n|   0 | MERGE STATEMENT        |                 |       |       |     4 (100)|          |\n|   1 |  MERGE                 | T2              |       |       |            |          |\n|   2 |   VIEW                 |                 |       |       |            |          |\n|   3 |    MERGE JOIN OUTER    |                 |     1 |   298 |     4   (0)| 00:00:01 |\n|   4 |     TABLE ACCESS FULL  | T1              |     1 |   142 |     2   (0)| 00:00:01 |\n|   5 |     BUFFER SORT        |                 |     1 |   156 |     2   (0)| 00:00:01 |\n|   6 |      VIEW              | VW_<span style=\"color: #ff0000;\">LAT<\/span>_8626BD41 |     1 |   156 |     2   (0)| 00:00:01 |\n|*  7 |       <span style=\"color: #ff0000;\">TABLE ACCESS FULL<\/span>| T2              |     1 |   156 |     2   (0)| 00:00:01 |\n------------------------------------------------------------------------------------------\n \nPredicate Information (identified by operation id):\n---------------------------------------------------\n \n   7 - filter((\"N1\"=\"T2\".\"N1\" OR \"C1\"=\"T2\".\"C1\")) \n<\/code><\/pre>\n<p>In the step 7 we can see that the OR expansion was not done.<\/p>\n<p>Note that this is the problem specific to the merge statement above. In contrast, the new cost based transformation works perfectly on a simple select with the same OR predicates:<\/p>\n<pre><code>select * from t2 where n1 = 1 or c1 = 'a'\n\n-------------------------------------------------------------------------------------------------\n| Id  | Operation                     | Name            | Rows  | Bytes | Cost (%CPU)| Time     |\n-------------------------------------------------------------------------------------------------\n|   0 | SELECT STATEMENT              |                 |       |       |     2 (100)|          |\n|   1 |  VIEW                         | VW_<span style=\"color: #ff0000;\">ORE<\/span>_AE9E49E8 |     2 |   288 |     2   (0)| 00:00:01 |\n|   2 |   <span style=\"color: #ff0000;\">UNION-ALL<\/span>                   |                 |       |       |            |          |\n|   3 |    TABLE ACCESS BY INDEX ROWID| T2              |     1 |   144 |     1   (0)| 00:00:01 |\n|*  4 |     INDEX RANGE SCAN          | T2_IDX1         |     1 |       |     1   (0)| 00:00:01 |\n|*  5 |    TABLE ACCESS BY INDEX ROWID| T2              |     1 |   144 |     1   (0)| 00:00:01 |\n|*  6 |     INDEX RANGE SCAN          | T2_IDX2         |     1 |       |     1   (0)| 00:00:01 |\n-------------------------------------------------------------------------------------------------\n \nPredicate Information (identified by operation id):\n---------------------------------------------------\n \n   4 - access(\"N1\"=1)\n   5 - filter(LNNVL(\"N1\"=1))\n   6 - access(\"C1\"='a')<\/code><\/pre>\n<h1>Workaround<\/h1>\n<p>Luckily, there is a hidden parameter for falling back to the old-style heuristic OR expansion:<\/p>\n<pre><code>ALTER SESSION SET \"_optimizer_cbqt_or_expansion\"=off;<\/code><\/pre>\n<p>The plan that is being produced after activating the workaround is identical to the one in the relase 12.1:<\/p>\n<pre><code>\n-----------------------------------------------------------------------------------------------------\n| Id  | Operation                         | Name            | Rows  | Bytes | Cost (%CPU)| Time     |\n-----------------------------------------------------------------------------------------------------\n|   0 | MERGE STATEMENT                   |                 |       |       |     2 (100)|          |\n|   1 |  MERGE                            | T2              |       |       |            |          |\n|   2 |   VIEW                            |                 |       |       |            |          |\n|   3 |    MERGE JOIN OUTER               |                 |     1 |   298 |     2   (0)| 00:00:01 |\n|   4 |     TABLE ACCESS FULL             | T1              |     1 |   142 |     2   (0)| 00:00:01 |\n|   5 |     BUFFER SORT                   |                 |     2 |   312 |     0   (0)|          |\n|   6 |      VIEW                         | VW_<span style=\"color: #ff0000;\">LAT<\/span>_8626BD41 |     2 |   312 |     0   (0)|          |\n|   7 |       <span style=\"color: #ff0000;\">CONCATENATION<\/span>               |                 |       |       |            |          |\n|   8 |        TABLE ACCESS BY INDEX ROWID| T2              |     1 |   156 |     0   (0)|          |\n|*  9 |         INDEX RANGE SCAN          | T2_IDX2         |     1 |       |     0   (0)|          |\n|* 10 |        TABLE ACCESS BY INDEX ROWID| T2              |     1 |   156 |     0   (0)|          |\n|* 11 |         INDEX RANGE SCAN          | T2_IDX1         |     1 |       |     0   (0)|          |\n-----------------------------------------------------------------------------------------------------\n \nPredicate Information (identified by operation id):\n---------------------------------------------------\n \n   9 - access(\"C1\"=\"T2\".\"C1\")\n  10 - filter(LNNVL(\"C1\"=\"T2\".\"C1\"))\n  11 - access(\"N1\"=\"T2\".\"N1\")<\/code><\/pre>\n<p>Unfortunately, the workaround switches off the Cost Base OR Expansion Transformation (CBORE) completely. This means that we are trading the opportunity to find better execution plans in some cases for avoiding a potentially catastrophic plan in this particular example.<\/p>\n<h1>Bug<\/h1>\n<p>If we dig into the optimizer trace, we&#8217;ll indeed find the indication that CBORE was discarded:<\/p>\n<pre><code>ORE: bypassed - Merge view query block.<\/code><\/pre>\n<p>Next, the search in Metalink based on the line above yields the following documents:<\/p>\n<ul>\n<li>After Upgrade to 12.2 OR Expansion is Unexpectedly Bypassed for Some SQL Queries Which Can Result in Sub-optimal Execution Plans (Doc ID 2279072.1)<\/li>\n<li>BUG:26019148 CBQT ORE DOES NOT APPLY TO CORRELATED SCALAR SUBQUERY WITH OE<\/li>\n<\/ul>\n<p>Therefore, it is an optimizer bug. Surprisingly, the fix is already included in the January PSU:<\/p>\n<pre><code>select BUGNO, VALUE, DESCRIPTION from V$SYSTEM_FIX_CONTROL where BUGNO='26019148';\n\n     eBUGNO      VALUE\n---------- ----------\nDESCRIPTION\n----------------------------------------------------------------\n  26019148          1\nAllow ORE in select list subq<\/code><\/pre>\n<p>But sadly, the problem is not really fixed, at least not for our merge statement. What I mean by that is, its plan didn&#8217;t change at all after applying the January PSU.<\/p>\n<p>In conclusion, currently there doesn&#8217;t seem to be any alternative to switching off the Cost Based OR Expansion Transformation.<\/p>\n<h1>Updates<\/h1>\n<h2>February 1, 2018 &#8211; Workaround with sql_patch<\/h2>\n<p>Actually, Jonathan Lewis suggested to create the sql patch with the opt_param hint. That works perfectly:<\/p>\n<pre><code>\nDECLARE\n  l  VARCHAR2(32767);\nBEGIN\n  l := SYS.DBMS_SQLDIAG.create_sql_patch(\n    sql_id    =&gt; 'dy8x4h4bratan',\n    hint_text =&gt; q'[opt_param('_optimizer_cbqt_or_expansion','off')]',\n    name      =&gt; 'cbqt_ore_off');\nEND;\n\/\n<\/code><\/pre>\n<p>The upside of this approach is that you don&#8217;t need to turn off the feature globally. By doing so, the CBORE transformation is deactivated just for the SQL statements where the optimizer is making a wrong decision. On the downside, this might become awkward if you&#8217;re dealing with multiple SQLs embedded in a volatile application code outside your control. In such case, it might be more convenient to turn off CBORE on the session or the database level.<\/p>\n<h2>April 3, 2018 &#8211; Bug Raised<\/h2>\n<p>The following bug was raised due to this issue: BUG 27786168 &#8211; CBQT ORE TRANSFORMATION NOT TAKING PLACE FOR MERGE STATEMENTS<\/p>\n<h2>September 26, 2018 &#8211; Oracle 18c<\/h2>\n<p>The problem hasn&#8217;t been fixed in 18.3.0.0.180717.<\/p>\n<h2>February 7, 2021 &#8211; patch<\/h2>\n<p>In the meantime, Oracle released the patch 27786168 for the versions 12c 18c and 19c. I tested it on 19.9.0.0.201020.<br \/>\nInterestingly, the optimizer performs the old-style, i.e. non-cost based ORE for merge statements:<\/p>\n<pre><code>MERGE INTO t2 USING (   SELECT  n1,c1 FROM t1 ) at1 ON (   at1.n1 =\nt2.n1 or at1.c1 = t2.c1 ) WHEN MATCHED THEN  UPDATE SET c2 = 'a' WHEN\nNOT MATCHED THEN INSERT (n1) VALUES (1)\n\nPlan hash value: 2960188956\n\n-------------------------------------------------------------------------------------------------------------\n| Id  | Operation                                 | Name            | Rows  | Bytes | Cost (%CPU)| Time     |\n-------------------------------------------------------------------------------------------------------------\n|   0 | MERGE STATEMENT                           |                 |       |       |     3 (100)|          |\n|   1 |  MERGE                                    | T2              |       |       |            |          |\n|   2 |   VIEW                                    |                 |       |       |            |          |\n|   3 |    MERGE JOIN OUTER                       |                 |     1 |   298 |     3   (0)| 00:00:01 |\n|   4 |     TABLE ACCESS FULL                     | T1              |     1 |   142 |     3   (0)| 00:00:01 |\n|   5 |     BUFFER SORT                           |                 |     2 |   312 |     0   (0)|          |\n|   6 |      VIEW                                 | VW_LAT_8626BD41 |     2 |   312 |     0   (0)|          |\n|   7 |       <span style=\"color: #ff0000;\">CONCATENATION<\/span>                       |                 |       |       |            |          |\n|   8 |        TABLE ACCESS BY INDEX ROWID BATCHED| T2              |     1 |   156 |     0   (0)|          |\n|*  9 |         INDEX RANGE SCAN                  | T2_IDX2         |     1 |       |     0   (0)|          |\n|* 10 |        TABLE ACCESS BY INDEX ROWID BATCHED| T2              |     1 |   156 |     0   (0)|          |\n|* 11 |         INDEX RANGE SCAN                  | T2_IDX1         |     1 |       |     0   (0)|          |\n-------------------------------------------------------------------------------------------------------------<\/code><\/pre>\n<p>For other statements, ORE remains cost based:<\/p>\n<pre><code>select * from t2 where n1 = 1 or c1 = 'a'\n\nPlan hash value: 2528924309\n\n---------------------------------------------------------------------------------------------------------\n| Id  | Operation                             | Name            | Rows  | Bytes | Cost (%CPU)| Time     |\n---------------------------------------------------------------------------------------------------------\n|   0 | SELECT STATEMENT                      |                 |       |       |     2 (100)|          |\n|   1 |  VIEW                                 | VW_<span style=\"color: #ff0000;\">ORE<\/span>_AE9E49E8 |     2 |   288 |     2   (0)| 00:00:01 |\n|   2 |   <span style=\"color: #ff0000;\">UNION-ALL<\/span>                           |                 |       |       |            |          |\n|   3 |    TABLE ACCESS BY INDEX ROWID BATCHED| T2              |     1 |   144 |     1   (0)| 00:00:01 |\n|*  4 |     INDEX RANGE SCAN                  | T2_IDX1         |     1 |       |     1   (0)| 00:00:01 |\n|*  5 |    TABLE ACCESS BY INDEX ROWID BATCHED| T2              |     1 |   144 |     1   (0)| 00:00:01 |\n|*  6 |     INDEX RANGE SCAN                  | T2_IDX2         |     1 |       |     1   (0)| 00:00:01 |\n---------------------------------------------------------------------------------------------------------\n\nPredicate Information (identified by operation id):\n---------------------------------------------------\n\n   4 - access(\"N1\"=1)\n   5 - filter(LNNVL(\"N1\"=1))\n   6 - access(\"C1\"='a')<\/code><\/pre>\n<h1>References<\/h1>\n<ul>\n<li>Oracle White Paper: <a href=\"http:\/\/www.oracle.com\/technetwork\/database\/bi-datawarehousing\/twp-optimizer-with-oracledb-12c-1963236.pdf\" target=\"_blank\" rel=\"noopener noreferrer\">Optimizer with Oracle Database 12c Release 2<\/a><\/li>\n<li>Mohamed Houri: <a href=\"https:\/\/hourim.wordpress.com\/2017\/06\/17\/12cr2-or-expansion\/\" target=\"_blank\" rel=\"noopener noreferrer\">12cR2 OR-Expansion<\/a><\/li>\n<li>Nigel Bayliss: <a href=\"https:\/\/blogs.oracle.com\/optimizer\/optimizer-transformations:-or-expansion\" target=\"_blank\" rel=\"noopener noreferrer\">Optimizer Transformations: OR Expansion<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>OR expansion not working properly in Oracle 12.2 <a href=\"https:\/\/nenadnoveljic.com\/blog\/cost-based-or-expansion-transformation\/\" class=\"more-link\">Continue Reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[22,8,29,36,11,33,5],"tags":[],"class_list":["post-1673","post","type-post","status-publish","format-standard","hentry","category-12-2","category-12c","category-18c","category-19c","category-cost-based-optimizer","category-or-expansion","category-oracle"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Cost-Based OR Expansion Transformation - All-round Database Topics<\/title>\n<meta name=\"description\" content=\"OR expansion not working properly in Oracle 12.2\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/nenadnoveljic.com\/blog\/cost-based-or-expansion-transformation\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Cost-Based OR Expansion Transformation - All-round Database Topics\" \/>\n<meta property=\"og:description\" content=\"OR expansion not working properly in Oracle 12.2\" \/>\n<meta property=\"og:url\" content=\"https:\/\/nenadnoveljic.com\/blog\/cost-based-or-expansion-transformation\/\" \/>\n<meta property=\"og:site_name\" content=\"All-round Database Topics\" \/>\n<meta property=\"article:published_time\" content=\"2018-01-28T17:35:06+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-02-08T15:34:02+00:00\" \/>\n<meta name=\"author\" content=\"Nenad Noveljic\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@NenadNoveljic\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Nenad Noveljic\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/cost-based-or-expansion-transformation\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/cost-based-or-expansion-transformation\\\/\"},\"author\":{\"name\":\"Nenad Noveljic\",\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/#\\\/schema\\\/person\\\/51458d9dd86dbbdd19f5add451d44efa\"},\"headline\":\"Cost-Based OR Expansion Transformation\",\"datePublished\":\"2018-01-28T17:35:06+00:00\",\"dateModified\":\"2021-02-08T15:34:02+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/cost-based-or-expansion-transformation\\\/\"},\"wordCount\":580,\"commentCount\":10,\"articleSection\":[\"12.2\",\"12c\",\"18c\",\"19c\",\"cost based optimizer\",\"OR-expansion\",\"Oracle\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/cost-based-or-expansion-transformation\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/cost-based-or-expansion-transformation\\\/\",\"url\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/cost-based-or-expansion-transformation\\\/\",\"name\":\"Cost-Based OR Expansion Transformation - All-round Database Topics\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/#website\"},\"datePublished\":\"2018-01-28T17:35:06+00:00\",\"dateModified\":\"2021-02-08T15:34:02+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/#\\\/schema\\\/person\\\/51458d9dd86dbbdd19f5add451d44efa\"},\"description\":\"OR expansion not working properly in Oracle 12.2\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/cost-based-or-expansion-transformation\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/cost-based-or-expansion-transformation\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/cost-based-or-expansion-transformation\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Cost-Based OR Expansion Transformation\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/\",\"name\":\"All-round Database Topics\",\"description\":\"Nenad Noveljic\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/#\\\/schema\\\/person\\\/51458d9dd86dbbdd19f5add451d44efa\",\"name\":\"Nenad Noveljic\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a97b796613ea48ec8a7b79c8ffe1c685dcffc920c68121f6238d5caab5070670?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a97b796613ea48ec8a7b79c8ffe1c685dcffc920c68121f6238d5caab5070670?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a97b796613ea48ec8a7b79c8ffe1c685dcffc920c68121f6238d5caab5070670?s=96&d=mm&r=g\",\"caption\":\"Nenad Noveljic\"},\"sameAs\":[\"nenad-noveljic-9b746a6\",\"https:\\\/\\\/x.com\\\/NenadNoveljic\"],\"url\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/author\\\/nenad\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Cost-Based OR Expansion Transformation - All-round Database Topics","description":"OR expansion not working properly in Oracle 12.2","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/nenadnoveljic.com\/blog\/cost-based-or-expansion-transformation\/","og_locale":"en_US","og_type":"article","og_title":"Cost-Based OR Expansion Transformation - All-round Database Topics","og_description":"OR expansion not working properly in Oracle 12.2","og_url":"https:\/\/nenadnoveljic.com\/blog\/cost-based-or-expansion-transformation\/","og_site_name":"All-round Database Topics","article_published_time":"2018-01-28T17:35:06+00:00","article_modified_time":"2021-02-08T15:34:02+00:00","author":"Nenad Noveljic","twitter_card":"summary_large_image","twitter_creator":"@NenadNoveljic","twitter_misc":{"Written by":"Nenad Noveljic","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/nenadnoveljic.com\/blog\/cost-based-or-expansion-transformation\/#article","isPartOf":{"@id":"https:\/\/nenadnoveljic.com\/blog\/cost-based-or-expansion-transformation\/"},"author":{"name":"Nenad Noveljic","@id":"https:\/\/nenadnoveljic.com\/blog\/#\/schema\/person\/51458d9dd86dbbdd19f5add451d44efa"},"headline":"Cost-Based OR Expansion Transformation","datePublished":"2018-01-28T17:35:06+00:00","dateModified":"2021-02-08T15:34:02+00:00","mainEntityOfPage":{"@id":"https:\/\/nenadnoveljic.com\/blog\/cost-based-or-expansion-transformation\/"},"wordCount":580,"commentCount":10,"articleSection":["12.2","12c","18c","19c","cost based optimizer","OR-expansion","Oracle"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/nenadnoveljic.com\/blog\/cost-based-or-expansion-transformation\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/nenadnoveljic.com\/blog\/cost-based-or-expansion-transformation\/","url":"https:\/\/nenadnoveljic.com\/blog\/cost-based-or-expansion-transformation\/","name":"Cost-Based OR Expansion Transformation - All-round Database Topics","isPartOf":{"@id":"https:\/\/nenadnoveljic.com\/blog\/#website"},"datePublished":"2018-01-28T17:35:06+00:00","dateModified":"2021-02-08T15:34:02+00:00","author":{"@id":"https:\/\/nenadnoveljic.com\/blog\/#\/schema\/person\/51458d9dd86dbbdd19f5add451d44efa"},"description":"OR expansion not working properly in Oracle 12.2","breadcrumb":{"@id":"https:\/\/nenadnoveljic.com\/blog\/cost-based-or-expansion-transformation\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/nenadnoveljic.com\/blog\/cost-based-or-expansion-transformation\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/nenadnoveljic.com\/blog\/cost-based-or-expansion-transformation\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/nenadnoveljic.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Cost-Based OR Expansion Transformation"}]},{"@type":"WebSite","@id":"https:\/\/nenadnoveljic.com\/blog\/#website","url":"https:\/\/nenadnoveljic.com\/blog\/","name":"All-round Database Topics","description":"Nenad Noveljic","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/nenadnoveljic.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/nenadnoveljic.com\/blog\/#\/schema\/person\/51458d9dd86dbbdd19f5add451d44efa","name":"Nenad Noveljic","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/a97b796613ea48ec8a7b79c8ffe1c685dcffc920c68121f6238d5caab5070670?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/a97b796613ea48ec8a7b79c8ffe1c685dcffc920c68121f6238d5caab5070670?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/a97b796613ea48ec8a7b79c8ffe1c685dcffc920c68121f6238d5caab5070670?s=96&d=mm&r=g","caption":"Nenad Noveljic"},"sameAs":["nenad-noveljic-9b746a6","https:\/\/x.com\/NenadNoveljic"],"url":"https:\/\/nenadnoveljic.com\/blog\/author\/nenad\/"}]}},"_links":{"self":[{"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/posts\/1673","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/comments?post=1673"}],"version-history":[{"count":1,"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/posts\/1673\/revisions"}],"predecessor-version":[{"id":3710,"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/posts\/1673\/revisions\/3710"}],"wp:attachment":[{"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/media?parent=1673"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/categories?post=1673"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/tags?post=1673"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}