Thread: Does Oracle store values in indices?

Does Oracle store values in indices?

From
Denis Perchine
Date:
Hello,

just small question.
I just realized that it seems that Oracle stores indexed values in the index 
itself. This mean that it is not necessary to access table when you need to 
get only indexed values.

iso table has an index for vin field. Here is an output for different queries.

SQL> explain plan for select * from iso where vin='dfgdfgdhf';
Explained.
SQL> @?/rdbms/admin/utlxpls
Plan Table
--------------------------------------------------------------------------------
| Operation                 |  Name    |  Rows | Bytes|  Cost  | Pstart| 
Pstop |
--------------------------------------------------------------------------------
| SELECT STATEMENT          |          |     6 |  402 |      8 |       |      |
|  TABLE ACCESS BY INDEX ROW|ISO       |     6 |  402 |      8 |       |      |
|   INDEX RANGE SCAN        |IX_ISO_VI |     6 |      |      3 |       |      |
--------------------------------------------------------------------------------
6 rows selected.
SQL> explain plan for select vin from iso where vin='dfgdfgdhf';
Explained.
SQL> @?/rdbms/admin/utlxpls
Plan Table
--------------------------------------------------------------------------------
| Operation                 |  Name    |  Rows | Bytes|  Cost  | Pstart| 
Pstop |
--------------------------------------------------------------------------------
| SELECT STATEMENT          |          |     6 |   42 |      3 |       |      |
|  INDEX RANGE SCAN         |IX_ISO_VI |     6 |   42 |      3 |       |      |
--------------------------------------------------------------------------------


I think this question already was raised here, but... Why PostgreSQL does not 
do this? What are the pros, and contros?

-- 
Sincerely Yours,
Denis Perchine

----------------------------------
E-Mail: dyp@perchine.com
HomePage: http://www.perchine.com/dyp/
FidoNet: 2:5000/120.5
----------------------------------


Re: Does Oracle store values in indices?

From
Tom Lane
Date:
Denis Perchine <dyp@perchine.com> writes:
> I think this question already was raised here, but... Why PostgreSQL
> does not do this? What are the pros, and contros?

The reason you have to visit the main table is that tuple validity
status is only stored in the main table, not in each index.  See prior
discussions in the archives.
        regards, tom lane


Re: Does Oracle store values in indices?

From
Denis Perchine
Date:
> Denis Perchine <dyp@perchine.com> writes:
> > I think this question already was raised here, but... Why PostgreSQL
> > does not do this? What are the pros, and contros?
>
> The reason you have to visit the main table is that tuple validity
> status is only stored in the main table, not in each index.  See prior
> discussions in the archives.

But how Oracle handles this?

-- 
Sincerely Yours,
Denis Perchine

----------------------------------
E-Mail: dyp@perchine.com
HomePage: http://www.perchine.com/dyp/
FidoNet: 2:5000/120.5
----------------------------------


RE: Does Oracle store values in indices?

From
"Mikheev, Vadim"
Date:
> > The reason you have to visit the main table is that tuple validity
> > status is only stored in the main table, not in each index. 
> > See prior discussions in the archives.
> 
> But how Oracle handles this?

Oracle doesn't have non-overwriting storage manager but uses
rollback segments to maintain MVCC. Rollback segments are used
to restore valid version of entire index/table page.

Vadim


Re: Does Oracle store values in indices?

From
Denis Perchine
Date:
> > > The reason you have to visit the main table is that tuple validity
> > > status is only stored in the main table, not in each index.
> > > See prior discussions in the archives.
> >
> > But how Oracle handles this?
>
> Oracle doesn't have non-overwriting storage manager but uses
> rollback segments to maintain MVCC. Rollback segments are used
> to restore valid version of entire index/table page.

Are there any plans to have something like this? I mean overwriting storage 
manager.

-- 
Sincerely Yours,
Denis Perchine

----------------------------------
E-Mail: dyp@perchine.com
HomePage: http://www.perchine.com/dyp/
FidoNet: 2:5000/120.5
----------------------------------


Re: Does Oracle store values in indices?

From
Bruce Momjian
Date:
[ Charset KOI8-R unsupported, converting... ]
> > > > The reason you have to visit the main table is that tuple validity
> > > > status is only stored in the main table, not in each index.
> > > > See prior discussions in the archives.
> > >
> > > But how Oracle handles this?
> >
> > Oracle doesn't have non-overwriting storage manager but uses
> > rollback segments to maintain MVCC. Rollback segments are used
> > to restore valid version of entire index/table page.
> 
> Are there any plans to have something like this? I mean overwriting storage 
> manager.

We hope to have it some day, hopefully soon.

--  Bruce Momjian                        |  http://candle.pha.pa.us pgman@candle.pha.pa.us               |  (610)
853-3000+  If your life is a hard drive,     |  830 Blythe Avenue +  Christ can be your backup.        |  Drexel Hill,
Pennsylvania19026
 


Re: Does Oracle store values in indices?

From
Alfred Perlstein
Date:
* Bruce Momjian <pgman@candle.pha.pa.us> [010123 11:17] wrote:
> [ Charset KOI8-R unsupported, converting... ]
> > > > > The reason you have to visit the main table is that tuple validity
> > > > > status is only stored in the main table, not in each index.
> > > > > See prior discussions in the archives.
> > > >
> > > > But how Oracle handles this?
> > >
> > > Oracle doesn't have non-overwriting storage manager but uses
> > > rollback segments to maintain MVCC. Rollback segments are used
> > > to restore valid version of entire index/table page.
> > 
> > Are there any plans to have something like this? I mean overwriting storage 
> > manager.
> 
> We hope to have it some day, hopefully soon.

Vadim says that he hopes it to be done by 7.2, so if things go
well it shouldn't be that far off...

-- 
-Alfred Perlstein - [bright@wintelcom.net|alfred@freebsd.org]
"I have the heart of a child; I keep it in a jar on my desk."


RE: Does Oracle store values in indices?

From
"Mikheev, Vadim"
Date:
> > > But how Oracle handles this?
> >
> > Oracle doesn't have non-overwriting storage manager but uses
> > rollback segments to maintain MVCC. Rollback segments are used
> > to restore valid version of entire index/table page.
> 
> Are there any plans to have something like this? I mean 
> overwriting storage manager.

Well, I have plans to reimplement storage manager to allow space
re-use without vacuum but without switching to overwriting, at least
in near future - achievements/drawbacks are still questionable.

We could add transaction data to index tuples but this would increase
their size by ~ 16bytes. To estimate how this would affect performance
for mostly statical tables one can run tests with schema below:

create table i1 (i int, k int, l char(16));
create index i_i1 on i1 (i);
create table i2 (i int, k int, l char(16));
create index i_i2 on i2 (i, k, l);

Now fill tables with same data and run queries using only "I" in where
clause.

Vadim


Re: Does Oracle store values in indices?

From
Tom Lane
Date:
"Mikheev, Vadim" <vmikheev@SECTORBASE.COM> writes:
> We could add transaction data to index tuples but this would increase
> their size by ~ 16bytes.

The increased space is the least of the drawbacks.  Consider also the
time needed to maintain N copies of a tuple's commit status instead of
one.  Even finding the N copies would cost a lot more than the single
disk transfer involved now ...
        regards, tom lane