Why Logical reads are high
Because the database has to run additional recursive queries the first time it encounters a query, to parse it. It has to check if the given SQL is valid, it has to check the optimizer statistics, etc.

SQL&gt; alter system flush shared_pool;

System altered.

SQL&gt; alter session set statistics_level=all;

Session altered.

SQL&gt; select count(*) from hr.employees;

  COUNT(*)
----------
       107

SQL&gt; select * from table(dbms_xplan.display_cursor(format=&gt;'allstats last'));

PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------------------
SQL_ID  3ghpkw4yp4dzm, child number 0
-------------------------------------
select count(*) from hr.employees

Plan hash value: 3580537945

-------------------------------------------------------------------------------------------
| Id  | Operation        | Name         | Starts | E-Rows | A-Rows |   A-Time   | Buffers |
-------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT |              |      1 |        |      1 |00:00:00.01 |       1 |
|   1 |  SORT AGGREGATE  |              |      1 |      1 |      1 |00:00:00.01 |       1 |
|   2 |   INDEX FULL SCAN| EMP_EMAIL_UK |      1 |    107 |    107 |00:00:00.01 |       1 |
-------------------------------------------------------------------------------------------


14 rows selected.

SQL&gt; select buffer_gets, executions from v$sql where sql_id = '3ghpkw4yp4dzm';

BUFFER_GETS EXECUTIONS
----------- ----------
        220          1


We can clearly see from the plan statistics that it required a single buffer get, yet V$SQL shows 220. But now the query is parsed, if I run it again, buffer gets are increased only by the amount the query really uses:

SQL&gt; select count(*) from hr.employees;

  COUNT(*)
----------
       107

SQL&gt; select count(*) from hr.employees;

  COUNT(*)
----------
       107

SQL&gt; select buffer_gets, executions from v$sql where sql_id = '3ghpkw4yp4dzm';

BUFFER_GETS EXECUTIONS
----------- ----------
        222          3


If you are interested what additional SQLs the database executes when parsing the query, you can enable SQL tracing and view the trace file:

SQL&gt; select tracefile from v$process where addr = 
     (select paddr from v$session where sid = sys_context('userenv', 'sid'));

TRACEFILE
-------------------------------------------------------------
/u01/app/oracle/diag/rdbms/ss18/SS18/trace/SS18_ora_14811.trc

SQL&gt; alter system flush shared_pool;

System altered.

SQL&gt; exec dbms_session.session_trace_enable(true, true);

PL/SQL procedure successfully completed.

SQL&gt; -- run your query here, then view the trace file