title: Access and Filter predicates in Oracle execution plan
body: <p>What is the difference between Access and Filter predicates in Oracle execution plan?
  If I understand correctly, "access" is used to determine which data blocks need to be read, and "filter" is applied after the blocks are read. Hence, filtering is "evil".</p>
  
  <p>In the example of Predicate Information section of the execution plan below:</p>
  
  <pre><code>10 - access("DOMAIN_CODE"='BLCOLLSTS' AND "CURRENT_VERSION_IND"='Y')
       filter("CURRENT_VERSION_IND"='Y')
  </code></pre>
  
  <p>why "CURRENT_VERSION_IND" is repeated in both Access and Filter sections?</p>
  
  <p>The corresponding operation is INDEX RANGE scan on index, which is defined on fields (DOMAIN_CODE, CODE_VALUE, CURRENT_VERSION_IND, DECODE_DISPLAY).</p>
  
  <p>My guess is that because CURRENT_VERSION_IND is not the second column in the index, Oracle can't use it during the Access stage. Hence, it accesses index by DOMAIN_CODE column, fetches all the blocks, and then filters them by CURRENT_VERSION_IND. Am I right?</p>