{"id":8840,"date":"2016-09-13T09:38:25","date_gmt":"2016-09-13T07:38:25","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/result-cache-side-effects-on-number-of-calls\/"},"modified":"2016-09-13T09:38:25","modified_gmt":"2016-09-13T07:38:25","slug":"result-cache-side-effects-on-number-of-calls","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/result-cache-side-effects-on-number-of-calls\/","title":{"rendered":"Result cache side effects on number of calls"},"content":{"rendered":"<h2>By Franck Pachot<\/h2>\n<p>.<br \/>\nDuring the execution of a SQL statement, you cannot guess how many times an operation, a predicate, or a function will be executed. This depends on the execution plan, on some caching at execution, and some other execution time decisions. Here is an example where result cache may bring some overhead by calling a function multiple times.<br \/>\n<!--more--><br \/>\nHere is my function:<\/p>\n<pre><code>SQL&gt; create or replace function F return number is\n  2  begin\n  3   dbms_lock.sleep(5);\n  4   dbms_output.put_line('Hello World');\n  5   return 255;\n  6  end;\n  7  \/\nFunction created.<\/code><\/pre>\n<p>The function displays &#8216;Hello World&#8217; so that I can check how many times it is executed (I&#8217;ve set serveroutput on).<\/p>\n<p>Obviously, on a one row table, it is called only once:<\/p>\n<pre><code>SQL&gt; select f from dual;\n&nbsp;\n         F\n----------\n       255\n&nbsp;\nHello World<\/code><\/pre>\n<h3>Query result cache miss<\/h3>\n<p>I&#8217;ll run now the same query but with the result cache hint. The first execution will have to execute the query because the cache is empty at that point:<\/p>\n<pre><code>SQL&gt; exec dbms_result_cache.flush;\nPL\/SQL procedure successfully completed.\n&nbsp;\nSQL&gt; select \/*+ result_cache *\/ f from dual;\n&nbsp;\n         F\n----------\n       255\n&nbsp;\nHello World\nHello World<\/code><\/pre>\n<p>Here is what I wanted to show: &#8216;Hello World&#8217; is displayed two times instead of one. If your function is an expensive one, then the first execution, or every cache miss, will have a performance overhead.<\/p>\n<h3>Query result cache hit<\/h3>\n<p>Now that the result is in the cache:<\/p>\n<pre><code>SQL&gt; select id, type, status, name from v$result_cache_objects;\n&nbsp;\n        ID TYPE       STATUS    NAME\n---------- ---------- --------- ------------------------------------------------------------\n        33 Dependency Published DEMO.F\n        34 Result     Published select \/*+ result_cache *\/ f from dual<\/code><\/pre>\n<p>and the table has not changed (it&#8217;s DUAL here :; ) further executions do not call the function anymore, which is the expected result.<\/p>\n<pre><code>SQL&gt; select \/*+ result_cache *\/ f from dual ;\n&nbsp;\n         F\n----------\n       255<\/code><\/pre>\n<h3>Bug or not?<\/h3>\n<p>Bug 21484570 has been opened for that and closed as &#8216;Not a bug&#8217;. There is no guarantee that the function is evaluated once, twice, more or never.<br \/>\nOk, why not. That&#8217;s an implementation decision. Just think about it if you want to workaround an expensive function called for each row, then query result cache may not be the right solution (except if all tables are static and you always have cache hits).<\/p>\n<p>Note that if the function is declared as deterministic, it is executed only once.<\/p>\n<p>You can workaround the issue by using result cache at function level (in place, or in addition to query result cache if you need it).<\/p>\n<pre><code>SQL&gt; create or replace function F return number RESULT_CACHE is\n  2  begin\n  3   dbms_lock.sleep(5);\n  4   dbms_output.put_line('Hello World');\n  5   return 255;\n  6  end;\n  7  \/\nFunction created.\n&nbsp;\nSQL&gt; select \/*+ result_cache *\/ f from dual;\n&nbsp;\n         F\n----------\n       255\n&nbsp;\nHello World\n&nbsp;\nSQL&gt; select id, type, status, name from v$result_cache_objects;\n&nbsp;\n        ID TYPE       STATUS    NAME\n---------- ---------- --------- ------------------------------------------------------------\n        64 Dependency Published DEMO.F\n        66 Result     Published \"DEMO\".\"F\"::8.\"F\"#e17d780a3c3eae3d #1\n        65 Result     Published select \/*+ result_cache *\/ f from dual<\/code><\/pre>\n<p>So, not a big problem. Just something to know. And anyway, the right design is NOT to call a function for each row because it&#8217;s not scalable. Pipeline functions should be used for that.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>By Franck Pachot . During the execution of a SQL statement, you cannot guess how many times an operation, a predicate, or a function will be executed. This depends on the execution plan, on some caching at execution, and some other execution time decisions. Here is an example where result cache may bring some overhead [&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":[229],"tags":[96,303],"type_dbi":[],"class_list":["post-8840","post","type-post","status-publish","format-standard","hentry","category-database-administration-monitoring","tag-oracle","tag-result-cache"],"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>Result cache side effects on number of calls - 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\/result-cache-side-effects-on-number-of-calls\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Result cache side effects on number of calls\" \/>\n<meta property=\"og:description\" content=\"By Franck Pachot . During the execution of a SQL statement, you cannot guess how many times an operation, a predicate, or a function will be executed. This depends on the execution plan, on some caching at execution, and some other execution time decisions. Here is an example where result cache may bring some overhead [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/result-cache-side-effects-on-number-of-calls\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2016-09-13T07:38:25+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=\"3 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\/result-cache-side-effects-on-number-of-calls\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/result-cache-side-effects-on-number-of-calls\/\"},\"author\":{\"name\":\"Oracle Team\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/66ab87129f2d357f09971bc7936a77ee\"},\"headline\":\"Result cache side effects on number of calls\",\"datePublished\":\"2016-09-13T07:38:25+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/result-cache-side-effects-on-number-of-calls\/\"},\"wordCount\":358,\"commentCount\":0,\"keywords\":[\"Oracle\",\"Result cache\"],\"articleSection\":[\"Database Administration &amp; Monitoring\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/result-cache-side-effects-on-number-of-calls\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/result-cache-side-effects-on-number-of-calls\/\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/result-cache-side-effects-on-number-of-calls\/\",\"name\":\"Result cache side effects on number of calls - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#website\"},\"datePublished\":\"2016-09-13T07:38:25+00:00\",\"author\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/66ab87129f2d357f09971bc7936a77ee\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/result-cache-side-effects-on-number-of-calls\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/result-cache-side-effects-on-number-of-calls\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/result-cache-side-effects-on-number-of-calls\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/www.dbi-services.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Result cache side effects on number of calls\"}]},{\"@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":"Result cache side effects on number of calls - 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\/result-cache-side-effects-on-number-of-calls\/","og_locale":"en_US","og_type":"article","og_title":"Result cache side effects on number of calls","og_description":"By Franck Pachot . During the execution of a SQL statement, you cannot guess how many times an operation, a predicate, or a function will be executed. This depends on the execution plan, on some caching at execution, and some other execution time decisions. Here is an example where result cache may bring some overhead [&hellip;]","og_url":"https:\/\/www.dbi-services.com\/blog\/result-cache-side-effects-on-number-of-calls\/","og_site_name":"dbi Blog","article_published_time":"2016-09-13T07:38:25+00:00","author":"Oracle Team","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Oracle Team","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dbi-services.com\/blog\/result-cache-side-effects-on-number-of-calls\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/result-cache-side-effects-on-number-of-calls\/"},"author":{"name":"Oracle Team","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/66ab87129f2d357f09971bc7936a77ee"},"headline":"Result cache side effects on number of calls","datePublished":"2016-09-13T07:38:25+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/result-cache-side-effects-on-number-of-calls\/"},"wordCount":358,"commentCount":0,"keywords":["Oracle","Result cache"],"articleSection":["Database Administration &amp; Monitoring"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/result-cache-side-effects-on-number-of-calls\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/result-cache-side-effects-on-number-of-calls\/","url":"https:\/\/www.dbi-services.com\/blog\/result-cache-side-effects-on-number-of-calls\/","name":"Result cache side effects on number of calls - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"datePublished":"2016-09-13T07:38:25+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/66ab87129f2d357f09971bc7936a77ee"},"breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/result-cache-side-effects-on-number-of-calls\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/result-cache-side-effects-on-number-of-calls\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/result-cache-side-effects-on-number-of-calls\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Result cache side effects on number of calls"}]},{"@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\/8840","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=8840"}],"version-history":[{"count":0,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/8840\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=8840"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=8840"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=8840"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=8840"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}