Re: Indexes parciales

From: "Carlos T(dot) Groero Carmona" <ctonetg(at)gmail(dot)com>
To: Lista PostgreSql <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Indexes parciales
Date: 2019-09-02 19:59:13
Message-ID: CABh6Tc1zzsYkTDqUAkFv0FcNE6hxW7S=hP4fLtrNOKQ-TH0Upg@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Creo que yo mismo puedo responder a esta pregunta despues de hacer algunas
pruebas.

Scenario 1: trate de forzar el uso del index pasando una fecha:
Select mobile_users.* from mobile_users where org_id = 1 and created >
'2010-01-01 00:00:00';
Postgres decidio no usar el index.

Scenario 2: utilize la misma consulta pero cambie el org_id por uno de los
que menos usuarios tiene (solo 2 usuarios)
Select mobile_users.* from mobile_users where org_id = 2 and created >
'2010-01-01 00:00:00';
Postgres utilizo el index del que le estaba hablando

Scenario 3: Elimine la fecha de la consulta
Select mobile_users.* from mobile_users where org_id = 2
Postgres utilizo el mismo index y solo le tomo 0.12ms

Asi que si, postgres utiliza los indexes "partialmente", los indexes
regulares con columnas multiples pueden ser utilizados por postgres aunque
no se utilize todas las columas del index en la consulta...

Como siempre seria genial escuchar otras opiniones y experiencias.

Gracias,
Carlos

On Mon, Sep 2, 2019 at 2:24 PM Carlos T. Groero Carmona <ctonetg(at)gmail(dot)com>
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;
>
> 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.
>
> 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?
>
> 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
>
> Gracias de antemano por sus comentarios.
> Carlos
>
>
>

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Roberto Andrade Fonseca 2019-09-02 20:22:13 Re: Indexes parciales
Previous Message Roberto Andrade Fonseca 2019-09-02 19:52:19 Re: Indexes parciales