Pruebe con un índice de varias columnas, pero con el orden inverso en la segunda columna:
CREATE INDEX index_ips_begin_end_ip_num ON ips (begin_ip_num, end_ip_num DESC);
El orden es en su mayoría irrelevante para un índice de una sola columna, ya que se puede escanear hacia atrás casi con la misma rapidez. Pero es importante para los índices de varias columnas.
Con el índice que propongo, Postgres puede escanear la primera columna y encontrar la dirección, donde el resto del índice cumple la primera condición. Entonces puede, para cada valor de la primera columna, devolver todas las filas que cumplan la segunda condición, hasta que la primera falle. Luego salte al siguiente valor de la primera columna, etc.
Esto todavía no es muy eficiente y Postgres puede ser más rápido simplemente escaneando la primera columna de índice y filtrando la segunda. Mucho depende de su distribución de datos.
De cualquier manera, CLUSTER
usando el índice de varias columnas de arriba puede rendimiento de ayuda:
CLUSTER ips USING index_ips_begin_end_ip_num
De esta forma, los candidatos que cumplen su primera condición se empaquetan en las mismas páginas de datos o en páginas adyacentes. Puede ayudar mucho al rendimiento si tiene muchas filas por valor de la primera columna. De lo contrario, es poco efectivo.
(También hay herramientas externas que no bloquean para este propósito:pg_repack o pg_squeeze.)
Además, el vacío automático se está ejecutando y está configurado correctamente o ha ejecutado ANALYZE
¿en la mesa? Necesita estadísticas actuales para que Postgres elija los planes de consulta apropiados.
Lo que realmente ayudaría aquí es un índice GiST para un int8range
columna, disponible desde PostgreSQL 9.2.
Lectura adicional:
- Optimización de consultas en un rango de marcas de tiempo (dos columnas)
Si sus rangos de IP se pueden cubrir con uno de los tipos de red integrados inet
o cidr
, considere reemplazar sus dos bigint
columnas O, mejor aún, busca el módulo adicional ip4r por Andrew Gierth (no en la distribución estándar. La estrategia de indexación cambia en consecuencia.
Salvo eso, puede consultar esta respuesta relacionada en dba.SE con el uso de un régimen sofisticado con índices parciales. Cosas avanzadas, pero ofrece un gran rendimiento:
- ¿Puede el índice espacial ayudar a una consulta de "rango - ordenar por - límite"