Se pueden crear índices GiST y SP-GiST para columnas de tabla de tipos temporales. El índice GiST implementa un árbol R, mientras que el índice SP-GiST implementa un árbol cuádruple n-dimensional. Ejemplos de creación de índices son los siguientes:
CREATE INDEX Department_NoEmps_Gist_Idx ON Department USING Gist(NoEmps); CREATE INDEX Trips_Trip_SPGist_Idx ON Trips USING SPGist(Trip);
Los índices GiST y SP-GiST almacenan el cuadro delimitador para los tipos temporales. Como se explica en el Capítulo 4, Tipos temporales, estos son
el tipo tstzspan
para los tipos tbool
y ttext
,
el tipo tbox
par los tipos tint
y tfloat
,
el tipo stbox
para los tipos tgeompoint
y tgeogpoint
.
Un índice GiST o SP-GiST puede acelerar las consultas que involucran a los siguientes operadores (consulte la “Operadores de cuadro delimitador” para obtener más información):
<<
, &<
, &>
, >>
, que sólo consideran la dimensión de valores en tipos alfanuméricos temporales,
<<
, &<
, &>
, >>
, <<|
, &<|
, |&>
, |>>
, &</
, <</
, />>
y /&>
, que sólo consideran la dimensión espacial en tipos de puntos temporales,
&<#
, <<#
, #>>
, #&>
, que sólo consideran la dimensión temporal para todos los tipos temporales,
&&
, @>
, <@
, ~=
y |=|
, que consideran tantas dimensiones como compartan la columna indexada y el argumento de consulta. Estos operadores trabajan en cuadros delimitadores (es decir, tstzspan
, tbox
o stbox
), no los valores completos.
Por ejemplo, dado el índice definido anteriormente en la tabla Department
y una consulta que implica una condición con el operador &&
(superposición), si el argumento derecho es un flotante temporal, entonces se consideran tanto el valor como las dimensiones de tiempo para filtrar las tuplas de la relación, mientras que si el argumento derecho es un valor flotante, un rango flotante o un tipo de tiempo, entonces el valor o la dimensión de tiempo se utilizará para filtrar las tuplas de la relación. Además, se puede construir un cuadro delimitador a partir de un valor/rango y/o una marca de tiempo/período, que se puede usar para filtrar las tuplas de la relación. Ejemplos de consultas que utilizan el índice en la tabla Department
definida anteriormente se dan a continuación.
SELECT * FROM Department WHERE NoEmps && intspan '[1, 5)'; SELECT * FROM Department WHERE NoEmps && tstzspan '[2001-04-01, 2001-05-01)'; SELECT * FROM Department WHERE NoEmps && tbox(intspan '[1, 5)', tstzspan '[2001-04-01, 2001-05-01)'); SELECT * FROM Department WHERE NoEmps && tfloat '{[1@2001-01-01, 1@2001-02-01), [5@2001-04-01, 5@2001-05-01)}';
Del mismo modo, los ejemplos de consultas que utilizan el índice en la tabla Trips
definida anteriormente se dan a continuación.
SELECT * FROM Trips WHERE Trip && geometry 'Polygon((0 0,0 1,1 1,1 0,0 0))'; SELECT * FROM Trips WHERE Trip && timestamptz '2001-01-01'; SELECT * FROM Trips WHERE Trip && tstzspan '[2001-01-01, 2001-01-05)'; SELECT * FROM Trips WHERE Trip && stbox(geometry 'Polygon((0 0,0 1,1 1,1 0,0 0))', tstzspan '[2001-01-01, 2001-01-05]'); SELECT * FROM Trips WHERE Trip && tgeompoint '{[Point(0 0)@2001-01-01, Point(1 1)@2001-01-02, Point(1 1)@2001-01-05)}';
Finalmente, se pueden crear índices de árbol B para columnas de tabla de todos los tipos temporales. Para este tipo de índice, la única operación útil es la igualdad. Hay un orden de clasificación de árbol B definido para valores de tipos temporales, con los correspondientes operadores <
, <=
, >
y >=
, pero el orden es bastante arbitrario y no suele ser útil en el mundo real. El soporte de árbol B para tipos temporales está destinado principalmente a permitir la clasificación interna en las consultas, en lugar de la creación de índices reales.
Para acelerar algunas de las funciones de los tipos temporales, se puede agregar en la cláusula WHERE
de las consultas una comparación de cuadro delimitador que hace uso de los índices disponibles. Por ejemplo, este sería típicamente el caso de las funciones que proyectan los tipos temporales a las dimensiones de valor/espacio y/o tiempo. Esto filtrará las tuplas con un índice como se muestra en la siguiente consulta.
SELECT atTime(T.Trip, tstzspan '[2001-01-01, 2001-01-02)') FROM Trips T -- Filtro de índice con cuadro delimitador WHERE T.Trip && tstzspan '[2001-01-01, 2001-01-02)';
En el caso de los puntos temporales, todas las relaciones espaciales con la semántica posible (ver la “Relaciones espaciales”) incluyen automáticamente una comparación de cuadro delimitador que hará uso de cualquier índice que esté disponible en los puntos temporales. Por esta razón, la primera versión de las relaciones se usa típicamente para filtrar las tuplas con la ayuda de un índice al calcular las relaciones temporales como se muestra en la siguiente consulta.
SELECT tintersects(T.Trip, R.Geom) FROM Trips T, Regions R -- Filtro de índice con cuadro delimitador WHERE intersects(T.Trip, R.Geom);