Tipos de Segmentos
B-Tree Index
Index entry header
Key column length
Key column value
ROWID
Root
Branch
Leaf
Index entry
Almacenamiento en los índices PCTFREE DB_BLOCK_SIZE-OVERHEAD-entries*
ENTRY_ OVERHEAD-ENTRIES(directorio valores)-ROWID
Reescritura de Consultas
Function-Based Indexes
SQL> CREATE INDEX FBI_UPPER_LASTNAME 2 ON CUSTOMERS(upper(cust_last_name));
SQL> SELECT * 2 FROM customers 3 WHERE UPPER(cust_last_name) = 'SMITH';
SQL> ALTER SESSION 2 SET QUERY_REWRITE_ENABLED = TRUE;SQL> ALTER SESSION 2 SET QUERY_REWRITE_ENABLED = enforced | trusted | stale_tolerated ;
Function-Based Indexes: Usage Function-based indexes:
Materialize computational-intensive expressions
Facilitate case-insensitive searches Provide a simple form of data
compression Can be used for an NLS sort index
Índices y nulos
Oracle ignora los registro donde todas las entradas son nulos.
CREATE INDEX IDX1 ON EMPLOYEE(NVL(ename,’null’)
Ejemplo Bitmap- Tabla base
CUSTOMER # MARITAL_ STATUS REGION GENDER INCOME_ LEVEL
101 single east male bracket_1
102 married central female bracket_4
103 married west female bracket_2
104 divorced west male bracket_4
105 single central female bracket_2
106 married central female bracket_3
Ejemplo Bitmap (Bitmap Generado)
REGION='east' REGION='central' REGION='west'
1 0 0
0 1 0
0 0 1
0 0 1
0 1 0
0 1 0
Ejemplo Consulta sobre Bitmap
SELECT COUNT(*) FROM CUSTOMER WHERE MARITAL_STATUS = 'married' AND REGION IN ('central','west');
Bitmap Indexes
<Blue, 10.0.3, 12.8.3, 1000100100010010100>
<Green, 10.0.3, 12.8.3, 0001010000100100000>
<Red, 10.0.3, 12.8.3, 0100000011000001001>
<Yellow, 10.0.3, 12.8.3, 0010001000001000010>
keystartROWID
endROWID bitmap
Table
Index
Block 10
Block 11
Block 12
File 3
Creating Bitmap IndexesCREATE BITMAP INDEX orders_region_id_idx
ON orders(region_id)
PCTFREE 30
STORAGE(INITIAL 200K NEXT 200K
PCTINCREASE 0 MAXEXTENTS 50)
TABLESPACE indx;
Comparing B-Tree andBitmap Indexes
B-tree
Suitable for high-cardinality columns
Updates on keys relativelyinexpensive
Inefficient for queries using OR predicates
Useful for OLTP
Bitmap
Suitable for low-cardinality columns
Updates to key columns veryexpensive
Efficient for queries using OR predicates
Useful for data warehousing
COMPUTE STATISTICS
CREATE INDEX ord_customer_ix_demo
ON orders(customer_id, sales_rep_id)
COMPUTE STATISTICS;
Índices particionados localmente sobre tablas Particionadas
CREATE TABLE employees(employee_id NUMBER(4) NOT NULL, last_name VARCHAR2(10), department_id NUMBER(2)) PARTITION BY RANGE (department_id)(PARTITION employees_part1 VALUES LESS THAN (11) TABLESPACE part1, PARTITION employees_part2 VALUES LESS THAN (21) TABLESPACE part2, PARTITION employees_part3 VALUES LESS THAN (31) TABLESPACE part3);
Índices Particionados Globalmente sobre Tablas Particionadas
CREATE INDEX employees_global_part_idx ON employees(employee_id)GLOBAL PARTITION BY RANGE(employee_id)(PARTITION p1 VALUES LESS THAN(5000), PARTITION p2 VALUES LESS THAN(MAXVALUE));
Índices globales no particionados sobre tablas particionadas
CREATE INDEX employees_global_idx ON employees(employee_id);
Hash-Partitioned Global Indexes: Overview 10g
1000, 1001, …900, 901, …< 1000 < MAXVALUE
901, 1001, …900, 1000, …
Range-partitioned global index
Hash-partitioned global index
Creating Hash-Partitioned Global IndexesSQL> CREATE INDEX ghoi_ix 2 ON order_items (order_id) GLOBAL 3 PARTITION BY HASH (order_id) ( 4 PARTITION p1 TABLESPACE tbs_1, 5 PARTITION p2 TABLESPACE tbs_2, 6 PARTITION p3 TABLESPACE tbs_3, 7 PARTITION p4 TABLESPACE tbs_4);
SQL> CREATE INDEX ghoi_ix 2 ON order_items (order_id) GLOBAL 3 PARTITION BY HASH (order_id) 4 PARTITIONS 4 5 STORE IN (tbs_1, tbs_2, tbs_3, tbs_4);
Índices Bipmap para IOT
Tabla de Correspondencia
9i Hash, rango
10g Lista
ROWID Físico ROWID Lógico
Creación de una Tabla Particionada Organizada por ÍndiceCREATE TABLE sales_range(
salesman_id NUMBER(5), salesman_name VARCHAR2(30), sales_amount NUMBER(10), sales_date DATE, PRIMARY KEY(sales_date, salesman_id)) ORGANIZATION INDEX INCLUDING salesman_id OVERFLOW TABLESPACE tabsp_overflow PARTITION BY RANGE(sales_date)(PARTITION sales_jan2000 VALUES LESS THAN(TO_DATE('02/01/2000','DD/MM/YYYY')) OVERFLOW TABLESPACE p1_overflow, PARTITION sales_feb2000 VALUES LESS THAN(TO_DATE('03/01/2000','DD/MM/YYYY')) OVERFLOW TABLESPACE p2_overflow, PARTITION sales_mar2000 VALUES LESS THAN(TO_DATE('04/01/2000','DD/MM/YYYY')) OVERFLOW TABLESPACE p3_overflow, PARTITION sales_apr2000 VALUES LESS THAN(TO_DATE('05/01/2000','DD/MM/YYYY')) OVERFLOW TABLESPACE p4_overflow);