views:

197

answers:

1

I have a table for about 100,000 users in it.

First Case:

explain select state, count(*) as cnt from users where state = 'ca'

when i do an explain plan for the above query i got the cost as 5200

Second Case:

Create or replace view vw_users as select state, count(*) as cnt from users

Explain select cnt from vw_users where state = 'ca'

when i do an explain plan on the second query i got the cost as 100,000.

How does the where clause in the view work ?? Is the where clause applied after the view retrieves all the rows. Please let know, how can i fix this issue. Thanks

+2  A: 

It's about the view algorithm that's been used.

The merge algorithm works well most table indexes and whatnot - the temptable algorithm doesn't - in many cases your indexes will just be flat-out not used at all.

And there's lots of crap that merge doesn't support

MERGE cannot be used if the view contains any of the following constructs:

* Aggregate functions (SUM(), MIN(), MAX(), COUNT(), and so forth)
* DISTINCT
* GROUP BY
* HAVING
* LIMIT
* UNION or UNION ALL
* Subquery in the select list
* Refers only to literal values (in this case, there is no underlying table)
Peter Bailey
Peter, Thanks for the input. I have a count(*) in my view. So i can't use merge. Right now i didn't specify any algorithm type.So the best way can be use a stored procedure instead of a view ?
vamsivanka
Yeah, you'll have to go for a stored procedure here - or just a straight-up subquery.
Peter Bailey
Peter, Thank you very much.
vamsivanka