Hi Tom,
Should non-unique indexes be locally or globally partitioned? Ours is a OLTP environment and this table will constantly be inserted/updated into.
OPER_ID and HANDHELD_ID are foreign keys to two separate tables. OPER_ID will probably have about 20 distinct values but Handheld_ID will be pretty unique.
From query performance perspective, would it be more advantageous to create indexes ix_commands_1 and ix_commands_2 globally partitioned instead of locally as done below? The queries will involve joining this table with OPERATOR table on OPER_ID and HANDHELD table with HANDHELD_ID.
I'm new to partitioning your imput will be appreciated.
Thanks!
CREATE TABLE COMMANDS (
COMMAND_ID NUMBER(10) NOT NULL, -- PK BASED ON A SEQUENCE
OPER_ID NUMBER(10),
HANDHELD_ID NUMBER(10),
TIMESTAMP DATE,
)
PCTFREE 10
PCTUSED 40
INITRANS 100
PARTITION BY RANGE (TIMESTAMP)
SUBPARTITION BY HASH (COMMAND_ID)
SUBPARTITION TEMPLATE
(
SUBPARTITION SP1 TABLESPACE T1,
SUBPARTITION SP2 TABLESPACE T1,
SUBPARTITION SP3 TABLESPACE T1,
SUBPARTITION SP4 TABLESPACE T1,
SUBPARTITION SP5 TABLESPACE T1,
SUBPARTITION SP6 TABLESPACE T1,
SUBPARTITION SP7 TABLESPACE T1,
SUBPARTITION SP8 TABLESPACE T1, )
(PARTITION COMMANDS_P1 VALUES LESS THAN (TO_DATE('2009-11-01','YYYY-MM-DD')),
PARTITION COMMANDS_P2 VALUES LESS THAN (TO_DATE('2009-12-01','YYYY-MM-DD')),
PARTITION COMMANDS_P3 VALUES LESS THAN (TO_DATE('2010-01-01','YYYY-MM-DD')),
PARTITION COMMANDS_P4 VALUES LESS THAN (TO_DATE('2010-02-01','YYYY-MM-DD')),
PARTITION COMMANDS_P5 VALUES LESS THAN (TO_DATE('2010-03-01','YYYY-MM-DD')),
PARTITION COMMANDS_P6 VALUES LESS THAN (TO_DATE('2010-04-01','YYYY-MM-DD')),
PARTITION COMMANDS_P7 VALUES LESS THAN (TO_DATE('2010-05-01','YYYY-MM-DD')),
PARTITION COMMANDS_P8 VALUES LESS THAN (TO_DATE('2010-06-01','YYYY-MM-DD')),
PARTITION COMMANDS_P9 VALUES LESS THAN (TO_DATE('2010-07-01','YYYY-MM-DD')),
PARTITION COMMANDS_P10 VALUES LESS THAN (TO_DATE('2010-08-01','YYYY-MM-DD')),
PARTITION COMMANDS_P11 VALUES LESS THAN (TO_DATE('2010-09-01','YYYY-MM-DD')),
PARTITION COMMANDS_P12 VALUES LESS THAN (TO_DATE('2010-10-01','YYYY-MM-DD')),
PARTITION COMMANDS_PCURR VALUES LESS THAN (MAXVALUE))
);
ALTER TABLE COMMANDS ADD CONSTRAINT COMMANDS_PK PRIMARY KEY (COMMAND_ID) USING INDEX
(CREATE UNIQUE INDEX COMMANDS_PK ON COMMANDS(COMMAND_ID) GLOBAL PARTITION BY HASH(COMMAND_ID)
PARTITIONS 64 STORE IN (I1)
)
;
CREATE INDEX IX_COMMANDS_1 ON COMMANDS(OPER_ID)
LOCAL STORE IN (I1)
;
CREATE INDEX IX_COMMANDS_2 ON COMMANDS(HANDHELD_ID)
LOCAL STORE IN (I1)
;
that an index is non-unique is NOT the deciding factor for how it is partitioned.
How you use it in a predicate is.
Suppose you query "where oper_id = ?" and "where handheld_id = ?"
Then, a pair of globally partitioned indexes would make sense - else if they were local - we'd have to search EVERY index subpartition - since the index (if local) would be partitioned by timestamp/command_id
If you query on oper_id AND you include timestamp and/or command_id - then we can do local index partition elimination and only search the indexes that could possibly have the data - not all of the index subpartitions.
So, look at your where clauses. Think "would we have to search EVERYTHING" or "would partition elimination kick in and we'd search a small (small) subset of index subpartitions"
If everything, global partitioning would make sense.
If small set - local would probably make sense.
Think about the work involved at runtime to use (or not use) the index.