CREATE INDEX

Nombre

CREATE INDEX  --  Construir un índice secundario.

Synopsis

CREATE [ UNIQUE ] INDEX nombre_indice ON tabla
    [ USING nombre_acceso ] ( columna [ nombre_operador] [, ...] )
CREATE [ UNIQUE ] INDEX nombre_indice ON tabla
    [ USING nombre_acceso ] ( nombre_funcion( r">columnale> [, ... ]) nombre_operador )
  

Entradas

UNIQUE

Proboca que el sistema compruebe si existen valores duplicados en la tabla cuando se crea el índice (si ya existen datos) y cada vez que se añaden datos. Los intentos de insertar o actualizar datos duplicados generarán un error.

nombre_indice

El nombre del índice que se debe crear.

tabla

El nombre de la tabla para la que se quiere crear un índice.

nombre_acceso

El nombre del método de acceso que se utilizará para el índice. El método de acceso de defecto es BTREE. Postgres proporciona tres métodos de acceso para índices secundarios.

BTREE

una implementación de los btrees de alta concurrencia de Lehman-Yao.

RTREE

Implementa rtrees estándar utilizando el algoritmo de partición cuadrática de Guttman.

HASH

Una implementación de las dispersiones lineales de Litwin.

columna

El nombre de una columna de la tabla.

nombre_operador

Una clase de operadores asociada. Vea más abajo para obtener más detalles.

nombre_función

Una función definida por el usuario, que devuelve un valor que puede ser indexado.

Salidas

CREATE

El mensaje devuelto si el índice se ha creado con éxito.

ERROR: Cannot create index: 'index_name' already exists.

Se presenta este error si es imposible crear el índice.

Description

CREATE INDEX construye un índice nombre_indice en la tabla especificada.

Sugerencia

Los índices se utilizan principalmente para incrementar el rendimiento de una base de datos. Sin embargo, un uso inapropiado de los índices dará lugar a una base de datos más lenta.

En la primera sintaxis mostrada antes, los campos claves para el índice se especifican como nombres de columna; una columna puede tener también una clase de operadores asociada. Una clase de operadores se utiliza para especificar los operadores que se utilizarán para un índice particular. Por ejemplo, un índice btree sobre enteros de cuatro_bytes debería utilizar la clase int4_ops; esta clase de operadores incluye funciones de comparación para enteros de cuatro_bytes. La clase de operadores de defecto es la apropiada para ese tipo de datos.

En la segunda sintaxis mostrada antes, se definía un índice como resultado de una función definida por el usuario nombre_funcion aplicada a uno o más atributos de una única clase. Estos índices funcionales pueden utilizarse para conseguir un acceso rápido a datos basados en operadores que normalmente requerirían algún tipo de transformación para aplicarlos a la base de datos.

Postgres proporciona métodos de acceso btree, rtree y hash para los índices secundarios. El método de acceso btree es una implementación de los btrees de alta concurrencia de Lehman-Yao. El método de acceso rtree implementa el algoritmo de partición cuadrática estándar de Guttman. El método de acceso hash es una implementación de las dispersiones lineales de Litwin. Mencionamos los algoritmos utilizados sólamente para indicar que todos estos métodos de acceso son completamente dinámicos, y no necesitan ser optimizados periódicamente (como es el caso, por ejemplo, de los métodos de acceso de hash estático).

Notas

El optimizador de consultas de Postgres considerará que está usando índices btree en un barrido, siempre que un atributo indexado esté involucrado en una comparación que utilice uno de los siguientes: <, <=, =, >=, >

Ambas clases de caja (box) soportan índices en el tipo de datos caja (box) en Postgres. La diferencia entre ellas es que bigbox_ops escala coordenadas de caja hacia abajo, para impedir excepciones de punto flotante que se pudiesen producir en multiplicaciones, sumas y restas de coordenadas de punto flotante muy grandes. Si el campo al cual se unen sus rectángulos es de alrededor de 20.000 unidades cuadradas o mayor, debería usted utilizar bigbox_ops. La clase de operadores poly_ops soporta índices rtree en datos poligonales.

El optimizador de consultas de Postgres considerará que está utilizando un indice rtree siempre que un atributo indexado esté involucrado en una comparación que utilice uno de los siguientes: <<, &<, &>, >>, @, ~=, &&

El optimizador de consultas de Postgres considerará que está utilizando un índice hash siempre que un atributo del índice esté involucrado en una comparación que utilice el operador =.

Actualmente, sólo el método de acceso BTREE soporta índices multi-columna. Se pueden especificar hasta 7 claves.

Utilice DROP INDEX para eliminar un índice.

La clase de operadores int24_ops se puede utilizar para construir índices sobre datos int2, y realizar comparaciones contra datos int4 en cualificaciones de consultas. Similarmente, int42_ops soporta índices sobre datos int4 que deben ser comparados con datos int2 en las consultas.

La siguiente lista select devuelve todos los nombres de operador:

SELECT am.amname AS acc_name,
       opc.opcname AS ops_name,
       opr.oprname AS ops_comp
    FROM pg_am am, pg_amop amop,
         pg_opclass opc, pg_operator opr
    WHERE amop.amopid = am.oid AND
          amop.amopclaid = opc.oid AND
          amop.amopopr = opr.oid
    ORDER BY acc_name, ops_name, ops_comp
    

Usage

Para crear un índice en el campo título en la tabla películas:

CREATE UNIQUE INDEX índice_título
    ON películas (título);
  

Compatibilidad.

SQL92

CREATE INDEX es una extensión del lenguaje de Postgres.

No hay un comando CREATE INDEX en SQL92.