David makes good points. I personally don't like SELECT count(1) from MYTABLE; because it makes the meaning unclear. What does "1" have to do with what you are trying to achieve? Nothing. Are you trying to count how many 1's are in your table? Of course not.
If "SELECT count(1)" means something, what does "SELECT count(2)" mean? How about SELECT count ('x')? By using 1 instead of *, all you have done is taken a well defined operator '*' and replaced it with something that is obscure and confusing. Regards, Mike On Fri, Jun 12, 2009 at 6:10 AM, ddf <orat...@msn.com> wrote: > > > > On Jun 12, 4:37 am, sonty <saurabh.zen...@gmail.com> wrote: > > I would say > > > > select count(1) from yourtablename; > > > > BR, > > Sonty > > > > On Jun 10, 9:15 pm, Michael Moore <michaeljmo...@gmail.com> wrote: > > > > > > > > > select count(*) from yourtablename; > > > > > regards, > > > Mike > > > > > On Wed, Jun 10, 2009 at 8:51 AM, Michael Lam < > michael.y....@hotmail.com>wrote: > > > > > > Hi all, > > > > > > I am kinda new to Oracle. So, really appreicate your help! > > > > > > I wonder what's the best way to retrieve the total number of record > of > > > > a table. I googled it for a while and someone mentioned that it was > > > > discussed in google group before. Would you mind if you can give me > > > > direction regarding this please? > > > > > > thanks > > > > Michael- Hide quoted text - > > > > > - Show quoted text -- Hide quoted text - > > > > - Show quoted text - > > Using count(1) is no better than using count(*): > > SQL> select count(*) > 2 from dbaobjs; > > COUNT(*) > ---------- > 69226 > > > Execution Plan > ---------------------------------------------------------- > Plan hash value: 708967174 > > ---------------------------------------------------------------------- > | Id | Operation | Name | Rows | Cost (%CPU)| Time | > ---------------------------------------------------------------------- > | 0 | SELECT STATEMENT | | 1 | 286 (1)| 00:00:04 | > | 1 | SORT AGGREGATE | | 1 | | | > | 2 | TABLE ACCESS FULL| DBAOBJS | 69226 | 286 (1)| 00:00:04 | > ---------------------------------------------------------------------- > > > Statistics > ---------------------------------------------------------- > 287 recursive calls > 0 db block gets > 1067 consistent gets > 1024 physical reads > 0 redo size > 420 bytes sent via SQL*Net to client > 416 bytes received via SQL*Net from client > 2 SQL*Net roundtrips to/from client > 6 sorts (memory) > 0 sorts (disk) > 1 rows processed > > SQL> alter system flush shared_pool; > > System altered. > > SQL> select count(1) > 2 from dbaobjs > 3 / > > COUNT(1) > ---------- > 69226 > > > Execution Plan > ---------------------------------------------------------- > Plan hash value: 708967174 > > ---------------------------------------------------------------------- > | Id | Operation | Name | Rows | Cost (%CPU)| Time | > ---------------------------------------------------------------------- > | 0 | SELECT STATEMENT | | 1 | 286 (1)| 00:00:04 | > | 1 | SORT AGGREGATE | | 1 | | | > | 2 | TABLE ACCESS FULL| DBAOBJS | 69226 | 286 (1)| 00:00:04 | > ---------------------------------------------------------------------- > > > Statistics > ---------------------------------------------------------- > 293 recursive calls > 0 db block gets > 1067 consistent gets > 0 physical reads > 0 redo size > 420 bytes sent via SQL*Net to client > 416 bytes received via SQL*Net from client > 2 SQL*Net roundtrips to/from client > 6 sorts (memory) > 0 sorts (disk) > 1 rows processed > > SQL> > > Yet another device, which is no more efficient, is to select the max > (rownum) from the desired table: > > SQL> select max(rownum) > 2 from dbaobjs; > > MAX(ROWNUM) > ----------- > 69226 > > > Execution Plan > ---------------------------------------------------------- > Plan hash value: 4046134655 > > ----------------------------------------------------------------------- > | Id | Operation | Name | Rows | Cost (%CPU)| Time > | > ----------------------------------------------------------------------- > | 0 | SELECT STATEMENT | | 1 | 286 (1)| 00:00:04 > | > | 1 | SORT AGGREGATE | | 1 | | > | > | 2 | COUNT | | | | > | > | 3 | TABLE ACCESS FULL| DBAOBJS | 69226 | 286 (1)| 00:00:04 > | > ----------------------------------------------------------------------- > > > Statistics > ---------------------------------------------------------- > 293 recursive calls > 0 db block gets > 1067 consistent gets > 0 physical reads > 0 redo size > 423 bytes sent via SQL*Net to client > 416 bytes received via SQL*Net from client > 2 SQL*Net roundtrips to/from client > 6 sorts (memory) > 0 sorts (disk) > 1 rows processed > > SQL> > > Of course, if statistics are current and one doesn't mind a possibly > inexact number there is always the option of querying USER_TABLES (but > in terms of recursive calls using count() is more efficient): > > SQL> select table_name, num_rows > 2 from user_tables > 3 where table_name = 'DBAOBJS' > 4 / > > TABLE_NAME NUM_ROWS > ------------------------------ ---------- > DBAOBJS 69226 > > > Execution Plan > ---------------------------------------------------------- > Plan hash value: 2777635855 > > > ------------------------------------------------------------------------------------------------------ > | Id | Operation | Name | Rows | > Bytes | Cost (%CPU)| Time | > > ------------------------------------------------------------------------------------------------------ > | 0 | SELECT STATEMENT | | 1 > | 131 | 10 (10)| 00:00:01 | > | 1 | NESTED LOOPS OUTER | | 1 > | 131 | 10 (10)| 00:00:01 | > | 2 | NESTED LOOPS OUTER | | 1 > | 127 | 9 (12)| 00:00:01 | > | 3 | NESTED LOOPS OUTER | | 1 > | 119 | 8 (13)| 00:00:01 | > | 4 | NESTED LOOPS OUTER | | 1 > | 114 | 7 (15)| 00:00:01 | > | 5 | NESTED LOOPS | | 1 > | 103 | 6 (17)| 00:00:01 | > | 6 | NESTED LOOPS | | 1 > | 100 | 5 (20)| 00:00:01 | > | 7 | MERGE JOIN CARTESIAN | | 1 > | 67 | 4 (25)| 00:00:01 | > |* 8 | HASH JOIN | | 1 > | 31 | 1 (100)| 00:00:01 | > |* 9 | FIXED TABLE FULL | X$KSPPI | 1 > | 27 | 0 (0)| 00:00:01 | > | 10 | FIXED TABLE FULL | X$KSPPCV | 1915 > | 7660 | 0 (0)| 00:00:01 | > | 11 | BUFFER SORT | | 1 > | 36 | 4 (25)| 00:00:01 | > |* 12 | TABLE ACCESS BY INDEX ROWID| OBJ$ | 1 > | 36 | 3 (0)| 00:00:01 | > |* 13 | INDEX RANGE SCAN | I_OBJ2 | 1 > | | 2 (0)| 00:00:01 | > |* 14 | TABLE ACCESS CLUSTER | TAB$ | 1 > | 33 | 1 (0)| 00:00:01 | > |* 15 | INDEX UNIQUE SCAN | I_OBJ# | 1 > | | 0 (0)| 00:00:01 | > | 16 | TABLE ACCESS CLUSTER | TS$ | 1 > | 3 | 1 (0)| 00:00:01 | > |* 17 | INDEX UNIQUE SCAN | I_TS# | 1 > | | 0 (0)| 00:00:01 | > | 18 | TABLE ACCESS CLUSTER | SEG$ | 1 > | 11 | 1 (0)| 00:00:01 | > |* 19 | INDEX UNIQUE SCAN | I_FILE#_BLOCK# | 1 > | | 0 (0)| 00:00:01 | > |* 20 | INDEX RANGE SCAN | I_OBJ1 | 1 > | 5 | 1 (0)| 00:00:01 | > |* 21 | INDEX RANGE SCAN | I_OBJ1 | 1 > | 8 | 1 (0)| 00:00:01 | > |* 22 | INDEX RANGE SCAN | I_USER2 | 1 > | 4 | 1 (0)| 00:00:01 | > > ------------------------------------------------------------------------------------------------------ > > Predicate Information (identified by operation id): > --------------------------------------------------- > > 8 - access("KSPPI"."INDX"="KSPPCV"."INDX") > 9 - filter("KSPPI"."KSPPINM"='_dml_monitoring_enabled') > 12 - filter(BITAND("O"."FLAGS",128)=0) > 13 - access("O"."OWNER#"=USERENV('SCHEMAID') AND > "O"."NAME"='DBAOBJS') > 14 - filter(BITAND("T"."PROPERTY",1)=0) > 15 - access("O"."OBJ#"="T"."OBJ#") > 17 - access("T"."TS#"="TS"."TS#") > 19 - access("T"."TS#"="S"."TS#"(+) AND "T"."FILE#"="S"."FILE#"(+) > AND > "T"."BLOCK#"="S"."BLOCK#"(+)) > 20 - access("T"."BOBJ#"="CO"."OBJ#"(+)) > 21 - access("T"."DATAOBJ#"="CX"."OBJ#"(+)) > 22 - access("CX"."OWNER#"="CU"."USER#"(+)) > > > Statistics > ---------------------------------------------------------- > 721 recursive calls > 0 db block gets > 220 consistent gets > 0 physical reads > 0 redo size > 488 bytes sent via SQL*Net to client > 416 bytes received via SQL*Net from client > 2 SQL*Net roundtrips to/from client > 37 sorts (memory) > 0 sorts (disk) > 1 rows processed > > SQL> > > Of course all of that is moot if someone in another session is > deleting all of the data from the desired table and hasn't yet issued > a commit. There's more to this discussion here: > > http://oratips-ddf.blogspot.com/2008/10/is-anybody-there.html > > > > David Fitzjarrell > > > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Oracle PL/SQL" group. To post to this group, send email to Oracle-PLSQL@googlegroups.com To unsubscribe from this group, send email to oracle-plsql-unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/Oracle-PLSQL?hl=en -~----------~----~----~----~------~----~------~--~---