Optimizar consulta

From: Diego Ayala <netdiego81(at)gmail(dot)com>
To: Postgres Ayuda <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Optimizar consulta
Date: 2015-04-20 13:13:05
Message-ID: CANDf+nAi31qaOT0ueJ0rtmTbkbsTZT=s3cy3oW2c_2CG7P3WPA@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Buenos dias, me gustaria saber si existe alguna forma de optimizar esta
pequeña consulta que tengo, ya que el tiempo de duracion del mismo es de
casi 2,7 seg., me parece que es bastante, ya que sera un consulta bastante
usada por diferentes usuarios, por lo tanto quisiera saber que hacer.
Es un select que devolvera el listado de invitados a participar de una
licitacion, pero que se debe validar previamente si existe en una tabla de
registro de proveedores, por eso el LEFT JOIN.

SELECT
inv.id,
inv.nombre AS razon_social,
COALESCE(p.ruc || '-' || p.digito_verificador, p.ruc) AS ruc,
inv.telefonos AS telefono,
inv.email,
COALESCE(p.sipe,false) AS _sipe
FROM llamado_inv.llamado_invitado inv
INNER JOIN llamado.llamado lla ON lla.id = inv.llamado_id
LEFT JOIN provedor.proveedor p ON TRIM(inv.ruc) = p.ruc
OR TRIM(inv.ruc) = (p.ruc || '-' || p.digito_verificador)
WHERE lla.slug = '286308-adquisicion-articulos-productos-limpieza-1'
AND lla.publico = TRUE

Este es el plan generado

"Nested Loop Left Join (cost=0.00..171837.52 rows=7658 width=70)"
" Join Filter: ((btrim((inv.ruc)::text) = (p.ruc)::text) OR
(btrim((inv.ruc)::text) = (((p.ruc)::text || '-'::text) ||
(p.digito_verificador)::text)))"
" -> Nested Loop (cost=0.00..16.94 rows=3 width=66)"
" -> Index Scan using unique_slug_ll on llamado lla
(cost=0.00..8.38 rows=1 width=8)"
" Index Cond: ((slug)::text =
'286308-adquisicion-articulos-productos-limpieza-1'::text)"
" Filter: publico"
" -> Index Scan using idx_llamado_llamado_id on llamado_invitado
inv (cost=0.00..8.51 rows=5 width=74)"
" Index Cond: (llamado_id = lla.id)"
" -> Seq Scan on proveedor p (cost=0.00..41938.25 rows=510325 width=12)"

He creado indices a la tabla proveedor, para las columnas ruc y digito
verificador, por separado, luego los cree juntos, incluso cree un campo que
contenga ambas columnas pero el optimizador no utiliza el indice creado, en
ninguno de los casos anteriores, como les dije, la idea es poder bajar esos
2,7 segundos que dura el select.

mi tabla proveedor tiene alrededor de 520.000 reg. la tabla llamado
invitado 1.300.000 reg. y la tabla llamado 289.053

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Alvaro Herrera 2015-04-20 14:43:01 Re: Optimizar consulta
Previous Message Marcos Ortiz 2015-04-20 12:46:14 Re: [MASSMAIL]Sobre uso de Londiste