Oracle FAQ Your Portal to the Oracle Knowledge Grid
HOME | ASK QUESTION | ADD INFO | SEARCH | E-MAIL US
 

Home -> Community -> Usenet -> c.d.o.server -> Re: Where is Oracle's Grid ? long

Re: Where is Oracle's Grid ? long

From: Niall Litchfield <n-litchfield_at_audit-commission.gov.uk>
Date: Wed, 31 Dec 2003 12:43:15 -0000
Message-ID: <3ff2c465$0$13348$ed9e5944@reading.news.pipex.net>


"Sybrand Bakker" <gooiditweg_at_sybrandb.demon.nl> wrote in message news:u6d5vv8fbvgu42aeln6bbvf067mnvl1jal_at_4ax.com...

> On Wed, 31 Dec 2003 11:11:14 -0000, "Niall Litchfield"
> <n-litchfield_at_audit-commission.gov.uk> wrote:
>
> > It seems to me
> >that hints *are* commands (albeit they are checked for validity first).
>
> A hint is a hint is a hint. If CBO calculates a better access path
> without using the hint, the hint will be ignored

The hint isn't ignored so far as I can tell, but it is evaluated before passing to the CBO for validity. The CBO will then in every case that I have tested limit the execution plans it considers according to the hint, it of course still picks the lowest cost plan, usually when people complain that the CBO is ignoring a valid hint they mean that they havent sufficiently constrained the CBO. An example test follows.

This is my test script. the idea is to see what the CBO picks and then hint it to reverse the order of the nested loops join. The first attempt specifying the appropriate use_nl hint fails. The second attempt succeeds. There are significant differences though.

In trace 1 the CBO considers (and rejects) sort merge and hash joins. In trace 2 these disappear but the join order remains the same only when I specify both the order and the join method does the CBO do what I am trying to tell it to do. However it definitely doesn't ignore the hint, but uses it to limit what access methods it will use.

In addition my understanding of plan stability is this (simplified a bit and it could of course be incorrect). Oracle calculates the hash value of the sql statement. it then looks in the OUTLN tables to see if it has a modified sql statement stored for that hash value and if so it passes that sql statement (packed with hints that effectively prescribe one path only) to the CBO. Now if this is correct AND it is correct that hints can be ignored I don't see how plan stability can work.

@spool_results hints_test

connect niall/niall

pause 'Drop tables if they exist'

drop table hint1;

drop table hint2;

pause 'Create 2 tables'

create table hint1 as select * from all_objects where rownum < 2;

create table hint2 as select * from all_objects;

pause 'Add primary keys'

alter table hint1 add constraint pk_hint1 primary key(object_id);

alter table hint2 add constraint pk_hint2 primary key(object_id);

pause 'get some stats'

exec dbms_stats.gather_table_stats('NIALL','HINT1',CASCADE => TRUE);

exec dbms_stats.gather_table_stats('NIALL','HINT2',CASCADE => TRUE);

alter session set tracefile_identifier='base_plan';

alter session set events '10053 trace name context forever, level 1';

alter session set events '10046 trace name context forever, level 1';

pause 'base plan'

select count(*)

from hint2,hint1

where hint1.object_id=hint2.object_id

and hint2.owner='NIALL';

alter session set tracefile_identifier='hinted plan';

select /*+ use_nl(hint2 hint1) */ count(*)

from hint2,hint1

where hint1.object_id=hint2.object_id

and hint2.owner='NIALL';

alter session set tracefile_identifier='full hinted plan';

select /*+ordered use_nl(hint2 hint1) */ count(*)

from hint2,hint1

where hint1.object_id=hint2.object_id

and hint2.owner='NIALL';

alter session set events '10053 trace name context off';

spool off

The trace files that are generated look like this (optimizer parameters snipped)

base_plan

QUERY
select count(*)
from hint2,hint1
where hint1.object_id=hint2.object_id
and hint2.owner='NIALL'



BASE STATISTICAL INFORMATION

Table stats Table: HINT1 Alias: HINT1   TOTAL :: CDN: 1 NBLKS: 4 AVG_ROW_LEN: 91
Column:  OBJECT_ID  Col#: 4      Table: HINT1   Alias: HINT1
    NDV: 1         NULLS: 0         DENS: 1.0000e+000 LO:  17867  HI: 17867
    NO HISTOGRAM: #BKT: 1 #VAL: 2
-- Index stats
  INDEX NAME: PK_HINT1 COL#: 4
    TOTAL :: LVLS: 0 #LB: 1 #DK: 1 LB/K: 1 DB/K: 1 CLUF: 1

Table stats Table: HINT2 Alias: HINT2   TOTAL :: CDN: 30328 NBLKS: 213 AVG_ROW_LEN: 93
Column:  OBJECT_ID  Col#: 4      Table: HINT2   Alias: HINT2
    NDV: 30328     NULLS: 0         DENS: 3.2973e-005 LO:  3  HI: 32446
    NO HISTOGRAM: #BKT: 1 #VAL: 2
-- Index stats
  INDEX NAME: PK_HINT2 COL#: 4
    TOTAL :: LVLS: 1 #LB: 31 #DK: 30328 LB/K: 1 DB/K: 1 CLUF: 24628 _OPTIMIZER_PERCENT_PARALLEL = 0

SINGLE TABLE ACCESS PATH
Column:      OWNER  Col#: 1      Table: HINT2   Alias: HINT2
    NDV: 27        NULLS: 0         DENS: 3.7037e-002
    NO HISTOGRAM: #BKT: 1 #VAL: 2
  TABLE: HINT2     ORIG CDN: 30328  ROUNDED CDN: 1123  CMPTD CDN: 1123
  Access path: tsc Resc: 22 Resp: 22   BEST_CST: 22.00 PATH: 2 Degree: 1

SINGLE TABLE ACCESS PATH
  TABLE: HINT1 ORIG CDN: 1 ROUNDED CDN: 1 CMPTD CDN: 1   Access path: tsc Resc: 2 Resp: 2
  Access path: index (iff)

      Index: PK_HINT1
  TABLE: HINT1
      RSC_CPU: 0 RSC_IO: 2
  IX_SEL: 0.0000e+000 TB_SEL: 1.0000e+000   Access path: iff Resc: 2 Resp: 2
  Access path: index (no sta/stp keys)

      Index: PK_HINT1
  TABLE: HINT1
      RSC_CPU: 0 RSC_IO: 1
  IX_SEL: 1.0000e+000 TB_SEL: 1.0000e+000   BEST_CST: 2.00 PATH: 4 Degree: 1



OPTIMIZER STATISTICS AND COMPUTATIONS

GENERAL PLANS

Join order[1]: HINT1 [HINT1] HINT2 [HINT2] Now joining: HINT2 [HINT2] *******
NL Join
  Outer table: cost: 2 cdn: 1 rcz: 5 resp: 1   Inner table: HINT2
    Access path: tsc Resc: 22
    Join: Resc: 23 Resp: 23
OPTIMIZER PERCENT INDEX CACHING = 80
  Access path: index (unique)

      Index: PK_HINT2
  TABLE: HINT2
      RSC_CPU: 0 RSC_IO: 1
  IX_SEL: 8.9047e-004 TB_SEL: 8.9047e-004     Join (ordered NL): resc: 2 resp: 2 OPTIMIZER PERCENT INDEX CACHING = 80
  Access path: index (eq-unique)

      Index: PK_HINT2
  TABLE: HINT2
      RSC_CPU: 0 RSC_IO: 1
  IX_SEL: 0.0000e+000 TB_SEL: 0.0000e+000     Join (ordered NL): resc: 2 resp: 2 Join cardinality: 1 = outer (1) * inner (1123) * sel (8.8968e-004) [flag=0]
  Best NL cost: 3 resp: 2
SM Join
  Outer table:
    resc: 1 cdn: 1 rcz: 5 deg: 1 resp: 1   Inner table: HINT2
    resc: 22 cdn: 1123 rcz: 11 deg: 1 resp: 22     using join:1 distribution:2 #groups:1

    SORT resource      Sort statistics
      Sort width:            2 Area size:      131072 Max Area size:
1257472   Degree: 1
      Blocks to Sort:        2 Row size:           23 Rows:       1123
      Initial runs:          1 Merge passes:        1 IO Cost / pass:
3
      Total IO sort cost: 3
      Total CPU sort cost: 0
      Total Temp space used: 0

  Merge join Cost: 26 Resp: 26
HA Join
  Outer table:
    resc: 1 cdn: 1 rcz: 5 deg: 1 resp: 1   Inner table: HINT2
    resc: 22 cdn: 1123 rcz: 11 deg: 1 resp: 22     using join:8 distribution:2 #groups:1   Hash join one ptn Resc: 1 Deg: 1
      hash_area:  28 (max=154)  buildfrag:  1                probefrag:   2
ppasses: 1
  Hash join Resc: 24 Resp: 24
Join result: cost: 3  cdn: 1  rcz: 16
Best so far: TABLE#: 0  CST:          2  CDN:          1  BYTES:          5
Best so far: TABLE#: 1  CST:          3  CDN:          1  BYTES:         16
***********************

Join order[2]: HINT2 [HINT2] HINT1 [HINT1] Final:
  CST: 3 CDN: 1 RSC: 2 RSP: 2 BYTES: 16   IO-RSC: 2 IO-RSP: 2 CPU-RSC: 2 CPU-RSP: 2

PARSING IN CURSOR #1 len=94 dep=0 uid=76 oct=3 lid=76 tim=9629794281 hv=2036540465 ad='69474a98'
select count(*)
from hint2,hint1
where hint1.object_id=hint2.object_id
and hint2.owner='NIALL'
END OF STMT
PARSE #1:c=10014,e=15085,p=0,cr=0,cu=0,mis=1,r=0,dep=0,og=4,tim=9629794275 EXEC #1:c=0,e=107,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=4,tim=9629795171
FETCH #1:c=0,e=92,p=0,cr=4,cu=0,mis=0,r=1,dep=0,og=4,tim=9629795399
FETCH #1:c=0,e=2,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=0,tim=9629795802
STAT #1 id=1 cnt=1 pid=0 pos=1 obj=0 op='SORT AGGREGATE (cr=4 r=0 w=0
time=81 us)'
STAT #1 id=2 cnt=0 pid=1 pos=1 obj=0 op='NESTED LOOPS (cr=4 r=0 w=0 time=73 us)'
STAT #1 id=3 cnt=1 pid=2 pos=1 obj=32447 op='INDEX FULL SCAN PK_HINT1 (cr=1 r=0 w=0 time=31 us)'
STAT #1 id=4 cnt=0 pid=2 pos=2 obj=32446 op='TABLE ACCESS BY INDEX ROWID HINT2 (cr=3 r=0 w=0 time=33 us)'
STAT #1 id=5 cnt=1 pid=4 pos=1 obj=32448 op='INDEX UNIQUE SCAN PK_HINT2 (cr=2 r=0 w=0 time=15 us)'
QUERY
alter session set tracefile_identifier='hinted plan'

PARSING IN CURSOR #1 len=52 dep=0 uid=76 oct=42 lid=76 tim=9629798055 hv=2424307202 ad='697b363c'
alter session set tracefile_identifier='hinted plan' END OF STMT
PARSE #1:c=0,e=239,p=0,cr=0,cu=0,mis=1,r=0,dep=0,og=4,tim=9629798051

hinted plan looks like

QUERY
select /*+ use_nl(hint2 hint1) */ count(*) from hint2,hint1
where hint1.object_id=hint2.object_id
and hint2.owner='NIALL'



BASE STATISTICAL INFORMATION

Table stats Table: HINT1 Alias: HINT1   TOTAL :: CDN: 1 NBLKS: 4 AVG_ROW_LEN: 91
Column:  OBJECT_ID  Col#: 4      Table: HINT1   Alias: HINT1
    NDV: 1         NULLS: 0         DENS: 1.0000e+000 LO:  17867  HI: 17867
    NO HISTOGRAM: #BKT: 1 #VAL: 2
-- Index stats
  INDEX NAME: PK_HINT1 COL#: 4
    TOTAL :: LVLS: 0 #LB: 1 #DK: 1 LB/K: 1 DB/K: 1 CLUF: 1

Table stats Table: HINT2 Alias: HINT2   TOTAL :: CDN: 30328 NBLKS: 213 AVG_ROW_LEN: 93
Column:  OBJECT_ID  Col#: 4      Table: HINT2   Alias: HINT2
    NDV: 30328     NULLS: 0         DENS: 3.2973e-005 LO:  3  HI: 32446
    NO HISTOGRAM: #BKT: 1 #VAL: 2
-- Index stats
  INDEX NAME: PK_HINT2 COL#: 4
    TOTAL :: LVLS: 1 #LB: 31 #DK: 30328 LB/K: 1 DB/K: 1 CLUF: 24628 _OPTIMIZER_PERCENT_PARALLEL = 0

SINGLE TABLE ACCESS PATH
Column:      OWNER  Col#: 1      Table: HINT2   Alias: HINT2
    NDV: 27        NULLS: 0         DENS: 3.7037e-002
    NO HISTOGRAM: #BKT: 1 #VAL: 2
  TABLE: HINT2     ORIG CDN: 30328  ROUNDED CDN: 1123  CMPTD CDN: 1123
  Access path: tsc Resc: 22 Resp: 22   BEST_CST: 22.00 PATH: 2 Degree: 1

SINGLE TABLE ACCESS PATH
  TABLE: HINT1 ORIG CDN: 1 ROUNDED CDN: 1 CMPTD CDN: 1   Access path: tsc Resc: 2 Resp: 2
  Access path: index (iff)

      Index: PK_HINT1
  TABLE: HINT1
      RSC_CPU: 0 RSC_IO: 2
  IX_SEL: 0.0000e+000 TB_SEL: 1.0000e+000   Access path: iff Resc: 2 Resp: 2
  Access path: index (no sta/stp keys)

      Index: PK_HINT1
  TABLE: HINT1
      RSC_CPU: 0 RSC_IO: 1
  IX_SEL: 1.0000e+000 TB_SEL: 1.0000e+000   BEST_CST: 2.00 PATH: 4 Degree: 1



OPTIMIZER STATISTICS AND COMPUTATIONS

GENERAL PLANS

Join order[1]: HINT1 [HINT1] HINT2 [HINT2] Now joining: HINT2 [HINT2] *******
NL Join
  Outer table: cost: 2 cdn: 1 rcz: 5 resp: 1   Inner table: HINT2
    Access path: tsc Resc: 22
    Join: Resc: 23 Resp: 23
OPTIMIZER PERCENT INDEX CACHING = 80
  Access path: index (unique)

      Index: PK_HINT2
  TABLE: HINT2
      RSC_CPU: 0 RSC_IO: 1
  IX_SEL: 8.9047e-004 TB_SEL: 8.9047e-004     Join (ordered NL): resc: 2 resp: 2 OPTIMIZER PERCENT INDEX CACHING = 80
  Access path: index (eq-unique)

      Index: PK_HINT2
  TABLE: HINT2
      RSC_CPU: 0 RSC_IO: 1
  IX_SEL: 0.0000e+000 TB_SEL: 0.0000e+000     Join (ordered NL): resc: 2 resp: 2 Join cardinality: 1 = outer (1) * inner (1123) * sel (8.8968e-004) [flag=0]
  Best NL cost: 3 resp: 2

Join result: cost: 3  cdn: 1  rcz: 16
Best so far: TABLE#: 0  CST:          2  CDN:          1  BYTES:          5
Best so far: TABLE#: 1  CST:          3  CDN:          1  BYTES:         16
***********************

Join order[2]: HINT2 [HINT2] HINT1 [HINT1] Final:
  CST: 3 CDN: 1 RSC: 2 RSP: 2 BYTES: 16   IO-RSC: 2 IO-RSP: 2 CPU-RSC: 2 CPU-RSP: 2

PARSING IN CURSOR #1 len=121 dep=0 uid=76 oct=3 lid=76 tim=9629816029 hv=1184855804 ad='694696e0'
select /*+ use_nl(hint2 hint1) */ count(*) from hint2,hint1
where hint1.object_id=hint2.object_id
and hint2.owner='NIALL'
END OF STMT
PARSE #1:c=0,e=14907,p=0,cr=0,cu=0,mis=1,r=0,dep=0,og=4,tim=9629816023 EXEC #1:c=0,e=99,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=4,tim=9629816912
FETCH #1:c=0,e=90,p=0,cr=4,cu=0,mis=0,r=1,dep=0,og=4,tim=9629817136
FETCH #1:c=0,e=1,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=0,tim=9629817549
STAT #1 id=1 cnt=1 pid=0 pos=1 obj=0 op='SORT AGGREGATE (cr=4 r=0 w=0
time=79 us)'
STAT #1 id=2 cnt=0 pid=1 pos=1 obj=0 op='NESTED LOOPS (cr=4 r=0 w=0 time=71 us)'
STAT #1 id=3 cnt=1 pid=2 pos=1 obj=32447 op='INDEX FULL SCAN PK_HINT1 (cr=1 r=0 w=0 time=32 us)'
STAT #1 id=4 cnt=0 pid=2 pos=2 obj=32446 op='TABLE ACCESS BY INDEX ROWID HINT2 (cr=3 r=0 w=0 time=30 us)'
STAT #1 id=5 cnt=1 pid=4 pos=1 obj=32448 op='INDEX UNIQUE SCAN PK_HINT2 (cr=2 r=0 w=0 time=14 us)'
QUERY
alter session set tracefile_identifier='full hinted plan'

PARSING IN CURSOR #1 len=57 dep=0 uid=76 oct=42 lid=76 tim=9629819941 hv=3034289651 ad='697a53e0'
alter session set tracefile_identifier='full hinted plan' END OF STMT
PARSE #1:c=0,e=234,p=0,cr=0,cu=0,mis=1,r=0,dep=0,og=4,tim=9629819937

and finally

QUERY
select /*+ordered use_nl(hint2 hint1) */ count(*) from hint2,hint1
where hint1.object_id=hint2.object_id
and hint2.owner='NIALL'



BASE STATISTICAL INFORMATION

Table stats Table: HINT1 Alias: HINT1   TOTAL :: CDN: 1 NBLKS: 4 AVG_ROW_LEN: 91
Column:  OBJECT_ID  Col#: 4      Table: HINT1   Alias: HINT1
    NDV: 1         NULLS: 0         DENS: 1.0000e+000 LO:  17867  HI: 17867
    NO HISTOGRAM: #BKT: 1 #VAL: 2
-- Index stats
  INDEX NAME: PK_HINT1 COL#: 4
    TOTAL :: LVLS: 0 #LB: 1 #DK: 1 LB/K: 1 DB/K: 1 CLUF: 1

Table stats Table: HINT2 Alias: HINT2   TOTAL :: CDN: 30328 NBLKS: 213 AVG_ROW_LEN: 93
Column:  OBJECT_ID  Col#: 4      Table: HINT2   Alias: HINT2
    NDV: 30328     NULLS: 0         DENS: 3.2973e-005 LO:  3  HI: 32446
    NO HISTOGRAM: #BKT: 1 #VAL: 2
-- Index stats
  INDEX NAME: PK_HINT2 COL#: 4
    TOTAL :: LVLS: 1 #LB: 31 #DK: 30328 LB/K: 1 DB/K: 1 CLUF: 24628 _OPTIMIZER_PERCENT_PARALLEL = 0

SINGLE TABLE ACCESS PATH
Column:      OWNER  Col#: 1      Table: HINT2   Alias: HINT2
    NDV: 27        NULLS: 0         DENS: 3.7037e-002
    NO HISTOGRAM: #BKT: 1 #VAL: 2
  TABLE: HINT2     ORIG CDN: 30328  ROUNDED CDN: 1123  CMPTD CDN: 1123
  Access path: tsc Resc: 22 Resp: 22   BEST_CST: 22.00 PATH: 2 Degree: 1

SINGLE TABLE ACCESS PATH
  TABLE: HINT1 ORIG CDN: 1 ROUNDED CDN: 1 CMPTD CDN: 1   Access path: tsc Resc: 2 Resp: 2
  Access path: index (iff)

      Index: PK_HINT1
  TABLE: HINT1
      RSC_CPU: 0 RSC_IO: 2
  IX_SEL: 0.0000e+000 TB_SEL: 1.0000e+000   Access path: iff Resc: 2 Resp: 2
  Access path: index (no sta/stp keys)

      Index: PK_HINT1
  TABLE: HINT1
      RSC_CPU: 0 RSC_IO: 1
  IX_SEL: 1.0000e+000 TB_SEL: 1.0000e+000   BEST_CST: 2.00 PATH: 4 Degree: 1



OPTIMIZER STATISTICS AND COMPUTATIONS

Join order[1]: HINT2 [HINT2] HINT1 [HINT1] Now joining: HINT1 [HINT1] *******
NL Join
  Outer table: cost: 22 cdn: 1123 rcz: 11 resp: 22   Inner table: HINT1
    Access path: tsc Resc: 2
    Join: Resc: 2268 Resp: 2268
  Access path: index (iff)

      Index: PK_HINT1
  TABLE: HINT1
      RSC_CPU: 0 RSC_IO: 2
  IX_SEL: 0.0000e+000 TB_SEL: 1.0000e+000   Inner table: HINT1
    Access path: iff Resc: 2
    Join: Resc: 2268 Resp: 2268
OPTIMIZER PERCENT INDEX CACHING = 80
  Access path: index (unique)

      Index: PK_HINT1
  TABLE: HINT1
      RSC_CPU: 0 RSC_IO: 0
  IX_SEL: 1.0000e+000 TB_SEL: 1.0000e+000     Join: resc: 23 resp: 23
OPTIMIZER PERCENT INDEX CACHING = 80
  Access path: index (eq-unique)

      Index: PK_HINT1
  TABLE: HINT1
      RSC_CPU: 0 RSC_IO: 0
  IX_SEL: 0.0000e+000 TB_SEL: 0.0000e+000     Join: resc: 23 resp: 23
Join cardinality: 1 = outer (1123) * inner (1) * sel (8.8968e-004) [flag=0]
  Best NL cost: 24 resp: 23

Join result: cost: 24  cdn: 1  rcz: 16
Best so far: TABLE#: 0  CST:         22  CDN:       1123  BYTES:      12353
Best so far: TABLE#: 1  CST:         24  CDN:          1  BYTES:         16
Final:
  CST: 24 CDN: 1 RSC: 23 RSP: 23 BYTES: 16   IO-RSC: 23 IO-RSP: 23 CPU-RSC: 1 CPU-RSP: 1

PARSING IN CURSOR #1 len=128 dep=0 uid=76 oct=3 lid=76 tim=9629839016 hv=1031559168 ad='694612a8'
select /*+ordered use_nl(hint2 hint1) */ count(*) from hint2,hint1
where hint1.object_id=hint2.object_id
and hint2.owner='NIALL'
END OF STMT
PARSE #1:c=10014,e=15603,p=0,cr=0,cu=0,mis=1,r=0,dep=0,og=4,tim=9629839011 EXEC #1:c=0,e=99,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=4,tim=9629839895 FETCH
#1:c=10014,e=158659,p=123,cr=212,cu=0,mis=0,r=1,dep=0,og=4,tim=9629998690
FETCH #1:c=0,e=2,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=0,tim=9629999363
STAT #1 id=1 cnt=1 pid=0 pos=1 obj=0 op='SORT AGGREGATE (cr=212 r=123 w=0
time=158645 us)'
STAT #1 id=2 cnt=0 pid=1 pos=1 obj=0 op='NESTED LOOPS (cr=212 r=123 w=0 time=158636 us)'
STAT #1 id=3 cnt=4 pid=2 pos=1 obj=32446 op='TABLE ACCESS FULL HINT2 (cr=210 r=123 w=0 time=158597 us)'
STAT #1 id=4 cnt=0 pid=2 pos=2 obj=32447 op='INDEX UNIQUE SCAN PK_HINT1 (cr=2 r=0 w=0 time=16 us)'
QUERY
alter session set events '10053 trace name context off'

PARSING IN CURSOR #1 len=55 dep=0 uid=76 oct=42 lid=76 tim=9630001528 hv=966904717 ad='695e0d90'
alter session set events '10053 trace name context off' END OF STMT
PARSE #1:c=0,e=68,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=4,tim=9630001524 EXEC #1:c=0,e=89,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=4,tim=9630002090 Received on Wed Dec 31 2003 - 06:43:15 CST

Original text of this message

HOME | ASK QUESTION | ADD INFO | SEARCH | E-MAIL US