Bueno en realidad te trae los datos empleando el indice, pero es más costoso que hacerlo recorriendo la tabla entera para las estadisticas que el tiene,

y para su algoritmo de obtener los datos tambien lo es,  pues demora un poco mas con el indices, pues tiene que hacer  Bitmap Index Scan y Bitmap Heap Scan

Saludos



El 29-11-19 a las 12:55, Hellmuth Vargas escribió:
Hola Anthony

NO, eso es claro que sale mas costoso.. pero la pregunta va a que si tengo un indice por centro y id (este  ordenado desc)  no debería  poder sacar el máximo por cada centro empleando exclusivamente el indice?



El vie., 29 de nov. de 2019 a la(s) 10:54, Anthony Sotolongo (asotolo...@gmail.com <mailto:asotolo...@gmail.com>) escribió:

    Creo que tu respuesta está ahí, para las estadísticas que tiene
    esa tabla es más efectivo hacer un seq scan que usar el indice

    Saludos

    El vie., 29 de nov. de 2019 12:45 p. m., Hellmuth Vargas
    <hiv...@gmail.com <mailto:hiv...@gmail.com>> escribió:


        Hola Anthony!

        Asi  me fue:

        set enable_seqscan = off;


        HashAggregate  (cost=21803.61..21803.63 rows=5 width=21)
        (actual time=708.525..708.525 rows=5 loops=1)
          Group Key: centrocodigo
          ->  Bitmap Heap Scan on
        oportunidadcitas    (cost=2769.30..21416.55 rows=387062
        width=21) (actual time=143.449..538.962 rows=387034 loops=1)
                Heap Blocks: exact=17099
                ->  Bitmap Index Scan on
        idx_oportunidadcitas_desc    (cost=0.00..2749.95 rows=387062
        width=0) (actual time=140.236..140.236 rows=387300 loops=1)
        Planning time: 0.118 ms
        Execution time: 708.580 ms


        ----
          set enable_seqscan = on;

        HashAggregate  (cost=19204.02..19204.04 rows=5 width=21)
        (actual time=241.997..241.998 rows=5 loops=1)
          Group Key: centrocodigo
          ->  Seq Scan on oportunidadcitas (cost=0.00..18813.62
        rows=390405 width=21) (actual time=0.004..73.800 rows=390405
        loops=1)
        Planning time: 0.089 ms
        Execution time: 242.030 ms


        El vie., 29 de nov. de 2019 a la(s) 10:39, Anthony Sotolongo
        (asotolo...@gmail.com <mailto:asotolo...@gmail.com>) escribió:

            Hola Hellmuth, puedes deshabilitar el seq_scan y ver que
            retorna el explain analyze para es consulta

            set enable_seqscan = off;


            Saludos

            El 29-11-19 a las 12:09, Hellmuth Vargas escribió:

            Hola lista

            tengo una tabla

            CREATE TABLE oportunidadcitas
            (
              id bigint NOT NULL,
              fechacreacion timestamp without time zone,
              fechamodificacion timestamp without time zone,
              centrocodigo character varying(255),
              especialidadcodigo character varying(255),
              medicocodigo character varying(255),
              CONSTRAINT oportunidadcitas_pkey PRIMARY KEY (id)
            )

            con el siguiente indice (entre otros)

            CREATE INDEX idx_ oportunidadcitas_desc
              ON oportunidadcitas
              USING btree
              ( centrocodigo COLLATE pg_catalog."default", id DESC);

            donde suponía que podrá apoyar una consulta recurrente
            que hacen:

            select centrocodigo,max( id ) as ultimo
                  from   oportunidadcitas
                  group by 1



            Pero el motor siempre prefiere hacer el sequence scan:


            HashAggregate  (cost=7307.83..7307.85 rows=5 width=21)
            (actual time=122.891..122.893 rows=5 loops=1)
              Group Key: centrocodigo
              ->  Seq Scan on oportunidadcitas  (cost=0.00..7159.26
            rows=148566 width=21) (actual time=0.011..43.675
            rows=148624 loops=1)
            Planning time: 0.101 ms
            Execution time: 122.928 ms


            La pregunta es: porque si tiene un indice  por ambos
            campos e incluso esta ordenado por id desc  porque no lo
            emplea para sacar el máximo??? ( ni el mínimo) como si lo
            emplea  si solo se hace el max por id:

            select max( id )
                  from  subred.baseoportunidadcitabot sub

            Result  (cost=0.14..0.15 rows=1 width=0)
              InitPlan 1 (returns $0)
                ->  Limit  (cost=0.08..0.14 rows=1 width=8)
                      ->  Index Only Scan Backward using idx_
            oportunidadcitas_desc on oportunidadcitas
             (cost=0.08..9988.24 rows=165172 width=8)
                            Index Cond: (id IS NOT NULL)


            Postdata: la idea es sacarlo directamente  porque  varias
            publicaciones sugieren emplear trigger o vistas
            materializadas para almacenar el dato.

            de antemano Gracias!!!

-- Cordialmente,

            Ing. Hellmuth I. Vargas S.
            Esp. Telemática y Negocios por Internet



-- Cordialmente,

        Ing. Hellmuth I. Vargas S.
        Esp. Telemática y Negocios por Internet
        Oracle Database 10g Administrator Certified Associate
        EnterpriseDB Certified PostgreSQL 9.3 Associate



--
Cordialmente,

Ing. Hellmuth I. Vargas S.
Esp. Telemática y Negocios por Internet
Oracle Database 10g Administrator Certified Associate
EnterpriseDB Certified PostgreSQL 9.3 Associate

Reply via email to