Alguém poderia me ajudar a interpretar o porque desta situação.

Estou fazendo um experimento com 22 queries do Benchmark TPCH[1],
verificando o desempenho de índices nas consultas.

Das 22 queries, em 5 delas o otimizador utilizou índices secundários,
definidos em algumas colunas das 8 tabelas do BD.
Em outro experimento em paralelo executei essas 5 queries num BD sem
uso de índices, exatamente para ver se o uso de índices resultava em
diminuição de tempo, mas aconteceu o contrário, ou seja,com índice
aumentou o tempo das consultas.

Gostaria de entender, porque a estatística de custo errou em todos os
casos, ou seja, embora o custo_total nas queries que utilizaram
índices são menores, o tempo gasto para executar foi maior que as
queries que não utilizaram indices.
Vejam abaixo, que a primeira linha refere-se a query 6 que utilizou
índice, o custo foi 3335809, menor do que o custo 5255959, da mesma
query 6 que não utilizou índice. Mas veja o tempo das duas, a query
que utilizou índice demorou 7 minutos enquanto sem o uso de índices
demorou 55 segundos, idem para os demais casos.
Porque será que o custo total mostra o valor menor para todos os
casos? Sendo que demorou mais para executar, o que da a impressão que
o custo foi maior.

Indices |Query |Tempo_Gasto |Custo_Total
============================================
Sim       6       00:07:56         3335809.61
Nao       6       00:00:55         5255959.00
Sim       7       00:09:16          5847359.97
Nao      7        00:02:08         6793148.45
Sim     10       00:07:04         40743017.17
Nao     10       00:02:14         41341406.62
Sim     15       00:10:03          6431359.90
Nao     15      00:01:56         9608659.87
Sim     20       00:12:48         8412159.69
Nao     20      00:05:49          9537835.93
=============================================

Segue a query 6 e o seu Explain Analyse com e sem índices.
------------- QUERY 6 ---------------------------------------------
select
    sum(l_extendedprice * l_discount) as revenue
from
    lineitem
where
    l_shipdate >= date '1995-01-01'
    and l_shipdate < date '1995-01-01' + interval '1' year
    and l_discount between 0.09 - 0.01 and 0.09 + 0.01
    and l_quantity < 24;

------------------ COM ÍNDICE (idx_l_shipdatelineitem000
)------------------------------
Plano Execucao:Aggregate  (cost=3335809.59..3335809.61 rows=1
width=16) (actual time=476033.847..476033.847 rows=1 loops=1)
 ->  Bitmap Heap Scan on lineitem  (cost=376416.20..3330284.29
rows=2210122 width=16) (actual time=375293.183..471695.391
rows=2282333 loops=1)
       Recheck Cond: ((l_shipdate >= _1995-01-01_::date) AND
(l_shipdate < _1996-01-01 00:00:00_::timestamp without time zone))
        Filter: ((l_discount >= 0.08) AND (l_discount <= 0.10) AND
(l_quantity < 24::numeric))
        ->  Bitmap Index Scan on idx_l_shipdatelineitem000
(cost=0.00..375863.67 rows=17925026 width=0) (actual
time=375289.456..375289.456 rows=18211743 loops=1)
              Index Cond: ((l_shipdate >= _1995-01-01_::date) AND
(l_shipdate < _1996-01-01 00:00:00_::timestamp without time
zone))Total runtime: 476034.306 ms


------------------ SEM USO DE ÍNDICE
---------------------------------------------------
Plano Execucao:Aggregate  (cost=5255958.99..5255959.00 rows=1
width=16) (actual time=55051.051..55051.051 rows=1 loops=1)
  ->  Seq Scan on lineitem  (cost=0.00..5250433.68 rows=2210122
width=16) (actual time=0.394..52236.276 rows=2282333 loops=1)
        Filter: ((l_shipdate >= _1995-01-01_::date) AND (l_shipdate <
_1996-01-01 00:00:00_::timestamp without time zone)
        AND (l_discount >= 0.08) AND (l_discount <= 0.10) AND
(l_quantity < 24::numeric))Total runtime: 55051.380 ms

Qualquer dica é bem vinda!!
[]`s Neto

[1] www.tpc.org/tpch/
_______________________________________________
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a