CREATE INDEX — definir un nuevo índice
CREATE [ UNIQUE ] INDEX [ CONCURRENTLY ] [ [ IF NOT EXISTS ]nombre] ON [ ONLY ]nombre_tabla[ USINGmétodo] ( {nombre_columna| (expresión) } [ COLLATEcolación] [clase_operadores[ (parámetro_clase_operadores=valor[, ... ] ) ] ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ] [, ...] ) [ INCLUDE (nombre_columna[, ...] ) ] [ NULLS [ NOT ] DISTINCT ] [ WITH (parámetro_almacenamiento[=valor] [, ... ] ) ] [ TABLESPACEnombre_tablespace] [ WHEREpredicado]
CREATE INDEX construye un índice en la(s) columna(s)
especificada(s) de la relación dada, la cual puede ser una tabla o una vista
materializada. Los índices se utilizan principalmente para mejorar el rendimiento
de la base de datos (aunque un uso inadecuado puede ralentizarlo).
El o los campos clave para el índice se especifican como nombres de columna, o alternativamente como expresiones escritas entre paréntesis. Se pueden especificar múltiples campos si el método de indexación admite índices multicolumna.
Un campo de índice puede ser una expresión calculada a partir de los valores de
una o más columnas de la fila de la tabla. Esta característica se puede utilizar
para obtener un acceso rápido a los datos basándose en alguna transformación de
los datos básicos. Por ejemplo, un índice calculado sobre upper(col)
permitiría que la cláusula WHERE upper(col) = 'JIM' utilizara
un índice.
PostgreSQL proporciona los métodos de índice B-tree, hash, GiST, SP-GiST, GIN y BRIN. Los usuarios también pueden definir sus propios métodos de índice, pero esto es bastante complicado.
Cuando la cláusula WHERE está presente, se crea un
índice parcial. Un índice parcial es un índice que contiene
entradas para solo una parte de una tabla, normalmente una parte que es más útil
para indexar que el resto de la tabla. Por ejemplo, si tienes una tabla que contiene
pedidos facturados y no facturados, donde los pedidos no facturados ocupan una pequeña
fracción de la tabla total y, sin embargo, es una sección de uso frecuente, puedes
mejorar el rendimiento creando un índice solo en esa parte. Otra aplicación posible
es usar WHERE con UNIQUE para garantizar la unicidad
sobre un subconjunto de una tabla. Consulta la Section 11.8 para más detalles.
La expresión utilizada en la cláusula WHERE puede hacer referencia
solo a columnas de la tabla subyacente, pero puede usar todas las columnas, no solo
las que se están indexando. Actualmente, las subconsultas y las expresiones de agregación
también están prohibidas en WHERE. Las mismas restricciones se aplican
a los campos de índice que son expresiones.
Todas las funciones y operadores utilizados en la definición de un índice deben ser
«inmutables» (immutable), es decir, sus resultados deben depender únicamente de sus
argumentos y nunca de ninguna influencia externa (como el contenido de otra tabla o
la hora actual). Esta restricción garantiza que el comportamiento del índice esté bien
definido. Para usar una función definida por el usuario en una expresión de índice o
en una cláusula WHERE, recuerda marcar la función como inmutable
cuando la crees.
UNIQUEHace que el sistema verifique si hay 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 que den lugar a entradas duplicadas generarán un error.
Se aplican restricciones adicionales cuando se aplican índices únicos a tablas particionadas; consulta la CREATE TABLE.
CONCURRENTLYCuando se utiliza esta opción, PostgreSQL construirá el índice sin adquirir ningún bloqueo que impida inserciones, actualizaciones o eliminaciones concurrentes en la tabla; mientras que una construcción de índice estándar bloquea las escrituras (pero no las lecturas) en la tabla hasta que termina. Hay varias advertencias que debes tener en cuenta al usar esta opción; consulta Construcción de índices de forma concurrente más abajo.
Para tablas temporales, CREATE INDEX siempre es no concurrente, ya que
ninguna otra sesión puede acceder a ellas, y la creación de índices no concurrentes es
más económica.
IF NOT EXISTS
No lances un error si ya existe una relación con el mismo nombre. En este caso se emitirá
una advertencia. Ten en cuenta que no hay garantía de que el índice existente sea similar
al que se habría creado. El nombre del índice es obligatorio cuando se especifica IF NOT EXISTS.
INCLUDE
La cláusula opcional INCLUDE especifica una lista de columnas que se
incluirán en el índice como columnas que no son clave (non-key). Una columna
que no es clave no se puede usar en una condición de búsqueda de escaneo de índice, y se descarta
a efectos de cualquier restricción de unicidad o exclusión aplicada por el índice. Sin embargo,
un escaneo solo de índice (index-only scan) puede devolver el contenido de las columnas que no son
clave sin tener que visitar la tabla del índice, ya que están disponibles directamente desde la entrada
del índice. Por lo tanto, la adición de columnas que no son clave permite utilizar escaneos solo de índice
para consultas que de otro modo no podrían utilizarlos.
Es aconsejable ser conservador al añadir columnas que no son clave a un índice, especialmente columnas anchas. Si una tupla de índice supera el tamaño máximo permitido para el tipo de índice, la inserción de datos fallará. En cualquier caso, las columnas que no son clave duplican los datos de la tabla del índice y aumentan el tamaño del índice, lo que puede ralentizar las búsquedas. Además, la deduplicación de B-tree nunca se utiliza con índices que tienen una columna que no es clave.
Las columnas enumeradas en la cláusula INCLUDE no necesitan clases de operadores adecuadas;
la cláusula puede incluir columnas cuyos tipos de datos no tengan clases de operadores definidas para un
método de acceso dado.
Las expresiones no se admiten como columnas incluidas ya que no se pueden usar en escaneos solo de índice.
Actualmente, los métodos de acceso a índices B-tree, GiST y SP-GiST admiten esta característica. En estos
índices, los valores de las columnas enumeradas en la cláusula INCLUDE se incluyen en las
tuplas hoja que corresponden a las tuplas del montón (heap), pero no se incluyen en las entradas del índice
de nivel superior utilizadas para la navegación por el árbol.
nombreEl nombre del índice que se va a crear. Aquí no se puede incluir ningún nombre de esquema; el índice siempre se crea en el mismo esquema que su tabla padre. El nombre del índice debe ser distinto del nombre de cualquier otra relación (tabla, secuencia, índice, vista, vista materializada o tabla foránea) en ese esquema. Si se omite el nombre, PostgreSQL elige un nombre adecuado basado en el nombre de la tabla padre y los nombres de las columnas indexadas.
ONLYIndica que no se creen índices de forma recursiva en las particiones, si la tabla está particionada. El comportamiento predeterminado es hacerlo de forma recursiva.
nombre_tablaEl nombre (posiblemente calificado por esquema) de la tabla que se va a indexar.
método
El nombre del método de indexación que se va a utilizar. Las opciones son btree,
hash, gist, spgist, gin,
brin, o métodos de acceso instalados por el usuario como bloom.
El método predeterminado es btree.
nombre_columnaEl nombre de una columna de la tabla.
expresiónUna expresión basada en una o más columnas de la tabla. La expresión normalmente debe escribirse entre paréntesis, como se muestra en la sintaxis. Sin embargo, los paréntesis se pueden omitir si la expresión tiene la forma de una llamada a una función.
colaciónEl nombre de la colación que se va a utilizar para el índice. Por defecto, el índice utiliza la colación declarada para la columna que se va a indexar o la colación resultante de la expresión que se va a indexar. Los índices con colaciones no predeterminadas pueden ser útiles para consultas que involucren expresiones que utilicen colaciones no predeterminadas.
clase_operadoresEl nombre de una clase de operadores. Consulta más abajo para obtener detalles.
parámetro_clase_operadoresEl nombre de un parámetro de clase de operadores. Consulta más abajo para obtener detalles.
ASCEspecifica el orden de clasificación ascendente (que es el valor predeterminado).
DESCEspecifica el orden de clasificación descendente.
NULLS FIRST
Especifica que los valores nulos se clasifican antes que los no nulos. Este es el comportamiento
predeterminado cuando se especifica DESC.
NULLS LAST
Especifica que los valores nulos se clasifican después que los no nulos. Este es el comportamiento
predeterminado cuando no se especifica DESC.
NULLS DISTINCTNULLS NOT DISTINCTEspecifica si, para un índice único, los valores nulos deben considerarse distintos (no iguales). El comportamiento predeterminado es que sean distintos, de modo que un índice único pueda contener múltiples valores nulos en una columna.
parámetro_almacenamientoEl nombre de un parámetro de almacenamiento específico del método de índice. Consulta Parámetros de almacenamiento del índice más abajo para obtener detalles.
nombre_tablespaceEl tablespace en el que se creará el índice. Si no se especifica, se consulta default_tablespace, o temp_tablespaces para índices en tablas temporales.
predicadoLa expresión de restricción para un índice parcial.
La cláusula opcional WITH especifica parámetros de
almacenamiento para el índice. Cada método de índice tiene su propio conjunto
de parámetros de almacenamiento permitidos.
Los métodos de índice B-tree, hash, GiST y SP-GiST aceptan este parámetro:
fillfactor (integer)
#Controla qué tan llenas intentará empaquetar las páginas de índice el método de indexación. Para los B-trees, las páginas hoja se llenan hasta este porcentaje durante la creación inicial del índice, y también al extender el índice a la derecha (añadiendo nuevos valores clave más grandes). Si las páginas posteriormente se llenan por completo, se dividirán, lo que provocará la fragmentación de la estructura del índice en disco. Los B-trees utilizan un factor de relleno (fillfactor) predeterminado de 90, pero se puede seleccionar cualquier valor entero de 10 a 100.
Los índices B-tree en tablas donde se prevén muchas inserciones y/o actualizaciones pueden beneficiarse de
configuraciones de factor de relleno más bajas en el momento de ejecutar CREATE INDEX (después
de una carga masiva en la tabla). Los valores en el rango de 50 a 90 pueden ser útiles para «suavizar» la
tasa de divisiones de páginas durante la vida temprana del índice B-tree (reducir el
factor de relleno de esta manera puede incluso reducir el número absoluto de divisiones de páginas, aunque
este efecto depende en gran medida de la carga de trabajo). La técnica de eliminación de índices de abajo hacia
arriba de B-tree descrita en la Section 65.1.4.2 depende de tener algo de espacio «adicional»
en las páginas para almacenar versiones de tuplas «adicionales», por lo que puede verse afectada por el factor
de relleno (aunque el efecto no suele ser significativo).
In otros casos específicos, podría ser útil aumentar el factor de relleno a 100 en el momento de ejecutar
CREATE INDEX como una forma de maximizar la utilización del espacio. Solo debes considerar
esto cuando estés completamente seguro de que la tabla es estática (es decir, que nunca se verá afectada por
inserciones o actualizaciones). De lo contrario, una configuración de factor de relleno de 100 corre el riesgo de
perjudicar el rendimiento: incluso unas pocas actualizaciones o inserciones provocarán una
oleada repentina de divisiones de páginas.
Los otros métodos de índice utilizan el factor de relleno de formas diferentes pero aproximadamente análogas; el factor de relleno predeterminado varía según el método.
Los índices B-tree aceptan adicionalmente este parámetro:
deduplicate_items (boolean)
#
Controla el uso de la técnica de deduplicación de B-tree descrita en la Section 65.1.4.3.
Establécelo en ON u OFF para habilitar o deshabilitar la optimización.
(Se permiten grafías alternativas de ON y OFF como se describe en la
Section 19.1.) El valor predeterminado es ON.
Desactivar deduplicate_items a través de ALTER INDEX evita que futuras
inserciones activen la deduplicación, pero no hace en sí mismo que las tuplas de la lista de publicaciones
existentes utilicen la representación de tupla estándar.
Los índices GiST aceptan adicionalmente este parámetro:
buffering (enum)
#
Controla si se utiliza la técnica de construcción con búfer descrita en la Section 65.2.4.1
para construir el índice. Con OFF la técnica con búfer se deshabilita, con ON
se habilita, y con AUTO se deshabilita inicialmente, pero se activa sobre la marcha una vez que
el tamaño del índice alcanza el valor de effective_cache_size. El valor predeterminado
está en AUTO. Ten en cuenta que si la construcción ordenada es posible, se utilizará en su lugar
de la construcción con búfer a menos que se especifique buffering=ON.
Los índices GIN aceptan estos parámetros:
fastupdate (boolean)
#
Controla el uso de la técnica de actualización rápida descrita en la Section 65.4.4.1.
ON habilita la actualización rápida, OFF la deshabilita.
El valor predeterminado es ON.
Desactivar fastupdate a través de ALTER INDEX evita que futuras
inserciones vayan a la lista de entradas de índice pendientes, pero no purga por sí mismo las entradas existentes.
Es posible que desees ejecutar un VACUUM en la tabla o llamar a la función
gin_clean_pending_list después para asegurarte de que la lista de pendientes se vacíe.
gin_pending_list_limit (integer)
#Sobrescribe la configuración global de gin_pending_list_limit para este índice. Este valor se especifica en kilobytes.
Los índices BRIN aceptan estos parámetros:
pages_per_range (integer)
#
Define el número de bloques de tabla que componen un rango de bloques para cada entrada de un índice
BRIN (consulta la Section 65.5.1 para más detalles). El valor predeterminado
es 128.
autosummarize (boolean)
#
Define si se pone en cola una ejecución de resumen para el rango de páginas anterior cada vez que se detecta
una inserción en el siguiente (consulta la Section 65.5.1.1 para más detalles).
El valor predeterminado es off.
La creación de un índice puede interferir con el funcionamiento habitual de una base de datos. Normalmente, PostgreSQL bloquea la tabla que se va a indexar contra escrituras y realiza toda la construcción del índice con un único escaneo de la tabla. Otras transacciones pueden seguir leyendo la tabla, pero si intentan insertar, actualizar o eliminar filas en la tabla, se bloquearán hasta que termine la construcción del índice. Esto podría tener un efecto grave si el sistema es una base de datos de producción activa. Las tablas muy grandes pueden tardar muchas horas en indexarse, e incluso para tablas más pequeñas, la construcción de un índice puede bloquear a los escritores durante períodos que son inacceptablemente largos para un sistema de producción.
PostgreSQL admite la construcción de índices sin bloquear las escrituras. Este método
se invoca especificando la opción CONCURRENTLY de CREATE INDEX. Cuando se
utiliza esta opción, PostgreSQL debe realizar dos escaneos de la tabla y, además, debe
esperar a que terminen todas las transacciones existentes que potencialmente podrían modificar o utilizar el índice.
Por lo tanto, este método requiere más trabajo total que una construcción de índice estándar y tarda significativamente
más tiempo en completarse. Sin embargo, dado que permite que continúen las operaciones normales mientras se construye
el índice, este método es útil para añadir nuevos índices en un entorno de producción. Por supuesto, la carga adicional
de CPU e E/S impuesta por la creación del índice podría ralentizar otras operaciones.
En una construcción de índice concurrente, el índice se introduce en realidad como un índice «inválido» (invalid) en
los catálogos del sistema en una transacción, luego se realizan dos escaneos de tabla en otras dos transacciones.
Antes de cada escaneo de tabla, la construcción del índice debe esperar a que terminen las transacciones existentes
que han modificado la tabla. Después del segundo escaneo, la construcción del índice debe esperar a que termine cualquier
transacción que tenga una instantánea (snapshot, consulta la Chapter 13) anterior al segundo escaneo,
incluidas las transacciones utilizadas por cualquier fase de construcciones de índices concurrentes en otras tablas, si
los índices involucrados son parciales o tienen columnas que no son referencias a columnas simples. Luego, finalmente,
el índice se puede marcar como «válido» (valid) y listo para usar, y el comando CREATE INDEX termina.
Incluso entonces, sin embargo, es posible que el índice no se pueda utilizar inmediatamente para consultas: en el peor
de los casos, no se puede utilizar mientras existan transacciones anteriores al inicio de la construcción del índice.
Si surge un problema al escanear la tabla, como un bloqueo mutuo (deadlock) o una violación de unicidad en un índice único,
el comando CREATE INDEX fallará pero dejará un índice «inválido». Este índice se ignorará para fines
de consulta porque podría estar incompleto; sin embargo, seguirá consumiendo sobrecoste de actualización. El comando
\d de psql informará de dicho índice como INVALID:
postgres=# \d tab
Table "public.tab"
Column | Type | Collation | Nullable | Default
--------+---------+-----------+----------+---------
col | integer | | |
Indexes:
"idx" btree (col) INVALID
El método de recuperación recomendado en tales casos es eliminar el índice e intentar de nuevo realizar
CREATE INDEX CONCURRENTLY. (Otra posibilidad es reconstruir el índice con
REINDEX INDEX CONCURRENTLY).
Otra advertencia al construir un índice único de forma concurrente es que la restricción de unicidad ya se está aplicando contra otras transacciones cuando comienza el segundo escaneo de la tabla. Esto significa que podrían reportarse violaciones de restricciones en otras consultas antes de que el índice esté disponible para su uso, o incluso en casos donde la construcción del índice finalmente falle. Además, si se produce un fallo en el segundo escaneo, el índice «inválido» sigue aplicando su restricción de unicidad después.
Se admite la construcción concurrente de índices de expresiones e índices parciales. Los errores que ocurran en la evaluación de estas expresiones podrían provocar un comportamiento similar al descrito anteriormente para las violaciones de restricciones únicas.
Las construcciones de índices regulares permiten que ocurran simultáneamente otras construcciones de índices regulares en la
misma tabla, pero solo puede ocurrir una construcción de índice concurrente en una tabla a la vez. En cualquier caso, no se
permite la modificación del esquema de la tabla mientras se construye el índice. Otra diferencia es que un comando
CREATE INDEX regular se puede realizar dentro de un bloque de transacción, pero
CREATE INDEX CONCURRENTLY no.
Actualmente no se admiten construcciones concurrentes para índices en tablas particionadas. Sin embargo, puedes construir de forma concurrente el índice en cada partición individualmente y luego finalmente crear el índice particionado de forma no concurrente para reducir el tiempo en el que se bloquearán las escrituras en la tabla particionada. En este caso, la construcción del índice particionado es una operación de solo metadatos.
Consulta la Chapter 11 para obtener información sobre cuándo se pueden usar los índices, cuándo no se usan y en qué situaciones particulares pueden ser útiles.
Actualmente, solo los métodos de índice B-tree, GiST, GIN y BRIN admiten índices de múltiples columnas clave. El hecho de que pueda
haber múltiples columnas clave es independiente de si se pueden añadir columnas INCLUDE al índice. Los índices
pueden tener hasta 32 columnas, incluidas las columnas INCLUDE. (Este límite se puede alterar al compilar
PostgreSQL.) Actualmente, solo B-tree admite índices únicos.
Se puede especificar una clase de operadores con parámetros opcionales para cada columna de un índice.
La clase de operadores identifica los operadores que utilizará el índice para esa columna. Por ejemplo, un índice B-tree en enteros
de cuatro bytes utilizaría la clase int4_ops; esta clase de operadores incluye funciones de comparación para
enteros de cuatro bytes. En la práctica, la clase de operadores predeterminada para el tipo de datos de la columna suele ser suficiente.
El punto principal de tener clases de operadores es que para algunos tipos de datos, podría haber más de un ordenamiento significativo.
Por ejemplo, podríamos querer ordenar un tipo de datos de números complejos ya sea por valor absoluto o por parte real. Podríamos hacer
esto definiendo dos clases de operadores para el tipo de datos y luego seleccionando la clase adecuada al crear un índice. Para más
información sobre las clases de operadores, consulta la Section 11.10 y la Section 36.16.
Cuando se invoca CREATE INDEX en una tabla particionada, el comportamiento predeterminado es hacerlo de forma recursiva
en todas las particiones para garantizar que todas tengan índices coincidentes. Primero se comprueba cada partición para determinar si
ya existe un índice equivalente, y si es así, ese índice se asociará como un índice de partición al índice que se está creando, que se
convertirá en su índice padre. Si no existe un índice coincidente, se creará un nuevo índice y se asociará automáticamente; el nombre del
nuevo índice en cada partición se determinará como si no se hubiera especificado ningún nombre de índice en el comando. Si se especifica
la opción ONLY, no se realiza recursión y el índice se marca como inválido. (ALTER INDEX ... ATTACH PARTITION
marca el índice como válido una vez que todas las particiones adquieren índices coincidentes). Ten en cuenta, sin embargo, que cualquier
partición que se cree en el futuro utilizando CREATE TABLE ... PARTITION OF tendrá automáticamente un índice coincidente,
independientemente de si se especifica ONLY.
Para los métodos de índice que admiten escaneos ordenados (actualmente, solo B-tree), se pueden especificar las cláusulas opcionales
ASC, DESC, NULLS FIRST, y/o NULLS LAST para modificar el orden de
clasificación del índice. Dado que un índice ordenado se puede escanear tanto hacia adelante como hacia atrás, no suele ser útil crear un
índice DESC de una sola columna; ese orden de clasificación ya está disponible con un índice normal. El valor de estas
opciones es que se pueden crear índices multicolumna que coincidan con el orden de clasificación solicitado por una consulta de orden mixto,
como SELECT ... ORDER BY x ASC, y DESC. Las opciones de NULLS son útiles si necesitas admitir el
comportamiento de «nulos clasificados abajo» (nulls sort low), en lugar del predeterminado «nulos clasificados arriba» (nulls sort high),
en consultas que dependen de índices para evitar pasos de ordenamiento.
El sistema recopila regularmente estadísticas sobre todas las columnas de una tabla. Los índices que no son expresiones creados recientemente
pueden utilizar inmediatamente estas estadísticas para determinar la utilidad de un índice. Para los nuevos índices de expresiones, es
necesario ejecutar ANALYZE o esperar a que el demonio de
autovacuum analice la tabla para generar estadísticas para estos índices.
Mientras se ejecuta CREATE INDEX, el search_path se cambia temporalmente a pg_catalog,
pg_temp.
Para la mayoría de los métodos de índice, la velocidad de creación de un índice depende de la configuración de maintenance_work_mem. Los valores más grandes reducirán el tiempo necesario para la creación de índices, siempre que no lo hagas más grande que la cantidad de memoria realmente disponible, lo que provocaría que la máquina entre en intercambio (swapping).
PostgreSQL puede construir índices aprovechando múltiples CPU para procesar las filas de la tabla más rápidamente.
Esta característica se conoce como construcción paralela de índices. Para los métodos de índice que admiten la
construcción de índices en paralelo (actualmente, B-tree, GIN y BRIN), maintenance_work_mem especifica la cantidad máxima
de memoria que puede utilizar cada operación de construcción de índice en su conjunto, independientemente de cuántos procesos trabajadores se
hayan iniciado. Generalmente, un modelo de costos determina automáticamente cuántos procesos trabajadores deben solicitarse, si es que se solicita alguno.
Las construcciones paralelas de índices pueden beneficiarse de un aumento de maintenance_work_mem donde una construcción de
índice secuencial equivalente verá poco o ningún beneficio. Ten en cuenta que maintenance_work_mem puede influir en el número
de procesos trabajadores solicitados, ya que los trabajadores paralelos deben tener al menos una participación de 32MB del presupuesto
total de maintenance_work_mem. También debe haber una participación restante de 32MB para el proceso líder. El
aumento de max_parallel_maintenance_workers puede permitir que se utilicen más trabajadores, lo que reducirá el tiempo necesario
para la creación de índices, siempre y cuando la construcción del índice no esté ya limitada por E/S. Por supuesto, también debe haber suficiente capacidad
de CPU que de otro modo permanecería ociosa.
Establecer un valor para parallel_workers a través de ALTER TABLE controla
directamente cuántos procesos trabajadores paralelos solicitará un CREATE INDEX contra la tabla. Esto elude el modelo de costos
por completo y evita que maintenance_work_mem afecte al número de trabajadores paralelos solicitados. Establecer
parallel_workers en 0 a través de ALTER TABLE deshabilitará la construcción paralela de índices en la tabla
en todos los casos.
Es posible que desees restablecer parallel_workers después de establecerlo como parte del ajuste de una construcción de índice.
Esto evita cambios involuntarios en los planes de consulta, ya que parallel_workers afecta a todos los
escaneos paralelos de tablas.
Aunque CREATE INDEX con la opción CONCURRENTLY admite construcciones paralelas sin restricciones especiales,
solo el primer escaneo de la tabla se realiza realmente en paralelo.
Utiliza DROP INDEX para eliminar un índice.
Al igual que cualquier transacción de larga duración, un CREATE INDEX en una tabla puede afectar a qué tuplas puede eliminar un
VACUUM concurrente en cualquier otra tabla.
Las versiones anteriores de PostgreSQL también tenían un método de índice R-tree. Este método se ha eliminado porque no
tenía ventajas significativas sobre el método GiST. Si se especifica USING rtree, CREATE INDEX lo interpretará
como USING gist para simplificar la conversión de bases de datos antiguas a GiST.
Cada proceso backend que ejecuta CREATE INDEX informará de su progreso en la vista
pg_stat_progress_create_index. Consulta la Section 27.4.4 para obtener detalles.
Para crear un índice B-tree único en la columna title en la tabla films:
CREATE UNIQUE INDEX title_idx ON films (title);
Para crear un índice B-tree único en la columna title con las columnas incluidas director
y rating en la tabla films:
CREATE UNIQUE INDEX title_idx ON films (title) INCLUDE (director, rating);
Para crear un índice B-Tree con deduplicación deshabilitada:
CREATE INDEX title_idx ON films (title) WITH (deduplicate_items = off);
Para crear un índice en la expresión lower(title), lo que permite búsquedas eficientes que no distinguen entre mayúsculas y minúsculas:
CREATE INDEX ON films ((lower(title)));
(En este ejemplo hemos elegido omitir el nombre del índice, por lo que el sistema elegirá un nombre, normalmente films_lower_idx.)
Para crear un índice con colación no predeterminada:
CREATE INDEX title_idx_german ON films (title COLLATE "de_DE");
Para crear un índice con ordenamiento de nulos no predeterminado:
CREATE INDEX title_idx_nulls_low ON films (title NULLS FIRST);
Para crear un índice con factor de relleno no predeterminado:
CREATE UNIQUE INDEX title_idx ON films (title) WITH (fillfactor = 70);
Para crear un índice GIN con actualizaciones rápidas deshabilitadas:
CREATE INDEX gin_idx ON documents_table USING GIN (locations) WITH (fastupdate = off);
Para crear un índice en la columna code en la tabla films y hacer que el índice resida en el tablespace
indexspace:
CREATE INDEX code_idx ON films (code) TABLESPACE indexspace;
Para crear un índice GiST sobre un atributo de punto de modo que podamos usar eficientemente operadores de caja sobre el resultado de la función de conversión:
CREATE INDEX pointloc
ON points USING gist (box(location,location));
SELECT * FROM points
WHERE box(location,location) && '(0,0),(1,1)'::box;
Para crear un índice sin bloquear las escrituras en la tabla:
CREATE INDEX CONCURRENTLY sales_quantity_index ON sales_table (quantity);
CREATE INDEX es una extensión del lenguaje de PostgreSQL.
No existen provisiones para índices en el estándar SQL.