Oracle FAQ Your Portal to the Oracle Knowledge Grid
HOME | ASK QUESTION | ADD INFO | SEARCH | E-MAIL US
 

Home -> Community -> Usenet -> c.d.o.server -> Re: GROUP BY

Re: GROUP BY

From: Mario <mario.simic_at_in2.tel.hr>
Date: 1997/08/31
Message-ID: <01bcb65a$21233a80$a0e11dc3@marios>#1/1

TurkBear <jvgreco_at_nospamprimenet.com> wrote in article <33fd4766.167435399_at_news.primenet.com>...
> Tansel Ozkan <tansel_at_openix.com> wrote:
>
> >Hello Oracle gurus,
> >
> >My question is as follows:
> >
> >I have a huge table with 10,000,000 records. And we are frequently
> >running a query with a GROUP BY statement. Would an index on the grouped
> >columns improve the performance? It seems to me that there is not really
> >any need for an index since the best algorithm for such a query would
> >have to do a full-table scan and increment the appropriate counters.
> >
> >the SQL statement is :
> >
> >select mar_status, apr_status , count(*)
> >from master_table
> >group by mar_status, apr_status;
> >
> >If only subset of the records are needed by specifying a where clause as
> >shown in the SQL statement below and one of the filters is the grouped
> >column, would that make a difference?
> >
> >select mar_status, apr_status , count(*)
> >from master_table
> >where mar_status in ('1','2')
> >group by mar_status, apr_status;
> >
> >
> >Thanks and have a crash free day...
> >
> >Tansel
>
> I would index the group by columns and also one to be used in the
> count statement, i.e. count(indexed_col) - this should be more
> effecient.
>
> John Greco
>

No, it wouldn't. In both cases, with or without indexes, full table scan will
be performed.
If only subset of records is needed then you should index mar_status column and try to avoid using "in" in where clause. Depending on your data in mar_status column you should try

select mar_status, apr_status , count(*) from master_table
where mar_status < '2'
group by mar_status, apr_status;

or

select mar_status, apr_status , count(*) from master_table
where mar_status between '1' and '2'
group by mar_status, apr_status;

or

select '1', apr_status , count(*)
from master_table
where mar_status = '1'
group by mar_status, apr_status
union
select '2', apr_status , count(*)
from master_table
where mar_status = '2'
group by mar_status, apr_status;

Mario Simic
IN2 d.o.o.
Zagreb, Croatia Received on Sun Aug 31 1997 - 00:00:00 CDT

Original text of this message

HOME | ASK QUESTION | ADD INFO | SEARCH | E-MAIL US