{"id":4390,"date":"2015-03-03T18:52:30","date_gmt":"2015-03-03T17:52:30","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/generic-query-for-multicriteria-search-part-ii-bindaware-adaptive-cursor-sharing\/"},"modified":"2015-03-03T18:52:30","modified_gmt":"2015-03-03T17:52:30","slug":"generic-query-for-multicriteria-search-part-ii-bindaware-adaptive-cursor-sharing","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/generic-query-for-multicriteria-search-part-ii-bindaware-adaptive-cursor-sharing\/","title":{"rendered":"Generic query for multicriteria search &#8211; part II: BIND_AWARE (Adaptive Cursor Sharing)"},"content":{"rendered":"<h2>By Franck Pachot<\/h2>\n<p>.<br \/>\nIn the <a href=\"\/generic-query-for-multicriteria-search-part-i-useconcat-or-expansion\">previous post<\/a> I explained the performance issue encountered when using a generic query to deal with optional search criteria on multiple columns. The statement was shared by all executions, was marked as bind sensitive, but never became bind aware. Let&#8217;s use the BIND_AWARE hint.<\/p>\n<h3>All binds null<\/h3>\n<p>I assign null for all of them &#8211; meaning that I don&#8217;t want to filter anything:<\/p>\n<pre><code>SQL&gt; exec :job_id:=null; :department_id:=null; :manager_id:=null; :employee_id:=null;\nPL\/SQL procedure successfully completed.\n<\/code><\/pre>\n<p>and I run my generic query &#8211; but with the BIND_AWARE hint:<\/p>\n<pre><code>SQL&gt;\n     SELECT \/*+ BIND_AWARE *\/\n     COUNT(*)\n     FROM\n       (SELECT 1\n       FROM employees\n       WHERE (job_id = NVL(:job_id, job_id))\n       AND (department_id = NVL(:department_id, department_id))\n       AND (manager_id = NVL(:manager_id, manager_id))\n       AND (employee_id = NVL(:employee_id, employee_id))\n       )\nSQL&gt; \/\n\n  COUNT(*)\n----------\n       105\n<\/code><\/pre>\n<p>and here is the plan:<\/p>\n<pre><code>SQL&gt; select * from table(dbms_xplan.display_cursor(format=&gt;'allstats last +outline'));\n\nPLAN_TABLE_OUTPUT\n------------------------------------------------------------------------------------\nSQL_ID  fhpytfwk0y4r3, child number 0\n-------------------------------------\nSELECT \/*+ BIND_AWARE *\/ COUNT(*) FROM   (SELECT 1   FROM employees\nWHERE (job_id = NVL(:job_id, job_id))   AND (department_id =\nNVL(:department_id, department_id))   AND (manager_id =\nNVL(:manager_id, manager_id))   AND (employee_id = NVL(:employee_id,\nemployee_id))   )\n\nPlan hash value: 3424141370\n\n------------------------------------------------------------------------------------\n| Id  | Operation                       | Name          | Starts | E-Rows | A-Rows |\n------------------------------------------------------------------------------------\n|   0 | SELECT STATEMENT                |               |      1 |        |      1 |\n|   1 |  SORT AGGREGATE                 |               |      1 |      1 |      1 |\n|   2 |   CONCATENATION                 |               |      1 |        |    105 |\n|*  3 |    FILTER                       |               |      1 |        |    105 |\n|*  4 |     TABLE ACCESS BY INDEX ROWID | EMPLOYEES     |      1 |    105 |    105 |\n|*  5 |      INDEX FULL SCAN            | EMP_EMP_ID_PK |      1 |    107 |    107 |\n|*  6 |    FILTER                       |               |      1 |        |      0 |\n|*  7 |     TABLE ACCESS BY INDEX ROWID | EMPLOYEES     |      0 |      1 |      0 |\n|*  8 |      INDEX UNIQUE SCAN          | EMP_EMP_ID_PK |      0 |      1 |      0 |\n------------------------------------------------------------------------------------\n\nOutline Data\n-------------\n\n  \/*+\n      BEGIN_OUTLINE_DATA\n      IGNORE_OPTIM_EMBEDDED_HINTS\n      OPTIMIZER_FEATURES_ENABLE('12.1.0.2')\n      DB_VERSION('12.1.0.2')\n      ALL_ROWS\n      OUTLINE_LEAF(@\"SEL$F5BB74E1\")\n      MERGE(@\"SEL$2\")\n      OUTLINE_LEAF(@\"SEL$F5BB74E1_1\")\n      USE_CONCAT(@\"SEL$F5BB74E1\" 8 OR_PREDICATES(4))\n      OUTLINE_LEAF(@\"SEL$F5BB74E1_2\")\n      OUTLINE(@\"SEL$1\")\n      OUTLINE(@\"SEL$2\")\n      OUTLINE(@\"SEL$F5BB74E1\")\n      MERGE(@\"SEL$2\")\n      INDEX(@\"SEL$F5BB74E1_1\" \"EMPLOYEES\"@\"SEL$2\" (\"EMPLOYEES\".\"EMPLOYEE_ID\"))\n      BATCH_TABLE_ACCESS_BY_ROWID(@\"SEL$F5BB74E1_1\" \"EMPLOYEES\"@\"SEL$2\")\n      INDEX_RS_ASC(@\"SEL$F5BB74E1_2\" \"EMPLOYEES\"@\"SEL$F5BB74E1_2\" (\"EMPLOYEES\".\"EMPLOYEE_ID\"))\n      END_OUTLINE_DATA\n  *\/\n\nPredicate Information (identified by operation id):\n---------------------------------------------------\n\n   3 - filter(:EMPLOYEE_ID IS NULL)\n   4 - filter((\"DEPARTMENT_ID\"=NVL(:DEPARTMENT_ID,\"DEPARTMENT_ID\") AND\n              \"MANAGER_ID\"=NVL(:MANAGER_ID,\"MANAGER_ID\") AND \"JOB_ID\"=NVL(:JOB_ID,\"JOB_ID\")))\n   5 - filter(\"EMPLOYEE_ID\" IS NOT NULL)\n   6 - filter(:EMPLOYEE_ID IS NOT NULL)\n   7 - filter((\"DEPARTMENT_ID\"=NVL(:DEPARTMENT_ID,\"DEPARTMENT_ID\") AND\n              \"MANAGER_ID\"=NVL(:MANAGER_ID,\"MANAGER_ID\") AND \"JOB_ID\"=NVL(:JOB_ID,\"JOB_ID\")))\n   8 - access(\"EMPLOYEE_ID\"=:EMPLOYEE_ID)\n\n<\/code><\/pre>\n<p>It&#8217;s the same plan as before. FULL SCAN in the index on EMPLOYEE_ID because the CBO estimates it&#8217;s the fastest way to get non null EMPLOYEE_ID.<\/p>\n<h3>query for one EMPLOYEE_ID<\/h3>\n<p>And now running the same query, but for a specific EMPLOYEE_ID<\/p>\n<pre><code>SQL&gt; exec :job_id:=null; :department_id:=null; :manager_id:=null; :employee_id:=0;\nPL\/SQL procedure successfully completed.\n<\/code><\/pre>\n<pre><code>SQL&gt; \/\n\n  COUNT(*)\n----------\n         0<\/code><\/pre>\n<p>A new cursor has been created for it:<\/p>\n<pre><code>SQL&gt; select * from table(dbms_xplan.display_cursor(format=&gt;'allstats last +outline'));\n\nPLAN_TABLE_OUTPUT\n------------------------------------------------------------------------------------\nSQL_ID  fhpytfwk0y4r3, child number 1\n-------------------------------------\nSELECT \/*+ BIND_AWARE *\/ COUNT(*) FROM   (SELECT 1   FROM employees\nWHERE (job_id = NVL(:job_id, job_id))   AND (department_id =\nNVL(:department_id, department_id))   AND (manager_id =\nNVL(:manager_id, manager_id))   AND (employee_id = NVL(:employee_id,\nemployee_id))   )\n\nPlan hash value: 1540312732\n\n-------------------------------------------------------------------------------\n| Id  | Operation                 | Name           | Starts | E-Rows | A-Rows |\n-------------------------------------------------------------------------------\n|   0 | SELECT STATEMENT          |                |      1 |        |      1 |\n|   1 |  SORT AGGREGATE           |                |      1 |      1 |      1 |\n|   2 |   CONCATENATION           |                |      1 |        |      0 |\n|*  3 |    FILTER                 |                |      1 |        |      0 |\n|*  4 |     TABLE ACCESS BY INDEX | EMPLOYEES      |      1 |      1 |      0 |\n|*  5 |      INDEX FULL SCAN      | EMP_MANAGER_IX |      1 |      1 |    106 |\n|*  6 |    FILTER                 |                |      1 |        |      0 |\n|*  7 |     TABLE ACCESS BY INDEX | EMPLOYEES      |      0 |      1 |      0 |\n|*  8 |      INDEX RANGE SCAN     | EMP_MANAGER_IX |      0 |      1 |      0 |\n-------------------------------------------------------------------------------\nPredicate Information (identified by operation id):\n---------------------------------------------------\n\n   3 - filter(:MANAGER_ID IS NULL)\n   4 - filter((\"EMPLOYEE_ID\"=NVL(:EMPLOYEE_ID,\"EMPLOYEE_ID\") AND\n              \"DEPARTMENT_ID\"=NVL(:DEPARTMENT_ID,\"DEPARTMENT_ID\") AND \"JOB_ID\"=NVL(:JOB_ID,\"JOB_ID\")))\n   5 - filter(\"MANAGER_ID\" IS NOT NULL)\n   6 - filter(:MANAGER_ID IS NOT NULL)\n   7 - filter((\"EMPLOYEE_ID\"=NVL(:EMPLOYEE_ID,\"EMPLOYEE_ID\") AND\n              \"DEPARTMENT_ID\"=NVL(:DEPARTMENT_ID,\"DEPARTMENT_ID\") AND \"JOB_ID\"=NVL(:JOB_ID,\"JOB_ID\")))\n   8 - access(\"MANAGER_ID\"=:MANAGER_ID)\n<\/code><\/pre>\n<p>Now, the optimizer has chosen to full scan the index on MANAGER_ID. Once again the goal is not check if it is the right choice or not. But the important point is that thanks to BIND_AWARE a new cursor has been created and the OR Expansion occured for another predicate:<\/p>\n<pre><code>Outline Data\n-------------\n\n  \/*+\n      BEGIN_OUTLINE_DATA\n      IGNORE_OPTIM_EMBEDDED_HINTS\n      OPTIMIZER_FEATURES_ENABLE('12.1.0.2')\n      DB_VERSION('12.1.0.2')\n      ALL_ROWS\n      OUTLINE_LEAF(@\"SEL$F5BB74E1\")\n      MERGE(@\"SEL$2\")\n      OUTLINE_LEAF(@\"SEL$F5BB74E1_1\")\n      USE_CONCAT(@\"SEL$F5BB74E1\" 8 OR_PREDICATES(3))\n      OUTLINE_LEAF(@\"SEL$F5BB74E1_2\")\n      OUTLINE(@\"SEL$1\")\n      OUTLINE(@\"SEL$2\")\n      OUTLINE(@\"SEL$F5BB74E1\")\n      MERGE(@\"SEL$2\")\n      INDEX(@\"SEL$F5BB74E1_1\" \"EMPLOYEES\"@\"SEL$2\" (\"EMPLOYEES\".\"MANAGER_ID\"))\n      BATCH_TABLE_ACCESS_BY_ROWID(@\"SEL$F5BB74E1_1\" \"EMPLOYEES\"@\"SEL$2\")\n      INDEX_RS_ASC(@\"SEL$F5BB74E1_2\" \"EMPLOYEES\"@\"SEL$F5BB74E1_2\" (\"EMPLOYEES\".\"MANAGER_ID\"))\n      BATCH_TABLE_ACCESS_BY_ROWID(@\"SEL$F5BB74E1_2\" \"EMPLOYEES\"@\"SEL$F5BB74E1_2\")\n      END_OUTLINE_DATA\n  *\/\n<\/code><\/pre>\n<p>From the outline hints we can see that the 3rd predicate has been chosen, which is the one on MANAGER_ID. Note that the OR_PREDICATE part of the USE_CONCAT is not documented, and can become complex to control when other transformations change the order of predicates.<\/p>\n<h3>All combinations<\/h3>\n<p>I&#8217;ve run it with all combinations and it seems that the OR Expansion occured for the 4 predicate possibilities:<\/p>\n<pre><code>SQL&gt; select distinct plan_table_output from table(dbms_xplan.display_cursor(sql_id=&gt;'fhpytfwk0y4r3',cursor_child_no=&gt;null,format=&gt;'basic +outline +peeked_binds')) where plan_table_output like '%USE_CONCAT%';\n\nPLAN_TABLE_OUTPUT\n--------------------------------------------------------------------------------\n      USE_CONCAT(@\"SEL$F5BB74E1\" 8 OR_PREDICATES(4))\n      USE_CONCAT(@\"SEL$F5BB74E1\" 8 OR_PREDICATES(2))\n      USE_CONCAT(@\"SEL$F5BB74E1\" 8 OR_PREDICATES(3))\n      USE_CONCAT(@\"SEL$F5BB74E1\" 8 OR_PREDICATES(1))\n<\/code><\/pre>\n<p>And I&#8217;ve several cursors:<\/p>\n<pre><code>SQL&gt; select child_number,predicate,range_id,low,high from v$sql_cs_selectivity where sql_id in ('a9taz8xhfu2kc','fhpytfwk0y4r3') order by sql_id,child_number;\n\nCHILD_NUMBER PREDICATE                                  RANGE_ID LOW        HIGH\n------------ ---------------------------------------- ---------- ---------- ----------\n           0 =EMPLOYEE_I                                       0 0.000000   0.000000\n           1 =MANAGER_ID                                       0 0.000000   0.000000\n           2 =DEPARTMENT                                       0 0.000000   0.000000\n           3 =JOB_ID                                           0 0.000000   0.000000\n           4 =EMPLOYEE_I                                       0 0.000000   0.005140\n<\/code><\/pre>\n<p>Is that sufficient? probably not. A dynamic query will probably find a better plan for a specific combination. But at least we have the possibility have several cursors and get a plan that has an efficient index access.<\/p>\n<p>You want more plans without having to do dynamic sampling? You can do that by changing any session parameter that causes an &#8216;optimizer mismatch&#8217;. For example, have a different one for each combination of fields that are null or not. Which optimizer parameter? It would be nice to have a dummy one so that it does not have any side effects. If you have an idea, please post.<\/p>\n<p>Of course there is this &#8220;_optimizer_random_plan&#8221; but do you want to play with an undocumented that has such a name? Maybe that will be for part III&#8230;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>By Franck Pachot . In the previous post I explained the performance issue encountered when using a generic query to deal with optional search criteria on multiple columns. The statement was shared by all executions, was marked as bind sensitive, but never became bind aware. Let&#8217;s use the BIND_AWARE hint. All binds null I assign [&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":[198,59],"tags":[96,67],"type_dbi":[],"class_list":["post-4390","post","type-post","status-publish","format-standard","hentry","category-database-management","category-oracle","tag-oracle","tag-performance"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.2 (Yoast SEO v27.5) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Generic query for multicriteria search - part II: BIND_AWARE (Adaptive Cursor Sharing) - dbi Blog<\/title>\n<meta name=\"description\" content=\"Is BIND_AWARE a solution for generic multicriteria queries?\" \/>\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\/generic-query-for-multicriteria-search-part-ii-bindaware-adaptive-cursor-sharing\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Generic query for multicriteria search - part II: BIND_AWARE (Adaptive Cursor Sharing)\" \/>\n<meta property=\"og:description\" content=\"Is BIND_AWARE a solution for generic multicriteria queries?\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/generic-query-for-multicriteria-search-part-ii-bindaware-adaptive-cursor-sharing\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2015-03-03T17:52:30+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=\"6 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\\\/generic-query-for-multicriteria-search-part-ii-bindaware-adaptive-cursor-sharing\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/generic-query-for-multicriteria-search-part-ii-bindaware-adaptive-cursor-sharing\\\/\"},\"author\":{\"name\":\"Oracle Team\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/66ab87129f2d357f09971bc7936a77ee\"},\"headline\":\"Generic query for multicriteria search &#8211; part II: BIND_AWARE (Adaptive Cursor Sharing)\",\"datePublished\":\"2015-03-03T17:52:30+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/generic-query-for-multicriteria-search-part-ii-bindaware-adaptive-cursor-sharing\\\/\"},\"wordCount\":418,\"commentCount\":0,\"keywords\":[\"Oracle\",\"Performance\"],\"articleSection\":[\"Database management\",\"Oracle\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/generic-query-for-multicriteria-search-part-ii-bindaware-adaptive-cursor-sharing\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/generic-query-for-multicriteria-search-part-ii-bindaware-adaptive-cursor-sharing\\\/\",\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/generic-query-for-multicriteria-search-part-ii-bindaware-adaptive-cursor-sharing\\\/\",\"name\":\"Generic query for multicriteria search - part II: BIND_AWARE (Adaptive Cursor Sharing) - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#website\"},\"datePublished\":\"2015-03-03T17:52:30+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/66ab87129f2d357f09971bc7936a77ee\"},\"description\":\"Is BIND_AWARE a solution for generic multicriteria queries?\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/generic-query-for-multicriteria-search-part-ii-bindaware-adaptive-cursor-sharing\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/generic-query-for-multicriteria-search-part-ii-bindaware-adaptive-cursor-sharing\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/generic-query-for-multicriteria-search-part-ii-bindaware-adaptive-cursor-sharing\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Generic query for multicriteria search &#8211; part II: BIND_AWARE (Adaptive Cursor Sharing)\"}]},{\"@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":"Generic query for multicriteria search - part II: BIND_AWARE (Adaptive Cursor Sharing) - dbi Blog","description":"Is BIND_AWARE a solution for generic multicriteria queries?","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\/generic-query-for-multicriteria-search-part-ii-bindaware-adaptive-cursor-sharing\/","og_locale":"en_US","og_type":"article","og_title":"Generic query for multicriteria search - part II: BIND_AWARE (Adaptive Cursor Sharing)","og_description":"Is BIND_AWARE a solution for generic multicriteria queries?","og_url":"https:\/\/www.dbi-services.com\/blog\/generic-query-for-multicriteria-search-part-ii-bindaware-adaptive-cursor-sharing\/","og_site_name":"dbi Blog","article_published_time":"2015-03-03T17:52:30+00:00","author":"Oracle Team","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Oracle Team","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dbi-services.com\/blog\/generic-query-for-multicriteria-search-part-ii-bindaware-adaptive-cursor-sharing\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/generic-query-for-multicriteria-search-part-ii-bindaware-adaptive-cursor-sharing\/"},"author":{"name":"Oracle Team","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/66ab87129f2d357f09971bc7936a77ee"},"headline":"Generic query for multicriteria search &#8211; part II: BIND_AWARE (Adaptive Cursor Sharing)","datePublished":"2015-03-03T17:52:30+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/generic-query-for-multicriteria-search-part-ii-bindaware-adaptive-cursor-sharing\/"},"wordCount":418,"commentCount":0,"keywords":["Oracle","Performance"],"articleSection":["Database management","Oracle"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/generic-query-for-multicriteria-search-part-ii-bindaware-adaptive-cursor-sharing\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/generic-query-for-multicriteria-search-part-ii-bindaware-adaptive-cursor-sharing\/","url":"https:\/\/www.dbi-services.com\/blog\/generic-query-for-multicriteria-search-part-ii-bindaware-adaptive-cursor-sharing\/","name":"Generic query for multicriteria search - part II: BIND_AWARE (Adaptive Cursor Sharing) - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"datePublished":"2015-03-03T17:52:30+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/66ab87129f2d357f09971bc7936a77ee"},"description":"Is BIND_AWARE a solution for generic multicriteria queries?","breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/generic-query-for-multicriteria-search-part-ii-bindaware-adaptive-cursor-sharing\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/generic-query-for-multicriteria-search-part-ii-bindaware-adaptive-cursor-sharing\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/generic-query-for-multicriteria-search-part-ii-bindaware-adaptive-cursor-sharing\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Generic query for multicriteria search &#8211; part II: BIND_AWARE (Adaptive Cursor Sharing)"}]},{"@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\/4390","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=4390"}],"version-history":[{"count":0,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/4390\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=4390"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=4390"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=4390"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=4390"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}