Documentazione di PostgreSQL 9.0 > Il linguaggio SQL > Indici > Classi operatore e famiglie di operatori
PrecedenteIndici parzialiControllare l'utilizzo dell'indiceSuccessivo

11.9. Classi operatore e famiglie di operatori

Una definizione di indice può specificare una classe operatore per ogni colonna di un indice.

CREATE INDEX name ON table (column opclass [sort options] [, ...]);

Le classe operatore identifica gli operatori che saranno usati dall'indice per quella colonna. Per esempio, un indice B-tree sul tipo int4 userebbe la classe int4_ops; questa classe operatore include funzioni di confronto per valori di tipo int4. In pratica la classe operatore predefinita per il tipo dato della colonna è normalmente sufficiente. Il motivo principale per avere le classi operatore è che per certi tipi di dato, ci potrebbero essere più di un comportamento significativo per l'indice. Per esempio, si porebbe voler ordinare un tipo dato numerico complesso o per il suo valore assoluto oppure per la sua parte reale. Si potrebbe fare questo definendo per il tipo dato due classi operatore e quindi selezionare la classe appropriata quando si imposta un indice. La classe operatore determina il tipo di ordinamento di base (che potrà essere modificato aggiungendo le opzione di ordinamento ASC/DESC e/o NULLS FIRST/NULLS LAST).

Inoltre, ci sono altre classi operatore incorporate oltre quella predefinita:

  • Le classi operatore text_pattern_ops, varchar_pattern_ops, bpchar_pattern_ops, e name_pattern_ops supportano indici B-tree, rispettivamente, sui tipi text, varchar, char, e name. La diffferenza dalle classi operatore preimpostate è che i valori sono confrontati carattere per carattere piuttosto che seguendo le regole di collazione specificate localmente. Ciò rende queste classi operatore adatte per l'uso in query che coinvolgono espressioni di corrispondenza modelli (LIKE o espressioni regolari POSIX) quando il server non usa lo standard «C» locale. Come esempio, si potrebbe indicizzare una colonna varchar come questa:

    CREATE INDEX test_index ON test_table (col varchar_pattern_ops);
    

    Notare che bisognerebbe creare un indice con la classe operatore predefinita se si vogliono query che comportano confronti comuni nell'uso di un indice. Tali query non possono usare le classi operatore xxx_pattern_ops. È consentito creare indici multipli sulla stessa colonna con diverse classi operatore. Se si utilizza il C locale, non ci sarà bisogno delle classi operatore xxx_pattern_ops, perchè per query di corrispondenza modelli nel C locale, si può utilizzare un indice con la classe operatore predefinita.

La query seguente mostra tutte le classi operatore definite:

SELECT am.amname AS index_method,
       opc.opcname AS opclass_name
    FROM pg_am am, pg_opclass opc
    WHERE opc.opcmethod = am.oid
    ORDER BY index_method, opclass_name;

Una classe operatore è semplicemente un sottoinsieme di una struttura maggiore chiamata famiglia dell'operatore. Nei casi in cui diversi tipi di dato hanno comportamenti simili, è spesso utile definire operatori per tipi-dato-incrociati e consentirgli di lavorare con indici. Per fare questo, le classi operatore per ciascun tipo dovranno essere raggruppate dentro la stessa famiglia di operatori. Gli operatori di tipo-incrociato sono membri della famiglia, ma non sono associati con nessuna singola classe all'interno della famiglia.

This query shows all defined operator families and all the operators included in each family:

SELECT am.amname AS index_method,
       opf.opfname AS opfamily_name,
       amop.amopopr::regoperator AS opfamily_operator
    FROM pg_am am, pg_opfamily opf, pg_amop amop
    WHERE opf.opfmethod = am.oid AND
          amop.amopfamily = opf.oid
    ORDER BY index_method, opfamily_name, opfamily_operator;

Documentazione di PostgreSQL 9.0 > Il linguaggio SQL > Indici > Classi operatore e famiglie di operatori
PrecedenteIndici parzialiControllare l'utilizzo dell'indiceSuccessivo