PgHero
No long running queries
Number of connections healthy 12
Vacuuming healthy
No columns near integer overflow
No invalid indexes
No duplicate indexes
1 suggested index
5 slow queries

Suggested Indexes

Add indexes to speed up queries.


Details
CREATE INDEX CONCURRENTLY ON venta (cliente_id)

to speed up

Total Time Average Time Calls
4 min 2% 334 ms 636 root · details
update venta set cliente_id=$1 where cliente_id=$2

Slow Queries

Slow queries take 20 ms or more on average and have been called at least 100 times.

Explain queries to see where to add indexes.

Total Time Average Time Calls
68 min 43% 549 ms 7,432 qprocesa · details
SELECT pg_advisory_lock(hashtext($1))
14 min 9% 4,719 ms 181 qprocesa · details
WITH presencia_enlazada AS (
         SELECT DISTINCT ON (presencia.id)
            presencia.id,
            presencia.tiempo,
            presencia.cliente_id,
            presencia.medio_tiempo,
            CASE presencia.presencia
                WHEN -1 THEN 'Desconocido'::text
                WHEN 1 THEN 'Entrada'::text
                WHEN 0 THEN 'Salida'::text
                ELSE 'Desconocido'::text
            END AS presencia,
            presencia.notas,
            evm.vendedor_id
           FROM presencia
             JOIN medio ON presencia.medio_id = medio.id
             JOIN enlace_vendedor_medio evm ON medio.id = evm.medio_id
           WHERE
                (presencia.medio_tiempo, presencia.medio_tiempo) OVERLAPS ('2019-08-21 00:00:00'::timestamp, '2019-08-21 23:59:59'::timestamp)
            AND (presencia.medio_tiempo, presencia.medio_tiempo) OVERLAPS (evm.fecha_inicio, COALESCE(evm.fecha_fin, now()))
          ORDER BY presencia.id, evm.fecha_inicio
        )
 SELECT
    pe.id AS presencia_id,
    pe.tiempo AS presencia_tiempo,
    pe.medio_tiempo AS presencia_medio_tiempo,
    pe.presencia AS presencia_presencia,
    pe.notas AS presencia_notas,
    v.id AS vendedor_id,
    v.nombres AS vendedor_nombres,
    v.apellidos AS vendedor_apellidos,
    c.id AS cliente_id,
    c.nombre AS cliente_nombre,
    c.telefono AS cliente_telefono,
    c.calle AS cliente_calle,
    c.calle_no AS cliente_calle_no,
    c.asentamiento AS cliente_asentamiento,
    c.cp AS cliente_cp,
    l.id AS localidad_id,
    l.iso31662 AS localidad_iso31662,
    l.nombre AS localidad_nombre,
    gis.accuracy AS gis_accuracy,
    gis.latitude AS gis_latitude,
    gis.longitude AS gis_longitude,
    gis.provider AS gis_provider,
    primera_venta_no_saldada.id AS primera_venta_no_saldada_id,
    primera_venta_no_saldada.tiempo AS primera_venta_no_saldada_tiempo,
    ultima_venta.id AS ultima_venta_id,
    ultima_venta.tiempo AS ultima_venta_tiempo,
    CASE
        WHEN primera_venta_no_saldada.tiempo IS NOT NULL THEN
        CASE
            WHEN age(now(), primera_venta_no_saldada.tiempo) >= '90 days'::interval THEN 4
            WHEN age(now(), primera_venta_no_saldada.tiempo) >= '60 days'::interval THEN 3
            WHEN age(now(), primera_venta_no_saldada.tiempo) >= '30 days'::interval THEN 2
            ELSE 1
        END
        WHEN ultima_venta.tiempo IS NOT NULL AND age(now(), ultima_venta.tiempo) < '90 days'::interval THEN 0
        ELSE 5
    END AS cliente_salud_id   FROM presencia_enlazada pe
     LEFT JOIN vendedor v ON pe.vendedor_id = v.id
     LEFT JOIN cliente c ON pe.cliente_id = c.id
     LEFT JOIN localidad l ON c.localidad_id::text = l.id::text
     LEFT JOIN ( SELECT DISTINCT ON (gis_point_presencia.presencia_id) gis_point_presencia.presencia_id,
            gis_point_presencia.accuracy,
            gis_point_presencia.latitude,
            gis_point_presencia.longitude,
            gis_point_presencia.provider
           FROM gis_point_presencia
          ORDER BY gis_point_presencia.presencia_id, gis_point_presencia."time" DESC) gis ON pe.id = gis.presencia_id     LEFT JOIN ( SELECT DISTINCT ON (venta.cliente_id) venta.cliente_id,
      venta.id,
      venta.tiempo
     FROM venta_medio_tiempo venta
    WHERE venta.monto_compra > venta.pagado
    ORDER BY venta.cliente_id, venta.tiempo) primera_venta_no_saldada ON c.id = primera_venta_no_saldada.cliente_id
     LEFT JOIN ( SELECT DISTINCT ON (venta.cliente_id) venta.id,
      venta.cliente_id,
      venta.tiempo
     FROM venta_medio_tiempo venta
    ORDER BY venta.cliente_id, venta.tiempo DESC) ultima_venta ON c.id = ultima_venta.cliente_id  WHERE LOWER(COALESCE(pe.id::TEXT,''::TEXT)||' '||COALESCE(pe.medio_tiempo::TEXT,''::TEXT)||' '||COALESCE(pe.presencia::TEXT,''::TEXT)||' '||COALESCE(pe.notas::TEXT,''::TEXT)||' '||COALESCE(v.id::TEXT,''::TEXT)||' '||COALESCE(v.nombres::TEXT,''::TEXT)||' '||COALESCE(v.apellidos::TEXT,''::TEXT)||' '||COALESCE(c.id::TEXT,''::TEXT)||' '||COALESCE(c.nombre::TEXT,''::TEXT)) LIKE LOWER('%3%')
  ORDER BY "presencia_medio_tiempo" desc 
  LIMIT 10
  OFFSET 0
4 min 2% 334 ms 636 root · details
update venta set cliente_id=$1 where cliente_id=$2
Details
CREATE INDEX CONCURRENTLY ON venta (cliente_id)
2 min 1% 729 ms 147 qprocesa · details
WITH venta AS (
    SELECT venta.id,
           venta.tiempo,
           venta.cliente_id,
           venta.medio_id,
           venta.notas,
           venta.notas_cuenta,
           venta.vendedor_id,
           venta.gis_time,
           venta.gis_accuracy,
           venta.gis_altitude,
           venta.gis_bearing,
           venta.gis_latitude,
           venta.gis_longitude,
           venta.gis_provider,
           venta.gis_speed,
           venta.monto_compra,
           venta.monto_devolucion,
           venta.monto_cambio,
           venta.monto_muestra_gratis,
           venta.elementos_vendidos,
           venta.elementos_devueltos,
           venta.elementos_cambiados,
           venta.muestra_gratis,
           venta.dev_hongo,
           venta.dev_textura,
           venta.dev_sabor,
           venta.dev_empaque,
           venta.frentes_max,
           venta.frentes_c,
           venta.bodega_c,
           venta.sistema_c,
           venta.pagado,
           venta.pagos,
           venta.ultimo_pago_id
    FROM venta_medio_tiempo venta
    WHERE $1=$2 AND cliente_id=$3
    ORDER BY venta.tiempo DESC
    LIMIT $4
), prodcat AS (
    SELECT producto.id,
           json_agg(json_build_object(
               $5, categoriap.nombre
               )) AS categorias
    FROM producto
             LEFT JOIN producto_categoriap ON producto.id = producto_categoriap.producto_id
             LEFT JOIN categoriap ON producto_categoriap.categoriap_id = categoriap.id
    GROUP BY producto.id
), ev AS (
    SELECT ev.venta_id,
           json_agg(json_build_object(
               $6, ev.venta_id,
               $7, ev.producto_id,
               $8, ev.precio,
               $9, ev.compra,
               $10, ev.devolucion,
               $11, ev.cambio,
               $12, ev.muestra_gratis,
               $13, ev.dev_hongo,
               $14, ev.dev_textura,
               $15, ev.dev_sabor,
               $16, ev.dev_cantidad,
               $17, ev.dev_empaque,
               $18, ev.frentes_n,
               $19, ev.frentes_c,
               $20, ev.bodega_c,
               $21, ev.sistema_c,
               $22, ev.calificacion,
               $23, ev.notas,
               $24, ev.estatus,
               $25, prodcat.categorias,
               $26, ev.frentes_n_competencia
               )) AS elementos_venta
    FROM elemento_venta ev
             JOIN venta ON venta.id = ev.venta_id
             JOIN prodcat ON ev.producto_id = prodcat.id
    GROUP BY ev.venta_id
)
SELECT venta.id,
       venta.tiempo,
       venta.cliente_id,
       venta.medio_id,
       venta.notas,
       venta.notas_cuenta,
       venta.vendedor_id,
       venta.gis_time,
       venta.gis_accuracy,
       venta.gis_altitude,
       venta.gis_bearing,
       venta.gis_latitude,
       venta.gis_longitude,
       venta.gis_provider,
       venta.gis_speed,
       venta.monto_compra,
       venta.monto_devolucion,
       venta.monto_cambio,
       venta.monto_muestra_gratis,
       venta.elementos_vendidos,
       venta.elementos_devueltos,
       venta.elementos_cambiados,
       venta.muestra_gratis,
       venta.dev_hongo,
       venta.dev_textura,
       venta.dev_sabor,
       venta.dev_empaque,
       venta.frentes_max,
       venta.frentes_c,
       venta.bodega_c,
       venta.sistema_c,
       venta.pagado,
       venta.pagos,
       venta.ultimo_pago_id,
       ev.elementos_venta
FROM venta
         LEFT JOIN ev ON venta.id = ev.venta_id
ORDER BY venta.tiempo DESC
1 min 0.5% 243 ms 181 qprocesa · details
WITH presencia_enlazada AS (
         SELECT DISTINCT ON (presencia.id)
            presencia.id,
            presencia.tiempo,
            presencia.cliente_id,
            presencia.medio_tiempo,
            CASE presencia.presencia
                WHEN $1 THEN $2::text
                WHEN $3 THEN $4::text
                WHEN $5 THEN $6::text
                ELSE $7::text
            END AS presencia,
            presencia.notas,
            evm.vendedor_id
           FROM presencia
             JOIN medio ON presencia.medio_id = medio.id
             JOIN enlace_vendedor_medio evm ON medio.id = evm.medio_id
           WHERE
                (presencia.medio_tiempo, presencia.medio_tiempo) OVERLAPS ($8::timestamp, $9::timestamp)
            AND (presencia.medio_tiempo, presencia.medio_tiempo) OVERLAPS (evm.fecha_inicio, COALESCE(evm.fecha_fin, now()))
          ORDER BY presencia.id, evm.fecha_inicio
        )
 SELECT
    pe.id AS presencia_id,
    pe.tiempo AS presencia_tiempo,
    pe.medio_tiempo AS presencia_medio_tiempo,
    pe.presencia AS presencia_presencia,
    pe.notas AS presencia_notas,
    v.id AS vendedor_id,
    v.nombres AS vendedor_nombres,
    v.apellidos AS vendedor_apellidos,
    c.id AS cliente_id,
    c.nombre AS cliente_nombre,
    c.telefono AS cliente_telefono,
    c.calle AS cliente_calle,
    c.calle_no AS cliente_calle_no,
    c.asentamiento AS cliente_asentamiento,
    c.cp AS cliente_cp,
    l.id AS localidad_id,
    l.iso31662 AS localidad_iso31662,
    l.nombre AS localidad_nombre,
    gis.accuracy AS gis_accuracy,
    gis.latitude AS gis_latitude,
    gis.longitude AS gis_longitude,
    gis.provider AS gis_provider   FROM presencia_enlazada pe
     LEFT JOIN vendedor v ON pe.vendedor_id = v.id
     LEFT JOIN cliente c ON pe.cliente_id = c.id
     LEFT JOIN localidad l ON c.localidad_id::text = l.id::text
     LEFT JOIN ( SELECT DISTINCT ON (gis_point_presencia.presencia_id) gis_point_presencia.presencia_id,
            gis_point_presencia.accuracy,
            gis_point_presencia.latitude,
            gis_point_presencia.longitude,
            gis_point_presencia.provider
           FROM gis_point_presencia
          ORDER BY gis_point_presencia.presencia_id, gis_point_presencia."time" DESC) gis ON pe.id = gis.presencia_id  WHERE LOWER(COALESCE(pe.id::TEXT,$10::TEXT)||$11||COALESCE(pe.medio_tiempo::TEXT,$12::TEXT)||$13||COALESCE(pe.presencia::TEXT,$14::TEXT)||$15||COALESCE(pe.notas::TEXT,$16::TEXT)||$17||COALESCE(v.id::TEXT,$18::TEXT)||$19||COALESCE(v.nombres::TEXT,$20::TEXT)||$21||COALESCE(v.apellidos::TEXT,$22::TEXT)||$23||COALESCE(c.id::TEXT,$24::TEXT)||$25||COALESCE(c.nombre::TEXT,$26::TEXT)) LIKE LOWER($27)
  ORDER BY "presencia_medio_tiempo" desc 
  LIMIT $28
  OFFSET $29