programmera.net -> oracle -> normal     för utskrift      info@programmera.net

Index i Oracle

1. Index
2. CREATE INDEX
3. UNIQUE
4. BITMAP
5. Multipelindex
6. Funktionsbaserat index
7. ALTER INDEX
8. DROP INDEX

1. Index

Index används till att öka prestandan på framför allt SELECT-satser. Det finns två typer av index i Oracle:

  • B-trädsindex: Denna typ av index sorterar värdena i den indexerade kolumnen i en trädstruktur, optimerad för sökning bland unika värden (alltså hög kardinalitet). B-trädsindex är default då man skapar ett index.
  • Bitmappat index: Denna typ av index är optimerat för kolumner med ett litet antal unika värden (alltså låg kardinalitet), ta t.ex. "kön" som bara kan vara MAN eller KVINNA.

2. CREATE INDEX

Syntaxen för att skapa ett index är följande:
CREATE [UNIQUE | BITMAP] INDEX indexnamn 
ON tabell(
	{kolumn | funktionsutr.} [ASC | DESC]
	[,{kolumn | funktionsutr.} [ASC | DESC]]
)
[ONLINE]
[[NO]COMPRESS [nr]]
[NOSORT | REVERSE]
[[NO]PARALLEL [nr]]
Om man specifierar fler än en kolumn får man ett multipelindex. Nyckelorden kan förklaras på följande sätt:

  • UNIQUE: Med detta nyckelord kontrolleras att alla värden i den indexerade kolumnen är unika, annars returneras ett fel.
  • BITMAP: Ett bitmappat index skapas.
  • ASC / DESC: ASC sorterar indexet i stigande ordning då DESC sorterar indexet i sjunkande ordning.
  • ONLINE: Indexet blir optimerat för att inte hindra tabellens DML-aktivitet.
  • (NO)COMPRESS: Tar bort dubbletter i multipelindex.
  • NOSORT: Utgår från att raderna i kolumnen redan är sorterade och ingen sortering utförs då indexet skapas.
  • REVERSE: Inverterar alla kolumnernas värden och skapar ett index baserat på de inverterade värdena. Detta kan öka prestandan på t.ex. sökning på strängar om många strängar börjar på samma sätt men har annorlunda slut. Tänk att vi har strängarna "Välkommen Herr Jansson", "Välkommen Herr Persson" och "Välkommen Herr Svensson". Här är det motiverat med REVERSE.
  • PARALLEL: Tillåter parallella sökningar.

3. UNIQUE

Vi testar att skapa ett unikt index på kolumnen ID_NR som ändå ska vara unik:
SQL> CREATE UNIQUE INDEX idx_emp_id_nr 
ON emp(id_nr);

Index är skapat.

Detta gick bra för att vi bara har unika värden i kolumnen ID_NR.

4. BITMAP

Eftersom antalet avdelningar i DEP-tabellen är relativt få skapar vi ett bitmappat index för kolumen DEP_PK:
SQL> CREATE BITMAP INDEX bmp_emp_dep_pk
ON emp(dep_pk);

Index är skapat.

5. Multipelindex

Ett multipelindex är bra att skapa om man vill öka prestandan på SELECT-satser som baserar sig på flera kolumner. Jag råkar veta att sökningar på för- och efternamn är vanliga i just min applikation, därför vill jag skapa ett multipelindex på för- och efternamn. Det är viktigt i vilken ordning man specifierar de olika kolumnerna:
SQL> CREATE INDEX idx_emp_first_last_name
ON emp(first_name, last_name);

Index är skapat.

6. Funktionsbaserat index

Ett funktionsbaserat index skapas genom att man placerar en kolumn i ett uttryck, se exempel:
SQL> CREATE INDEX idx_func_emp_tax ON olle.emp( 0.3 * salary);

Index är skapat;

För att användaren ska kunna skapa funktionsbaserade index krävs att hon har rättigheten QUERY_REWRITE.

7. ALTER INDEX

Med ALTER INDEX kan man förändra ett index egenskaper:
ALTER INDEX indexnamn
	RENAME TO indexnamn2
	| [ENABLE | DISABLE]
	| [NO]PARALLEL [nr]
	| REBUILD{
		[[NO]REVERSE]
		[ONLINE]
		[[NO]COMPRESS [nr]]
		[[NO]PARALLEL [nr]]
		}
;
Nyckelorden har samma innebörd som vid CREATE INDEX med tillägget:

  • RENAME: Byter namn på indexet.
  • ENABLE/DISABLE: Förändrar tillgängligheten på ett funktionsbaserat index.
  • REBUILD: Bygger om indexet. Om man inte specifierar några nya parametrar byggs indexet om med existerande parametrar.
Vi testar att byta namn på ett index:
SQL> ALTER INDEX bmp_emp_dep_pk RENAME TO idx_bmp_emp_dep_pk;

Index är ändrat.

Vi testar att bygga om ett index till REVERSE:
SQL> ALTER INDEX idx_emp_id_nr REBUILD REVERSE;

Index är ändrat.

8. DROP INDEX

Ett index kan kastas med DROP INDEX:
DROP INDEX indexnamn;
Till exempel:
SQL> DROP INDEX idx_emp_first_last_name;

Index är borttaget.