can I create index on a view or a materialized view ?

I have a query which does group by and is really slow. can I create a materialzed view on group by fields and create index on it ? an example would be helpful.

tech_questionAsked:
Who is Participating?

Improve company productivity with a Business Account.Sign Up

x
 
SujithConnect With a Mentor Data ArchitectCommented:
Yes you can have an index on MV.
See the example:

drop materialized view test_mv
/
create materialized view test_mv as
select table_name, count(1) no_of_cols
from user_tab_columns
group by table_name
/
create index test_mv_idx on test_mv( table_name )
/

see how the execution plan changes with an index:

SQL> set autotrace on;
SQL> select * from test_mv where table_name = 'TBL1';
 
TABLE_NAME                     NO_OF_COLS
------------------------------ ----------
TBL1                                    4
-- plan without index
 
Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=ALL_ROWS (Cost=3 Card=1 Bytes=30)
   1    0   MAT_VIEW ACCESS (FULL) OF 'TEST_MV' (MAT_VIEW) (Cost=3 Card=1 Bytes=30)
 
SQL> 
SQL> create index test_mv_idx on test_mv( table_name )
  2  /
 
Index created.
 
SQL> select * from test_mv where table_name = 'TBL1';
 
TABLE_NAME                     NO_OF_COLS
------------------------------ ----------
TBL1                                    4
 
-- plan with index
Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=ALL_ROWS (Cost=2 Card=1 Bytes=30)
   1    0   MAT_VIEW ACCESS (BY INDEX ROWID) OF 'TEST_MV' (MAT_VIEW) (Cost=2 Card=1 Bytes=30)
   2    1     INDEX (RANGE SCAN) OF 'TEST_MV_IDX' (INDEX) (Cost=1 Card=1)
 
SQL> 

Open in new window

0
 
tech_questionAuthor Commented:
will the indexes automatically get updated ?
0
 
SujithData ArchitectCommented:
Yes
0
Free Tool: SSL Checker

Scans your site and returns information about your SSL implementation and certificate. Helpful for debugging and validating your SSL configuration.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

 
DiscoNovaConnect With a Mentor Commented:
Just to comment; every time I've figured that I need a materialized view, I've been wrong. Furthermore, the MVs have usually caused me more trouble than they've ever proved to be worth of - after all; they were originally designed as items used for replication rather than "speeding up queries", which seems to be what too many people are trying to use them for :)

So... Are you absolutely certain you're trying to solve the correct problem? How about indexing the tables below the view to better accommodate for the query you're trying to perform on the view?

As an answer to the question - as you've already heard; I'd say sujith80... you can have indexes on materialized views, and the indexes will be automatically updated (along with the MVs, which is a different matter altogether; they don't necessarily do it automatically unless you tell them to (and as a warning, not all MVs can be set up to automatically update when the data below changes)).
0
 
DiscoNovaCommented:
I meant to write "I'd say sujith80 is correct"... wonder where the two words disappeared :)
0
 
tech_questionAuthor Commented:
Guys thanks for the feedback. I ended up not using an MV but using an ETL.
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.