I have a query
that produce a different query plan if I put a trim in one
of the columns in the order by.
When i put the
trim in any column it use hashaggregate and took 3 seconds
against 30 when not.
Is wear because
the columns is clean not need to be trimmed, I have check
that.
The problem is
that I can't change the query because is generate by the
mondrian.
I do research
and found in postgres list that I need to crank work_mem
up high but don't work for me.
My
postgresql.conf
# Add settings
for extensions here
default_statistics_target
= 50 # pgtune wizard 2014-06-04
maintenance_work_mem
= 1GB # pgtune wizard 2014-06-04
constraint_exclusion
= on # pgtune wizard 2014-06-04
checkpoint_completion_target
= 0.9 # pgtune wizard 2014-06-04
effective_cache_size
= 44GB # pgtune wizard 2014-06-04
work_mem =
1536MB # pgtune wizard 2014-06-04
#work_mem = 16GB
# I have try this but don't work
wal_buffers =
32MB # pgtune wizard 2014-06-04
checkpoint_segments
= 16 # pgtune wizard 2014-06-04
shared_buffers =
15GB # pgtune wizard 2014-06-04
max_connections
= 20 # pgtune wizard 2014-06-04
___________________________________________________
Query with trim
SELECT
"dim_cliente"."tipocliente" AS "c0",
"dim_cliente"."a1_ibge" AS "c1",
"dim_cliente"."a1_cod" AS "c2",
"dim_cliente"."a1_nome" AS "c3",
"dim_vendedor"."a3_nome" AS "c4"
FROM
"public"."dim_cliente" AS "dim_cliente",
"public"."fato_ventas_productos" AS
"fato_ventas_productos",
"public"."dim_vendedor" AS "dim_vendedor"
WHERE
"fato_ventas_productos"."key_cliente" =
"dim_cliente"."key_cliente"
AND
"fato_ventas_productos"."key_vendedor" =
"dim_vendedor"."key_vendedor"
GROUP
BY
"dim_cliente"."tipocliente" ,
"dim_cliente"."a1_ibge",
"dim_cliente"."a1_cod",
"dim_cliente"."a1_nome",
"dim_vendedor"."a3_nome"
ORDER
BY
trim("dim_cliente"."tipocliente") ASC NULLS LAST,
"dim_cliente"."a1_ibge" ASC NULLS LAST, -- the same
result if I put the trim here
"dim_cliente"."a1_cod" ASC NULLS LAST, -- or here
"dim_cliente"."a1_nome" ASC NULLS LAST; -- or here
-- this query
took 3845.895 ms
___________________________________________________
Query Plan when
using trim
QUERY PLAN
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
Sort
(cost=193101.41..195369.80 rows=907357 width=129) (actual
time=3828.176..3831.261 rows=43615 loops=1)
Output:
dim_cliente.tipocliente, dim_cliente.a1_ibge,
dim_cliente.a1_cod, dim_cliente.a1_nome,
dim_vendedor.a3_nome,
(btrim((dim_cliente.tipocliente)::text))
Sort Key:
(btrim((dim_cliente.tipocliente)::text)),
dim_cliente.a1_ibge, dim_cliente.a1_cod,
dim_cliente.a1_nome
Sort Method:
quicksort Memory: 13121kB
->
HashAggregate (cost=91970.52..103312.49 rows=907357
width=129) (actual time=2462.690..2496.729 rows=43615
loops=1)
Output:
dim_cliente.tipocliente, dim_cliente.a1_ibge,
dim_cliente.a1_cod, dim_cliente.a1_nome,
dim_vendedor.a3_nome,
btrim((dim_cliente.tipocliente)::text)
->
Hash Join (cost=856.30..80628.56 rows=907357 width=129)
(actual time=29.524..1533.880 rows=907357 loops=1)
Output: dim_cliente.tipocliente, dim_cliente.a1_ibge,
dim_cliente.a1_cod, dim_cliente.a1_nome,
dim_vendedor.a3_nome
Hash Cond: (fato_ventas_productos.key_vendedor =
dim_vendedor.key_vendedor)
-> Hash Join (cost=830.02..68126.13 rows=907357
width=86) (actual time=28.746..1183.691 rows=907357
loops=1)
Output: dim_cliente.tipocliente, dim_cliente.a1_ibge,
dim_cliente.a1_cod, dim_cliente.a1_nome,
fato_ventas_productos.key_vendedor
Hash Cond: (fato_ventas_productos.key_cliente =
dim_cliente.key_cliente)
-> Seq Scan on public.fato_ventas_productos
(cost=0.00..46880.57 rows=907357 width=16) (actual
time=0.004..699.779 rows=907357 loops=1)
Output: fato_ventas_productos.key_cliente,
fato_ventas_productos.key_vendedor
-> Hash (cost=618.90..618.90 rows=16890
width=86) (actual time=28.699..28.699 rows=16890 loops=1)
Output: dim_cliente.tipocliente,
dim_cliente.a1_ibge, dim_cliente.a1_cod,
dim_cliente.a1_nome, dim_cliente.key_cliente
Buckets: 2048 Batches: 1 Memory Usage: 1980kB
-> Seq Scan on public.dim_cliente
(cost=0.00..618.90 rows=16890 width=86) (actual
time=0.008..16.537 rows=16890 loops=1)
Output: dim_cliente.tipocliente,
dim_cliente.a1_ibge, dim_cliente.a1_cod,
dim_cliente.a1_nome, dim_cliente.key_cliente
-> Hash (cost=18.90..18.90 rows=590 width=59)
(actual time=0.747..0.747 rows=590 loops=1)
Output: dim_vendedor.a3_nome,
dim_vendedor.key_vendedor
Buckets: 1024 Batches: 1 Memory Usage: 56kB
-> Seq Scan on public.dim_vendedor
(cost=0.00..18.90 rows=590 width=59) (actual
time=0.026..0.423 rows=590 loops=1)
Output: dim_vendedor.a3_nome,
dim_vendedor.key_vendedor
Total runtime:
3845.895 ms
(25 filas)
___________________________________________________
Query without
trim
SELECT
"dim_cliente"."tipocliente" AS "c0",
"dim_cliente"."a1_ibge" AS "c1",
"dim_cliente"."a1_cod" AS "c2",
"dim_cliente"."a1_nome" AS "c3",
"dim_vendedor"."a3_nome" AS "c4"
FROM
"public"."dim_cliente" AS "dim_cliente",
"public"."fato_ventas_productos" AS
"fato_ventas_productos",
"public"."dim_vendedor" AS "dim_vendedor"
WHERE
"fato_ventas_productos"."key_cliente" =
"dim_cliente"."key_cliente"
AND
"fato_ventas_productos"."key_vendedor" =
"dim_vendedor"."key_vendedor"
GROUP
BY
"dim_cliente"."tipocliente" ,
"dim_cliente"."a1_ibge",
"dim_cliente"."a1_cod",
"dim_cliente"."a1_nome",
"dim_vendedor"."a3_nome"
ORDER
BY
"dim_cliente"."tipocliente" ASC NULLS LAST,
"dim_cliente"."a1_ibge" ASC NULLS LAST,
"dim_cliente"."a1_cod" ASC NULLS LAST,
"dim_cliente"."a1_nome" ASC NULLS LAST;
-- this query
took 37249.268 ms
___________________________________________________
Query Plan when
not using trim
QUERY PLAN
---------------------------------------------------------------------------------------------------------------------------------------------------------------
Group
(cost=170417.48..184027.84 rows=907357 width=129) (actual
time=36649.329..37235.158 rows=43615 loops=1)
Output:
dim_cliente.tipocliente, dim_cliente.a1_ibge,
dim_cliente.a1_cod, dim_cliente.a1_nome,
dim_vendedor.a3_nome
-> Sort
(cost=170417.48..172685.88 rows=907357 width=129) (actual
time=36649.315..36786.760 rows=907357 loops=1)
Output:
dim_cliente.tipocliente, dim_cliente.a1_ibge,
dim_cliente.a1_cod, dim_cliente.a1_nome,
dim_vendedor.a3_nome
Sort
Key: dim_cliente.tipocliente, dim_cliente.a1_ibge,
dim_cliente.a1_cod, dim_cliente.a1_nome,
dim_vendedor.a3_nome
Sort
Method: quicksort Memory: 265592kB
->
Hash Join (cost=856.30..80628.56 rows=907357 width=129)
(actual time=26.719..1593.693 rows=907357 loops=1)
Output: dim_cliente.tipocliente, dim_cliente.a1_ibge,
dim_cliente.a1_cod, dim_cliente.a1_nome,
dim_vendedor.a3_nome
Hash Cond: (fato_ventas_productos.key_vendedor =
dim_vendedor.key_vendedor)
-> Hash Join (cost=830.02..68126.13 rows=907357
width=86) (actual time=25.980..1203.775 rows=907357
loops=1)
Output: dim_cliente.tipocliente, dim_cliente.a1_ibge,
dim_cliente.a1_cod, dim_cliente.a1_nome,
fato_ventas_productos.key_vendedor
Hash Cond: (fato_ventas_productos.key_cliente =
dim_cliente.key_cliente)
-> Seq Scan on public.fato_ventas_productos
(cost=0.00..46880.57 rows=907357 width=16) (actual
time=0.004..680.283 rows=907357 loops=1)
Output: fato_ventas_productos.key_cliente,
fato_ventas_productos.key_vendedor
-> Hash (cost=618.90..618.90 rows=16890
width=86) (actual time=25.931..25.931 rows=16890 loops=1)
Output: dim_cliente.tipocliente,
dim_cliente.a1_ibge, dim_cliente.a1_cod,
dim_cliente.a1_nome, dim_cliente.key_cliente
Buckets: 2048 Batches: 1 Memory Usage: 1980kB
-> Seq Scan on public.dim_cliente
(cost=0.00..618.90 rows=16890 width=86) (actual
time=0.005..13.736 rows=16890 loops=1)
Output: dim_cliente.tipocliente,
dim_cliente.a1_ibge, dim_cliente.a1_cod,
dim_cliente.a1_nome, dim_cliente.key_cliente
-> Hash (cost=18.90..18.90 rows=590 width=59)
(actual time=0.715..0.715 rows=590 loops=1)
Output: dim_vendedor.a3_nome,
dim_vendedor.key_vendedor
Buckets: 1024 Batches: 1 Memory Usage: 56kB
-> Seq Scan on public.dim_vendedor
(cost=0.00..18.90 rows=590 width=59) (actual
time=0.024..0.405 rows=590 loops=1)
Output: dim_vendedor.a3_nome,
dim_vendedor.key_vendedor
Total runtime:
37249.268 ms
(25 filas)
___________________________________________________
Is anything that
I can do to solve this problem, is that a bug or a config
problem?
Here the link
with a dump of the tables
https://drive.google.com/file/d/0Bwupj61i9BtWZ1NiVXltaWc0dnM/view?usp=sharing
I appreciate
your help