{"id":2309,"date":"2018-12-07T13:09:41","date_gmt":"2018-12-07T13:09:41","guid":{"rendered":"https:\/\/nenadnoveljic.com\/blog\/?p=2309"},"modified":"2019-08-23T15:57:48","modified_gmt":"2019-08-23T15:57:48","slug":"suboptimal-execution-plan-with-join-predicate-push-down-transformation","status":"publish","type":"post","link":"https:\/\/nenadnoveljic.com\/blog\/suboptimal-execution-plan-with-join-predicate-push-down-transformation\/","title":{"rendered":"Suboptimal Execution Plan with Join Predicate Push-Down Transformation"},"content":{"rendered":"<p>The optimizer is generating an expensive plan with the join predicate push-down (JPPD) transformation on a 12.2 database &#8211; the estimated cost is around 3,376,000. In contrast, I&#8217;m getting a much cheaper plan &#8211; with a cost of around 84,000 &#8211; after disabling the tranformation by setting &#8220;_push_join_predicate&#8221; to false.<\/p>\n<p>So, surprisingly, the optimizer somehow misses a better plan when doing the JPPD transformation.<\/p>\n<p>It\u2019s a complex query, which I couldn&#8217;t model so far. Therefore, I&#8217;m going to describe the problem by using the information from the CBO (10053) trace.<\/p>\n<p>First, the optimizer is calculating the cost of pushing join predicates from the query block with the annotation <span style=\"color: rgb(0, 0, 255);\">#4<\/span> to three different query blocks &#8211; annotated as: <span style=\"color: rgb(0, 0, 255);\">#10<\/span>, <span style=\"color: rgb(0, 0, 255);\">#11<\/span> and <span style=\"color: rgb(0, 0, 255);\">#12<\/span> :<\/p>\n<pre><code>JPPD: Checking validity of push-down in query block SET$BADDE9FB_1 (<span style=\"color: rgb(0, 0, 255);\">#4<\/span>)\nJPPD:   Checking validity of push-down from query block SET$BADDE9FB_1 (<span style=\"color: rgb(0, 0, 255);\">#4<\/span>) to query block SEL$2DE89145 (<span style=\"color: rgb(0, 0, 255);\">#10<\/span>)\nCheck Basic Validity for Non-Union View for query block SEL$2DE89145 (#10)\nJPPD:     Passed validity checks\nJPPD:   Checking validity of push-down from query block SET$BADDE9FB_1 (<span style=\"color: rgb(0, 0, 255);\">#4<\/span>) to query block SEL$41289C4A (<span style=\"color: rgb(0, 0, 255);\">#11<\/span>)\nCheck Basic Validity for Non-Union View for query block SEL$41289C4A (#11)\nJPPD:     Passed validity checks\nJPPD:   Checking validity of push-down from query block SET$BADDE9FB_1 (<span style=\"color: rgb(0, 0, 255);\">#4<\/span>) to query block SEL$A0D20652 (<span style=\"color: rgb(0, 0, 255);\">#12<\/span>)\nCheck Basic Validity for Non-Union View for query block SEL$A0D20652 (#12)\nJPPD:     Passed validity checks\nJPPD: JPPD:   Pushdown from query block SET$BADDE9FB_1 (<span style=\"color: rgb(0, 0, 255);\">#4<\/span>) passed validity checks. \nJoin-Predicate push-down on query block SET$BADDE9FB_1 (<span style=\"color: rgb(0, 0, 255);\">#4<\/span>)\nJPPD: Using search type: linear\nJPPD: Considering join predicate push-down\nJPPD: Starting iteration 1, state space = (<span style=\"color: rgb(0, 0, 255);\">10,11,12<\/span>) : (0,0,0)\nJPPD: <span style=\"color: rgb(255, 0, 0);\">Updated best state, Cost = 41463.286373<\/span>\nJPPD: Starting iteration 2, state space = (10,11,12) : (1,0,0)\nJPPD: Not update best state, Cost = 41463.286373\nJPPD: Starting iteration 3, state space = (10,11,12) : (0,1,0)\nJPPD: Not update best state, Cost = 41463.286373\nJPPD: Starting iteration 4, state space = (10,11,12) : (0,0,1)\nJPPD: Not update best state, Cost = 41463.286373<\/code><\/pre>\n<p>As you can see, the state space (<span style=\"color: rgb(0, 0, 255);\">10,11,12<\/span>) : (0,0,0) is the one with the lowest cost. In other words, it would be most efficient not to do JPPD at all.<\/p>\n<p>Also the subsequent log entry is indicating that JPPD shouldn\u2019t be done:<\/p>\n<pre><code>JPPD: <span style=\"color: rgb(255, 0, 0);\">Will not use JPPD from query block<\/span> SET$BADDE9FB_1 (<span style=\"color: rgb(0, 0, 255);\">#4<\/span>)<\/code><\/pre>\n<p>But later on, strangely, the optimizer ignores that and, in the end, applies the JPPD on all three query blocks:<\/p>\n<pre><code>JPPD: Checking validity of push-down in query block SET$BADDE9FB_1 (<span style=\"color: rgb(0, 0, 255);\">#4<\/span>)\nJPPD: JPPD:   Pushdown from query block SET$BADDE9FB_1 (<span style=\"color: rgb(0, 0, 255);\">#4<\/span>) passed validity checks. \nJPPD: <span style=\"color: rgb(255, 0, 0);\">Performing join predicate push-down (final phase) from query block<\/span> SET$BADDE9FB_1 (<span style=\"color: rgb(0, 0, 255);\">#4<\/span>) to query block SEL$A0D20652 (<span style=\"color: rgb(0, 0, 255);\">#12<\/span>)\nJPPD:   Pushing predicate \"BRIEFANREDE\".\"VIN01ID\"(+)=\"VIN01\".\"ID\"\nfrom query block SET$BADDE9FB_1 (<span style=\"color: rgb(0, 0, 255);\">#4<\/span>) to query block SEL$A0D20652 (<span style=\"color: rgb(0, 0, 255);\">#12<\/span>)\nJPPD: Push dest of pred 0xa8637960 is qb 0xbac44950:query block SEL$A0D20652 (<span style=\"color: rgb(0, 0, 255);\">#12<\/span>)\n\nJPPD: <span style=\"color: rgb(255, 0, 0);\">Performing join predicate push-down (final phase) from query block<\/span> SET$BADDE9FB_1 (<span style=\"color: rgb(0, 0, 255);\">#4<\/span>) to query block SEL$41289C4A (<span style=\"color: rgb(0, 0, 255);\">#11<\/span>)\nJPPD:   Pushing predicate \"ORG12_RM_GESCHAEFTSFELD\".\"GES01_ID\"(+)=\"GES01\".\"ID\"\nfrom query block SET$BADDE9FB_1 (<span style=\"color: rgb(0, 0, 255);\">#4<\/span>) to query block SEL$41289C4A (<span style=\"color: rgb(0, 0, 255);\">#11<\/span>)\nJPPD: Push dest of pred 0xa8633870 is qb 0xcbbc3de8:query block SEL$41289C4A (<span style=\"color: rgb(0, 0, 255);\">#11<\/span>)\n\nJPPD: <span style=\"color: rgb(255, 0, 0);\">Performing join predicate push-down (final phase) from query block<\/span> SET$BADDE9FB_1 (<span style=\"color: rgb(0, 0, 255);\">#4<\/span>) to query block SEL$2DE89145 (<span style=\"color: rgb(0, 0, 255);\">#10<\/span>)\nJPPD:   Pushing predicate \"EAM\".\"GES01_GESCHAEFTSBEZIEHUNG_GBZ\"(+)=\"VIN01\".\"GES01_GBZ_GBZ\"\nfrom query block SET$BADDE9FB_1 (<span style=\"color: rgb(0, 0, 255);\">#4<\/span>) to query block SEL$2DE89145 (<span style=\"color: rgb(0, 0, 255);\">#10<\/span>)\nJPPD: Push dest of pred 0x8fa13010 is qb 0x858777a8:query block SEL$2DE89145 (<span style=\"color: rgb(0, 0, 255);\">#10<\/span>)<\/code><\/pre>\n<p>In the trace I haven&#8217;t found any clue about what leads the optimizer to suddenly start doing JPPD.<\/p>\n<p>Also, I posted this problem on <a href=\"https:\/\/www.freelists.org\/post\/oracle-l\/Expensive-plan-with-joinpredicate-pushdown-JPPD-gets-chosen\">Oracle-L<\/a>, but haven&#8217;t got any answers so far.<\/p>\n<p>In the meantime, you can use the Python script <a href=\"https:\/\/github.com\/nenadnoveljic\/oradb\/blob\/master\/jppd_parser.py\">jppd_parser.py<\/a> to parse the CBO trace and check if your execution plan is affected by this problem.<\/p>\n<p>You can see the sample output is bellow:<\/p>\n<pre><code>JPPD: Will not use JPPD from query block SEL$2DE89145 (#6)\nJPPD: Will not use JPPD from query block SET$12FE3EEB_2 (#5)\nJPPD: Will not use JPPD from query block SEL$2DE89145 (#10)\nJPPD: <span style=\"color: rgb(255, 0, 0);\">Will not use JPPD from query block<\/span> SET$12FE3EEB_1 (<span style=\"color: rgb(0, 0, 255);\">#4<\/span>)\nJPPD: Performing join predicate push-down (final phase) from query block SEL$2DE89145 (#6) to query block SEL$EBDEBDD3 (#9)\nJPPD: Performing join predicate push-down (final phase) from query block SET$12FE3EEB_2 (#5) to query block SEL$A0D20652 (#8)\nJPPD: Performing join predicate push-down (final phase) from query block SET$12FE3EEB_2 (#5) to query block SEL$41289C4A (#7)\nJPPD: Performing join predicate push-down (final phase) from query block SET$12FE3EEB_2 (#5) to query block SEL$2DE89145 (#6)\nJPPD: Performing join predicate push-down (final phase) from query block SEL$2DE89145 (#10) to query block SEL$EBDEBDD3 (#13)\nJPPD: Performing join predicate push-down (final phase) from query block SET$12FE3EEB_1 (#4) to query block SEL$A0D20652 (#12)\nJPPD: Performing join predicate push-down (final phase) from query block SET$12FE3EEB_1 (#4) to query block SEL$41289C4A (#11)\nJPPD: Performing join predicate push-down (final phase) from query block SET$12FE3EEB_1 (<span style=\"color: rgb(0, 0, 255);\">#4<\/span>) to query block SEL$2DE89145 (<span style=\"color: rgb(0, 0, 255);\">#10<\/span>)\nJPPD: Performing join predicate push-down (final phase) from query block SEL$2DE89145 (#6) to query block SEL$EBDEBDD3 (#9)\nJPPD: Performing join predicate push-down (final phase) from query block SET$12FE3EEB_2 (#5) to query block SEL$A0D20652 (#8)\nJPPD: Performing join predicate push-down (final phase) from query block SET$12FE3EEB_2 (#5) to query block SEL$41289C4A (#7)\nJPPD: Performing join predicate push-down (final phase) from query block SET$12FE3EEB_2 (#5) to query block SEL$2DE89145 (#6)\nJPPD: Performing join predicate push-down (final phase) from query block SEL$2DE89145 (#10) to query block SEL$EBDEBDD3 (#13)\nJPPD: <span style=\"color: rgb(255, 0, 0);\">Performing join predicate push-down (final phase) from query block<\/span> SET$12FE3EEB_1 (<span style=\"color: rgb(0, 0, 255);\">#4<\/span>) to query block SEL$A0D20652 (<span style=\"color: rgb(0, 0, 255);\">#12<\/span>)\nJPPD: <span style=\"color: rgb(255, 0, 0);\">Performing join predicate push-down (final phase) from query block<\/span> SET$12FE3EEB_1 (<span style=\"color: rgb(0, 0, 255);\">#4<\/span>) to query block SEL$41289C4A (<span style=\"color: rgb(0, 0, 255);\">#11<\/span>)\nJPPD: <span style=\"color: rgb(255, 0, 0);\">Performing join predicate push-down (final phase) from query block<\/span> SET$12FE3EEB_1 (<span style=\"color: rgb(0, 0, 255);\">#4<\/span>) to query block SEL$2DE89145 (<span style=\"color: rgb(0, 0, 255);\">#10<\/span>)\n\nA possible problem - JPPD was done from the following QBs:\nSET$12FE3EEB_1 (<span style=\"color: rgb(0, 0, 255);\">#4<\/span>)\nSET$12FE3EEB_2 (#5)\nSEL$2DE89145 (#6)\nSEL$2DE89145 (#10)<\/code><\/pre>\n<p>In particular, the script lists the query blocks for which the optimizer first had decided not to do the JPPD, but reverted this decision afterwards.<\/p>\n<p>As I already mentioned, you can try disabling the transformation (_push_join_predicate=false) as a workaround and see if you&#8217;re getting a better execution plan.<\/p>\n<p>Update on February 6, 2019:<br \/>\nThe Python script <a href=\"https:\/\/github.com\/nenadnoveljic\/oradb\/blob\/master\/jppd_parser.py\">jppd_parser.py<\/a> transfered to Github.<\/p>\n<p>References:<\/p>\n<p>Pagano, Mauro. (2017, January 30). <a href=\"https:\/\/de.slideshare.net\/MauroPagano3\/chasing-the-optimizer-71564184\">Chasing the optimizer<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>JPPD is performed where it shouldn&#8217;t. Use the CBO trace parser for detecting the problem. <a href=\"https:\/\/nenadnoveljic.com\/blog\/suboptimal-execution-plan-with-join-predicate-push-down-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":[11,28,5],"tags":[],"class_list":["post-2309","post","type-post","status-publish","format-standard","hentry","category-cost-based-optimizer","category-join-predicate-push-down-jppd","category-oracle"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Suboptimal Execution Plan with Join Predicate Push-Down Transformation - All-round Database Topics<\/title>\n<meta name=\"description\" content=\"JPPD is performed where it shouldn&#039;t. Use the CBO trace parser for detecting the problem.\" \/>\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\/suboptimal-execution-plan-with-join-predicate-push-down-transformation\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Suboptimal Execution Plan with Join Predicate Push-Down Transformation - All-round Database Topics\" \/>\n<meta property=\"og:description\" content=\"JPPD is performed where it shouldn&#039;t. Use the CBO trace parser for detecting the problem.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/nenadnoveljic.com\/blog\/suboptimal-execution-plan-with-join-predicate-push-down-transformation\/\" \/>\n<meta property=\"og:site_name\" content=\"All-round Database Topics\" \/>\n<meta property=\"article:published_time\" content=\"2018-12-07T13:09:41+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2019-08-23T15:57:48+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=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/suboptimal-execution-plan-with-join-predicate-push-down-transformation\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/suboptimal-execution-plan-with-join-predicate-push-down-transformation\\\/\"},\"author\":{\"name\":\"Nenad Noveljic\",\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/#\\\/schema\\\/person\\\/51458d9dd86dbbdd19f5add451d44efa\"},\"headline\":\"Suboptimal Execution Plan with Join Predicate Push-Down Transformation\",\"datePublished\":\"2018-12-07T13:09:41+00:00\",\"dateModified\":\"2019-08-23T15:57:48+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/suboptimal-execution-plan-with-join-predicate-push-down-transformation\\\/\"},\"wordCount\":329,\"commentCount\":0,\"articleSection\":[\"cost based optimizer\",\"join predicate push-down (JPPD)\",\"Oracle\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/suboptimal-execution-plan-with-join-predicate-push-down-transformation\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/suboptimal-execution-plan-with-join-predicate-push-down-transformation\\\/\",\"url\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/suboptimal-execution-plan-with-join-predicate-push-down-transformation\\\/\",\"name\":\"Suboptimal Execution Plan with Join Predicate Push-Down Transformation - All-round Database Topics\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/#website\"},\"datePublished\":\"2018-12-07T13:09:41+00:00\",\"dateModified\":\"2019-08-23T15:57:48+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/#\\\/schema\\\/person\\\/51458d9dd86dbbdd19f5add451d44efa\"},\"description\":\"JPPD is performed where it shouldn't. Use the CBO trace parser for detecting the problem.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/suboptimal-execution-plan-with-join-predicate-push-down-transformation\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/suboptimal-execution-plan-with-join-predicate-push-down-transformation\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/suboptimal-execution-plan-with-join-predicate-push-down-transformation\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Suboptimal Execution Plan with Join Predicate Push-Down 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":"Suboptimal Execution Plan with Join Predicate Push-Down Transformation - All-round Database Topics","description":"JPPD is performed where it shouldn't. Use the CBO trace parser for detecting the problem.","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\/suboptimal-execution-plan-with-join-predicate-push-down-transformation\/","og_locale":"en_US","og_type":"article","og_title":"Suboptimal Execution Plan with Join Predicate Push-Down Transformation - All-round Database Topics","og_description":"JPPD is performed where it shouldn't. Use the CBO trace parser for detecting the problem.","og_url":"https:\/\/nenadnoveljic.com\/blog\/suboptimal-execution-plan-with-join-predicate-push-down-transformation\/","og_site_name":"All-round Database Topics","article_published_time":"2018-12-07T13:09:41+00:00","article_modified_time":"2019-08-23T15:57:48+00:00","author":"Nenad Noveljic","twitter_card":"summary_large_image","twitter_creator":"@NenadNoveljic","twitter_misc":{"Written by":"Nenad Noveljic","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/nenadnoveljic.com\/blog\/suboptimal-execution-plan-with-join-predicate-push-down-transformation\/#article","isPartOf":{"@id":"https:\/\/nenadnoveljic.com\/blog\/suboptimal-execution-plan-with-join-predicate-push-down-transformation\/"},"author":{"name":"Nenad Noveljic","@id":"https:\/\/nenadnoveljic.com\/blog\/#\/schema\/person\/51458d9dd86dbbdd19f5add451d44efa"},"headline":"Suboptimal Execution Plan with Join Predicate Push-Down Transformation","datePublished":"2018-12-07T13:09:41+00:00","dateModified":"2019-08-23T15:57:48+00:00","mainEntityOfPage":{"@id":"https:\/\/nenadnoveljic.com\/blog\/suboptimal-execution-plan-with-join-predicate-push-down-transformation\/"},"wordCount":329,"commentCount":0,"articleSection":["cost based optimizer","join predicate push-down (JPPD)","Oracle"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/nenadnoveljic.com\/blog\/suboptimal-execution-plan-with-join-predicate-push-down-transformation\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/nenadnoveljic.com\/blog\/suboptimal-execution-plan-with-join-predicate-push-down-transformation\/","url":"https:\/\/nenadnoveljic.com\/blog\/suboptimal-execution-plan-with-join-predicate-push-down-transformation\/","name":"Suboptimal Execution Plan with Join Predicate Push-Down Transformation - All-round Database Topics","isPartOf":{"@id":"https:\/\/nenadnoveljic.com\/blog\/#website"},"datePublished":"2018-12-07T13:09:41+00:00","dateModified":"2019-08-23T15:57:48+00:00","author":{"@id":"https:\/\/nenadnoveljic.com\/blog\/#\/schema\/person\/51458d9dd86dbbdd19f5add451d44efa"},"description":"JPPD is performed where it shouldn't. Use the CBO trace parser for detecting the problem.","breadcrumb":{"@id":"https:\/\/nenadnoveljic.com\/blog\/suboptimal-execution-plan-with-join-predicate-push-down-transformation\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/nenadnoveljic.com\/blog\/suboptimal-execution-plan-with-join-predicate-push-down-transformation\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/nenadnoveljic.com\/blog\/suboptimal-execution-plan-with-join-predicate-push-down-transformation\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/nenadnoveljic.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Suboptimal Execution Plan with Join Predicate Push-Down 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\/2309","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=2309"}],"version-history":[{"count":1,"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/posts\/2309\/revisions"}],"predecessor-version":[{"id":2882,"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/posts\/2309\/revisions\/2882"}],"wp:attachment":[{"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/media?parent=2309"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/categories?post=2309"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/tags?post=2309"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}