Diego Ayala escribió: > 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
Sí, 2,7 segundos para esta consulta es grosero. Creo que tu problema es que las condiciones en RUC son muy feas. Quita el dígito verificador (en realidad no necesitas almacenarlo), almacena el número del RUC en un campo numérico (integer) y haz JOINs normales. Nada de TRIM(). ¿Por qué el OR? -- Álvaro Herrera http://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services - Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda@postgresql.org) Para cambiar tu suscripción: http://www.postgresql.org/mailpref/pgsql-es-ayuda