Indices en Postgresql

Embed Size (px)

Citation preview

Al crear una PK postgresql automticamente le crea un ndice.Cuando tu haces una consulta el planificador calcula si es necesario y mejor usar un indice o no, este trabajo suele dejarse al planificador, aunque puedes forzar el uso o no de un indice, pero no creo que lo necesites.A parte de los indices que crea postgresql (al crear una PK, al definir un campo como UNIQUE), puedes crear indices en los campos que creas necesarios para mejorar el rendimiento de las consultas.por ejemplo, tienes una tabla personas:id serial primary key, -- Aqui te crea un indice por ser PKnombre varchar,apellidos varchar,dni varchar UNIQUE, -- Aqui te crea un indice por ser uniquef_nacimiento date

Ahora imagina que buscas sobre las personas preguntando por su fecha de nacimiento, como por ejemplo:select id from personas where f_nacimiento < '01/01/1990'

Esta select hace un recorrido secuencial, es decir, si tienes 1 millon de personas, tiene que recorrer 1 millon de registros.

CREATE INDEX nombre_indice ON personas (f_nacimiento);Ahora cuando utilizar el indice para la select anterior, la diferencia de rendimiento es muy notoria.pruebas=# create table personas(id serial primary key, nombre varchar, dni integer);NOTICE: CREATE TABLE crear una secuencia implcita personas_id_seq para la columna serial personas.idNOTICE: CREATE TABLE / PRIMARY KEY crear el ndice implcito personas_pkey para la tabla personasCREATE TABLEpruebas=# insert into personas (nombre, dni) select 'nombre ' || foo, foo from generate_series(1,100000) foo;INSERT 0 100000pruebas=# EXPLAIN ANALYZE select * from personas where dni between 2500 AND 5000; QUERY PLAN------------------------------------------------------------------------------------------------------------- Seq Scan on personas (cost=0.00..2133.00 rows=2497 width=20) (actual time=1.425..74.737 rows=2501 loops=1) Filter: ((dni >= 2500) AND (dni = 2500) AND (dni