Thank you so much
rambabu konakanchi, April     08, 2016 - 3:46 am UTC
 
 
Thank you so much for the response and the help. 
 
Query Rewrites
Rajeshwaran Jeyabal, April     08, 2016 - 5:39 am UTC
 
 
Depends on 
1) How frequently the data changes on this table wsh_exceptions.
2) What fraction of data changes on this table.
3) The application nature surrounding this table.
We can think of having materialized view in place for query rewrites to make the count(*) to be faster.
rajesh@ORA12C> set autotrace on
rajesh@ORA12C> select count(*) from big_table ;
  COUNT(*)
----------
  10000000
1 row selected.
Execution Plan
----------------------------------------------------------
Plan hash value: 599409829
------------------------------------------------------------------------
| Id  | Operation          | Name      | Rows  | Cost (%CPU)| Time     |
------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |           |     1 | 41119   (1)| 00:00:02 |
|   1 |  SORT AGGREGATE    |           |     1 |            |          |
|   2 |   TABLE ACCESS FULL| BIG_TABLE |    10M| 41119   (1)| 00:00:02 |
------------------------------------------------------------------------
Statistics
----------------------------------------------------------
         72  recursive calls
          0  db block gets
     157026  consistent gets
     156920  physical reads
          0  redo size
        542  bytes sent via SQL*Net to client
        552  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          6  sorts (memory)
          0  sorts (disk)
          1  rows processed
rajesh@ORA12C> set autotrace off
rajesh@ORA12C>
rajesh@ORA12C> create materialized view big_table_mv
  2  build immediate
  3  refresh on commit
  4  enable query rewrite as
  5  select mod(object_id,3)+1 x, count(*)
  6  from big_table
  7  group by mod(object_id,3)+1 ;
Materialized view created.
rajesh@ORA12C> set autotrace on
rajesh@ORA12C> select count(*) from big_table;
  COUNT(*)
----------
  10000000
1 row selected.
Execution Plan
----------------------------------------------------------
Plan hash value: 2301198475
----------------------------------------------------------------------------------------------
| Id  | Operation                     | Name         | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT              |              |     1 |     6 |     3   (0)| 00:00:01 |
|   1 |  SORT AGGREGATE               |              |     1 |     6 |            |          |
|   2 |   MAT_VIEW REWRITE ACCESS FULL| BIG_TABLE_MV |     3 |    18 |     3   (0)| 00:00:01 |
----------------------------------------------------------------------------------------------
Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          3  consistent gets
          0  physical reads
          0  redo size
        542  bytes sent via SQL*Net to client
        552  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed
rajesh@ORA12C> set autotrace off
rajesh@ORA12C>But again not sure about logic behind having count(*) - are we going to do something like this?
begin 
  select count(*) into l_cnt from some_table;   
  if l_cnt > 0 then 
    process_data ;
  end if;
end;
/if that is the case, then count(*) would be the waste of resources, just process them rather than counting up. 
 
April     08, 2016 - 6:50 am UTC 
 
 
My first concern is:
For any table with the word "exceptions" in the name, how did it come to pass that there were 1billion to exceptions...to ...well...anything ?
That's an alarm bell right there. 
 
 
Just one concern
AK, July      29, 2016 - 6:33 pm UTC
 
 
I had a very bad experience using just parallel hint without the degree specified in the query hint. Unfortunately, DBA did not apply a limit on parallel degree at table level, since my query didnt had degree specified in the hint, it took a lot of performance hit on the whole DB and every one was screaming. After that experience, I wont suggest anyone to use parallel hint without specifying degree 
August    02, 2016 - 4:45 pm UTC 
 
 
 
 
Alternate to count(*)
Paul Baker, August    19, 2016 - 4:55 pm UTC
 
 
Thank for this helpful info.. If you do not need up to the minute counts an alternate method would be to use data from the all_tables view:
select TABLE_NAME, num_rows, last_analyzed from all_tables where owner = '{your owner}' order by NUM_ROWS desc; 
 
Another case
Pavel, November  28, 2018 - 12:54 pm UTC
 
 
Hello. We have another case.
We use ADF framework and it generates queryes like 'select count(1) from big_table'.
And we can't rewrite this query.
What can we do?  
November  29, 2018 - 12:49 am UTC 
 
 
 
 
David DUBOIS, November  29, 2018 - 11:07 am UTC
 
 
Hello Ram, You said "Do we have any better way to user select count(*) on these big tables?"
If you are using Oracle 12cr1 or later version, you can use the new function APPROX_COUNT_DISTINCT (col1) to go faster than count( distinct col1).
David