473,789 Members | 2,740 Online
Bytes | Software Development & Data Engineering Community
+ Post

Home Posts Topics Members FAQ

Why isn't ALLOW REVERSE SCANS the default?

Why isn't ALLOW REVERSE SCANS the default?
Why do we have to
- drop PK
- create an index
- recreate PK
What are the advantages of indexes that do not allow reverse scans?

Nov 12 '05 #1
14 14816
fo************@ yahoo.com wrote:
Why isn't ALLOW REVERSE SCANS the default?
Why do we have to
- drop PK
- create an index
- recreate PK
What are the advantages of indexes that do not allow reverse scans?

What a great idea... may be it will in a "future release" ;-)

Cheers
Serge
Nov 12 '05 #2
Ian
fo************@ yahoo.com wrote:
Why isn't ALLOW REVERSE SCANS the default?
Why do we have to
- drop PK
- create an index
- recreate PK
What are the advantages of indexes that do not allow reverse scans?


This is legacy, i.e. index creation did (does) not allow reverse
scans... This feature was added at some point (I think 5.2), but
was not the default likely because of the extra overhead required
for reverse scans (i.e. each page must store a pointer to the previous
page as well and the next page in the index).

Nov 12 '05 #3
On 2004-12-13, Serge Rielau scribbled:
fo************ @yahoo.com wrote:
Why isn't ALLOW REVERSE SCANS the default?
Why do we have to
- drop PK
- create an index
- recreate PK
What are the advantages of indexes that do not allow reverse scans?

What a great idea... may be it will in a "future release" ;-)


From the DB2 Administration Performance Guide:

"At the leaf node level there *can* be previous leaf pointers. This can
be of great benefit since once finding a particular key value in the
index by traversing the tree, the Index Manager can scan through the
leaf nodes in either direction to retrieve a range of values. This
ability to scan in either direction is only possible if the index was
created using the ALLOW REVERSE SCANS parameter."

I note that it says "can be" as opposed to "are". I may be
misinterpreting this, but I assume this means that these previous leaf
pointers do not exist if ALLOW REVERSE SCANS is not used? Presumably
that would make the index slightly smaller on disk, and therefore
slightly faster to access / update.

That said, I suspect any performance hit is either non-existant or
negligable. Otherwise, I would expect to find some warning about
potentially lower performance when using ALLOW REVERSE SCANS somewhere
in the manuals (and I can't).

In conclusion: you've got my vote for the suggestion!

In the meantime, it is possible to create an index for a primary key
which has ALLOW REVERSE SCANS without dropping the PK by pre-defining
an index for the primary key at table creation time. For example:

CREATE TABLE COUNTRIES (
ISO_CODE CHAR(2) NOT NULL,
NAME VARCHAR(64) NOT NULL
);

CREATE UNIQUE INDEX COUNTRIES_PK
ON COUNTRIES (ISO_CODE)
ALLOW REVERSE SCANS;

ALTER TABLE COUNTRIES
ADD CONSTRAINT PK PRIMARY KEY (ISO_CODE);

In other words: create the table without a primary key, define a unique
index with ALLOW REVERSE SCANS to serve as the primary key's index,
then use an ALTER TABLE statement to create the actual primary key
constraint. DB2 will notice that a unique index with the same columns
as the primary key constraint already exists, and will issue a warning
message that it is using an existing index to implement the primary key
(I'm not sure why a warning is issued as it's perfectly harmless and
what I intended to do all along!)

Anyway, the other advantage of this approach is that you can include
all sorts of other options in the index definition. I commonly used
INCLUDE (to take advantage of index-only access) and sometimes CLUSTER
in this way, for example:

CREATE UNIQUE INDEX COUNTRIES_PK
ON COUNTRIES (ISO_CODE)
INCLUDE (NAME)
ALLOW REVERSE SCANS;

The only downside to all this is that your SQL becomes rather more DB2
specific, though that may not be a concern depending on your situation.

HTH, Dave.
--
Cogito cogito ergo cogito sum
-- Ambrose Bierce
Nov 12 '05 #4
Serge, let me re-word the original poster's question:

Are there any advantages of using "indexes that do not allow reverse
scans?"

Nov 12 '05 #5
Dave,

"I note that it says "can be" as opposed to "are". I may be
misinterpreting this, but I assume this means that these previous leaf
pointers do not exist if ALLOW REVERSE SCANS is not used"

you can see for yourself, just compare execution plans for

SELECT MIN (ISO_CODE) FROM COUNTRIES
@
SELECT MAX (ISO_CODE) FROM COUNTRIES
@

do you see the difference?

Nov 12 '05 #6
On 2004-12-14, ak************@ yahoo.com scribbled:
Dave,

"I note that it says "can be" as opposed to "are". I may be
misinterpretin g this, but I assume this means that these previous leaf
pointers do not exist if ALLOW REVERSE SCANS is not used"

you can see for yourself, just compare execution plans for

SELECT MIN (ISO_CODE) FROM COUNTRIES
@
SELECT MAX (ISO_CODE) FROM COUNTRIES
@

do you see the difference?
I see that, when the index has ALLOW REVERSE SCANS, a reverse scan is
used on the second query. I also see that, when not using ALLOW REVERSE
SCANS, the access plan does not use a reverse scan (because it can't)
but uses a forward index scan in the case of both queries. But then,
this is pretty much what I'd expect to see.

An index scan in either direction is sufficient to answer both queries
(only one value is required for the answer in each case, and it doesn't
matter which direction we scan the index to obtain it).

However, when comparing the access plans for:

SELECT ISO_CODE FROM COUNTRIES ORDER BY ISO_CODE ASC

SELECT ISO_CODE FROM COUNTRIES ORDER BY ISO_CODE DESC

there is a significant difference between using ALLOW REVERSE SCANS and
not. When not using ALLOW REVERSE SCANS on the index, the optimizer
still uses an index scan on the second query, but generates a temporary
table from the result of that scan, then performs a reverse table-scan
on that temporary table.

Anyway, in terms of your re-wording of the OP's question:
Serge, let me re-word the original poster's question:

Are there any advantages of using "indexes that do not allow reverse
scans?"


I think the technical questions related to this (which I was attempting
to raise with my comment about the note in the manual -- sorry I was a
bit vague about that :-) are as follows:

1. Is the space for previous leaf pointers *always* reserved in indexes
regardless of whether ALLOW REVERSE SCANS is used (in which case it
would make no difference to the physical size of the index on disk)?

2. Is maintenance of the previous leaf pointers a significant cost? In
other words, when a new index leaf is committed, the database now has
to fill in two pointer fields, one to the next leaf, one to the prior.
Does this significantly impact the amount of work involved in
maintaining the index?

I think the second question is the important one. I suspect the answer
is "No", because otherwise I would expect to see warnings in the
documentation about indexes with ALLOW REVERSE SCANS taking longer to
update/maintain.

Any thoughts or ideas about how to find out? Maybe a test script which
times an import of a few million rows into tables with and without
ALLOW REVERSE SCANS on their indexes?

Dave.
--
Cogito cogito ergo cogito sum
-- Ambrose Bierce
Nov 12 '05 #7
>An index scan in either direction is sufficient to answer both queries
(only one value is required for the answer in each case, and it doesn'tmatter which direction we scan the index to obtain it).


if you SELECT MAX(PK) FROM SALES rather then from COUNTRIES, and SALES
has 10,000,000 rows, it does matter very much - traversing the whole
index will take considerable time

Nov 12 '05 #8
ak************@ yahoo.com wrote:
Serge, let me re-word the original poster's question:

Are there any advantages of using "indexes that do not allow reverse
scans?"

I'm told that there is a potential for deadlocks if a update or delete
operations scan the index in the opposite direction as a competing
operation which keeps anything stronger than shares row locks.
To counteract that the optimizer favors forward scans.
Apparently the memory cost of reverse indexes is not considered
significant enough to matter.

Cheers
Serge
Nov 12 '05 #9
On 2004-12-14, ak************@ yahoo.com scribbled:
An index scan in either direction is sufficient to answer both
queries (only one value is required for the answer in each case,
and it

doesn't
matter which direction we scan the index to obtain it).


if you SELECT MAX(PK) FROM SALES rather then from COUNTRIES, and SALES
has 10,000,000 rows, it does matter very much - traversing the whole
index will take considerable time


Yes, that's true. The access plan wouldn't (shouldn't?) differ though
the time taken to execute it most certainly would. So, we both agree
there are considerable advantages to using ALLOW REVERSE SCANS. To the
other side of the question, are there any disadvantages?

Personally, I use ALLOW REVERSE SCANS on every index in my databases,
under the assumption that the benefits to the optimizer far outweigh
any performance hit from the extra maintenance (I assume) they require.
Though in the absence of any hard data regarding such maintenance, this
is more of a guess on my part. Any thoughts?
Dave.
--
Cogito cogito ergo cogito sum
-- Ambrose Bierce
Nov 12 '05 #10

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

0
3132
by: Carlos Ibarra | last post by:
In various places I have seen mentioned the importance of indexing foreign keys to avoid table locks on the child table on parent update/delete and full table scans when the constraint has action ON DELETE CASCADE. For example, see http://asktom.oracle.com/pls/ask/f?p=4950:8:10827638093976934265::NO::F4950_P8_DISPLAYID,F4950_P8_CRITERIA:292016138754, However, if I have no index on the FKs, the only mention of full table scans on the...
2
1419
by: Greg Stark | last post by:
Hm, here's a query where the optimizer is choosing the wrong plan by far. I think it boils down to it guessing wrong on how selective an rtree index is, which I guess would be hard to predict. Except if it guesses wrong by assuming it isn't selective it would be maybe 50% slower doing lots of index lookups instead of a more efficient full table scan and join. If it guesses wrong by assuming it'll be very selective as it is in this case...
6
6465
by: Zri Man | last post by:
I'm relatively new to DB2 and was reasonably amused to see the REVERSE SCAN availability for Indexes. My assumptions are as follows: DB2/UDB uses B-Tree for indexing by default and is likely the main offering for Indexing within the DB. Reverse Scans could possibly only happen on the the leaf node of the index
11
11946
by: tlyczko | last post by:
Hello Rob B posted this wonderful code in another thread, http://groups.google.com/group/comp.lang.javascript/browse_thread/thread/c84d8538025980dd/6ead9d5e61be85f0#6ead9d5e61be85f0 I could not figure out how to reply to the thread per se using Google Groups and so please forgive me for cutting and pasting (I emailed him but he may not have time to check his email), and I am hoping someone might be able to tell me how I can change this...
7
2215
by: teddysnips | last post by:
Table DDL below: The tables I have contain Timesheet information. Each row in the tblTSCollected table contains an entry for an employee into the timesheet system, specifically by scanning the barcode on their badge. A whole bunch of business logic periodically attempts to "pair" these into logically matched scans. For example, some employees will scan in and out of a single place of work. For these there will be a row written to...
15
2353
by: Claudio Grondi | last post by:
Let's consider a test source code given at the very end of this posting. The question is if Python allows somehow access to the bytes of the representation of a long integer or integer in computers memory? Or does Python hide such implementation details that deep, that there is no way to get down to them? The test code below shows, that extracting bits from an integer value n is faster when using n&0x01 than when using n%2 and I...
0
1059
by: NEW2DB2 | last post by:
Does the optimizer create a temporay table for the index that allows reverse scans ?
1
2505
by: BD | last post by:
Hey, all. Subject line says it all. But for background: I'm developing on UDB for Windows. The production application is on z/ OS. I'm using some Quest tools (SQL Optimizer) to review some queries, and
1
1357
by: lovelyasha | last post by:
i'm trying to print the children of a process backwards, but once i exit the for loop the children are getting printed as 0 for(i = 0; i < counter; i++) { switch(pid = fork()) { case -1: perror("Could not fork\n"); exit(1);
0
9666
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However, people are often confused as to whether an ONU can Work As a Router. In this blog post, we’ll explore What is ONU, What Is Router, ONU & Router’s main usage, and What is the difference between ONU and Router. Let’s take a closer look ! Part I. Meaning of...
1
10142
by: Hystou | last post by:
Overview: Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows Update option using the Control Panel or Settings app; it automatically checks for updates and installs any it finds, whether you like it or not. For most users, this new feature is actually very convenient. If you want to control the update process,...
1
7529
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome a new presenter, Adolph Dupré who will be discussing some powerful techniques for using class modules. He will explain when you may want to use classes instead of User Defined Types (UDT). For example, to manage the data in unbound forms. Adolph will...
0
6769
by: conductexam | last post by:
I have .net C# application in which I am extracting data from word file and save it in database particularly. To store word all data as it is I am converting the whole word file firstly in HTML and then checking html paragraph one by one. At the time of converting from word file to html my equations which are in the word document file was convert into image. Globals.ThisAddIn.Application.ActiveDocument.Select();...
0
5422
by: TSSRALBI | last post by:
Hello I'm a network technician in training and I need your help. I am currently learning how to create and manage the different types of VPNs and I have a question about LAN-to-LAN VPNs. The last exercise I practiced was to create a LAN-to-LAN VPN between two Pfsense firewalls, by using IPSEC protocols. I succeeded, with both firewalls in the same network. But I'm wondering if it's possible to do the same thing, with 2 Pfsense firewalls...
0
5551
by: adsilva | last post by:
A Windows Forms form does not have the event Unload, like VB6. What one acts like?
1
4093
by: 6302768590 | last post by:
Hai team i want code for transfer the data from one system to another through IP address by using C# our system has to for every 5mins then we have to update the data what the data is updated we have to send another system
2
3703
muto222
by: muto222 | last post by:
How can i add a mobile payment intergratation into php mysql website.
3
2909
bsmnconsultancy
by: bsmnconsultancy | last post by:
In today's digital era, a well-designed website is crucial for businesses looking to succeed. Whether you're a small business owner or a large corporation in Toronto, having a strong online presence can significantly impact your brand's success. BSMN Consultancy, a leader in Website Development in Toronto offers valuable insights into creating effective websites that not only look great but also perform exceptionally well. In this comprehensive...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.