La consulta PostgreSQL lleva demasiado tiempo
Tengo base de datos con unos pocos cientos de millones de filas. Estoy ejecutando la siguiente consulta:
select * from "Payments" as p
inner join "PaymentOrders" as po
on po."Id" = p."PaymentOrderId"
inner join "Users" as u
On u."Id" = po."UserId"
INNER JOIN "Roles" as r
on u."RoleId" = r."Id"
Where r."Name" = 'Moses'
LIMIT 1000
Cuando la cláusula where encuentra una coincidencia en la base de datos, obtengo el resultado en varios milisegundos, pero si modifico la consulta y especifico una inexistenter."Name"
en donde cláusula, se tarda demasiado tiempo en completarse. Supongo que PostgreSQL está haciendo un escaneo secuencial en elPayments
Tabla (que contiene la mayoría de las filas), comparando cada fila una por una.
¿No es postgresql lo suficientemente inteligente como para comprobar primero siRoles
tabla contiene cualquier fila conName
'Moses'
?
La tabla de roles solo contiene 15 filas, mientras que los pagos contienen ~ 350 millones.
Estoy ejecutando PostgreSQL 9.2.1.
Por cierto, esta misma consulta en el mismo esquema / datos tarda 0.024 ms en completarse en MS SQL Server.
Actualizaré la pregunta y publicaré EXPLAIN ANALYZE data en unas pocas horas.
Aquí explicamos analizar resultados:http://explain.depesz.com/s/7e7
Y aquí está la configuración del servidor:
version PostgreSQL 9.2.1, compiled by Visual C++ build 1600, 64-bit
client_encoding UNICODE
effective_cache_size 4500MB
fsync on
lc_collate English_United States.1252
lc_ctype English_United States.1252
listen_addresses *
log_destination stderr
log_line_prefix %t
logging_collector on
max_connections 100
max_stack_depth 2MB
port 5432
search_path dbo, "$user", public
server_encoding UTF8
shared_buffers 1500MB
TimeZone Asia/Tbilisi
wal_buffers 16MB
work_mem 10MB
Estoy ejecutando postgresql en un i5 cpu (4 núcleos, 3,3 GHz), 8 GB de RAM y Crucial m4 SSD 128GB
ACTUALIZAR Esto parece un error en el planificador de consultas. Con la recomendación de Erwin Brandstetter lo reporté aLista de correo de errores de Postgresql.