Hi,

We have a table with with parented and childid combination as unique. We have 
to query it sometimes with parent id and sometimes with child id. So we have 
secondary index(global index) on child id. As we don’t want to store all the 
fields again in the secondary index , we wanted to use index hinting. Also we 
do pre-splitting on the first field of table and as well as secondary index to 
distribute the write. We pre-calculate  Secondary_Dist_salt and write to a 
column in primary table which is used to populate the index.

Table(TEST)

Primary_Dist_salt
Parentid
Childid

Other columns

Secondary Index: (TESTINDEX)

Secondary_Dist_salt
Childid
Parentid

If we do a query like below, I get below plan I see that the index is used, I 
am worried if the full scan on primary table will affect performance in future 
as the table may grow to several hundreds of millions.
Also I see that Primary_Dist_salt is also added implicitly when I create the 
secondary index without it. So I thought we have all the keys required to do a 
point lookup on primary table to get rest of the columns.
I presume that the range scan runs parallel and hence full scan occurs?
Can you please throw some light on this? Is there some way we can avoid that 
full scan.

explain select /*+ INDEX(TEST TESTINDEX) */ * from TEST where Childid
='10' and Secondary_dist_salt='3k';

CLIENT 10-CHUNK PARALLEL 1-WAY ROUND ROBIN FULL SCAN OVER TEST
SKIP-SCAN-JOIN TABLE 0
   CLIENT 1-CHUNK PARALLEL 1-WAY ROUND ROBIN RANGE SCAN OVER TESTINDEX 
['3k','10']
            SERVER FILTER BY FIRST KEY ONLY
    DYNAMIC SERVER FILTER BY ("TEST.PRIMARY_DIST_SALT", "TEST.PARENTID", 
"TEST.CHILDID") IN (($2.$4, $2.$5, $2.$6)

Thanks,
Pradheep

Reply via email to