Re: Indexes parciales

From: Horacio Miranda <hmiranda(at)gmail(dot)com>
To: "Carlos T(dot) Groero Carmona" <ctonetg(at)gmail(dot)com>, Lista PostgreSql <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Indexes parciales
Date: 2019-09-03 04:49:42
Message-ID: 26cafdcf-6a85-33df-a5a2-ca644a9c8793@gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Hola,

On 3/09/2019 7:24 AM, Carlos T. Groero Carmona wrote:
> Hola lista,
>
> Estaba revisando una consulta que esta tomando mucho tiempo 304ms y al
> revisar el explain no utiliza ninguno de los indexes que existen.
>
> La consulta es esta:
>
> Select mobile_users.* from mobile_users where org_id = 1;
Me da la impresion que esto es parte de la consulta... que quieres hacer
con estos resultados ?
>
> Si bien es cierto que ninguno de los indexes que existen para esa
> tabla tiene solo la columna org_id, todos los indexes son compuestos
> es decir utilizan multiples columnas donde en casi todos se incluye
> org_id.
>
> Hay uno que tiene dos columnas org_id y la fecha en que se creo el
> usuario, sin enbargo postgres nunca utiliza ese index parcialmente,
> prefiere utilizar el scaneo sequencial.
>
> En este caso, el 99.98% de la information pertenece a org_id =1 pero
> 304ms es demasiado lento para servidor con 64CPU y 512GB de RAM y solo
> 356mil rows.
Al contrario creo que es rápido.
>
> En fin despues de comentarles el entornondonde se ejecuto esa
> consulta, me pregunto: si postgre decidiera utilizar un index en vez
> de scaneo sequencial, podria utilizar el index que le comente donde se
> indexa por org_id y la fecha en que se creo la columna, aunque solo se
> pase el org_id en la consulta?
Alvaro y otras personas ya te respondieron, no solo en Postgresql en
cualquier otra base de datos son los costos los que importan, en este
caso es menos costoso hacer un full scan vs el indice ( usar indices lo
que no te dicen es que usa CPU ). por eso la mayoria de los DW tienen
muy pocos indices.
>
> Este es el resultado del explain analyze:
> Seq Scan on mobile_users  (cost=0.00..38533.34 rows=356403 width=9015)
> (actual time=0.022..292.568 rows=356409 loops=1)
>   Filter: (org_id = 1)
>   Rows Removed by Filter: 18
> Planning time: 2.292 ms
> Execution time: 304.003 ms

Esto me dice que debe sacar la información de la RAM,

Es posible sacar el plan de execución con esto.
explain (analyze,buffers)
select mobile_users.* from mobile_users where org_id = 1;

PS: Ese punto me confunde... son 304 ms o son 304 segundos ?

que Filesystem estas usando y sí has hecho un defrag en caso de que
estes usando XFS ?

>
> Gracias de antemano por sus comentarios.
> Carlos
>

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Jose Mercedes Venegas Acevedo 2019-09-03 13:36:06 Re: Indexes parciales
Previous Message Alvaro Herrera 2019-09-02 23:05:35 Re: Indexes parciales