Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dOUwc-000416-EJ for pgsql-performance@arkaria.postgresql.org; Fri, 23 Jun 2017 20:12:42 +0000 Received: from localhost ([127.0.0.1] helo=postgresql.org) by malur.postgresql.org with smtp (Exim 4.84_2) (envelope-from ) id 1dOUwc-0005dF-0j for pgsql-performance@arkaria.postgresql.org; Fri, 23 Jun 2017 20:12:42 +0000 Received: from makus.postgresql.org ([2001:4800:1501:1::229]) by malur.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA384:256) (Exim 4.84_2) (envelope-from ) id 1dOUuj-000878-KU for pgsql-performance@postgresql.org; Fri, 23 Jun 2017 20:10:46 +0000 Received: from mail-wr0-x234.google.com ([2a00:1450:400c:c0c::234]) by makus.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.84_2) (envelope-from ) id 1dOUuf-00013M-FI for pgsql-performance@postgresql.org; Fri, 23 Jun 2017 20:10:44 +0000 Received: by mail-wr0-x234.google.com with SMTP id r103so79606752wrb.0 for ; Fri, 23 Jun 2017 13:10:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=simply-italian-co-uk.20150623.gappssmtp.com; s=20150623; h=mime-version:sender:in-reply-to:references:from:date:message-id :subject:to; bh=5erxCZRPQnSlM5zJm26BFpbGe41iCP7noVH6FryIbEM=; b=tZog7VOLYbTZ1lMy+5xmmaoYTl7Ls9kRNVfURjzJPLTymkqUTBvD1kRJWNtOD/ha8u +Siv/uw2EM4mccTTkE86Mx7GusPgPjeK/hT7+1IOBdBaNNbQ3OmQlX/Oxj/XXvmq4aRm +QRbQe54qar+r+feBAybB/vRVlijBsSu+jkloiWQNPg/1y+RWgv7JHp+0K9kpGxQFjOw lT/G4eoEKY/j7FqdrWAoCpa0IP/MLrAHMwGeBayYuI4D1ZDnArgExLDv4SktMSpiFvYu DHjkAI67fdVf/EwJIeOv/omrxUQ70N9F0AjIlxGQgl9SlJFEjAfseZ5cH9TyN2mARFoI seGQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:sender:in-reply-to:references:from :date:message-id:subject:to; bh=5erxCZRPQnSlM5zJm26BFpbGe41iCP7noVH6FryIbEM=; b=JuRINPziUSEjyqcaRqkzpyZ7Prl34LMYKFy5DKOO7B0UcDG+pwfTatZXkcZRe4UZKo 3XYhrbYr6K/P1mNUD00mAMQcOKWAQq0mOrEEJ+R2gZU3IKHqa3rnmYwu6i5DtlEJCP8a MKhSA+aJ0XLE86xG5ego8Fg1kjKoNyWTn5/rFdyfLx149CwQ41IVN1AWdEL19wYFKOaw W7OoVgT2glid+Y5z4UFKUN02rLNPTrov1ZLPjlIlkvbf6du0tv4GOdaVhfhTuX2O74Ly 6RLbw2HCVIKFXeBFXZjNXX/89H/wfIuH7a1MsA9SzQQZpi9MNFdPi7wPE8wTdCFXaD24 7BDA== X-Gm-Message-State: AKS2vOzAhXnfOfRgmdpL53x5qYY0bx+xqmb8nqD4+ieFKPspeAIXKs+y r1mvwZk97MIVA2u43R4XcxOXDyvKN8Fw X-Received: by 10.28.187.139 with SMTP id l133mr6344045wmf.116.1498248639198; Fri, 23 Jun 2017 13:10:39 -0700 (PDT) MIME-Version: 1.0 Received: by 10.28.2.6 with HTTP; Fri, 23 Jun 2017 13:09:57 -0700 (PDT) X-Originating-IP: [212.159.110.198] In-Reply-To: References: From: Chris Wilson Date: Fri, 23 Jun 2017 21:09:57 +0100 X-Google-Sender-Auth: fDu1c8q2S2F4Qj4kl15XJ7zkElU Message-ID: Subject: Fwd: Slow query from ~7M rows, joined to two tables of ~100 rows each To: pgsql-performance@postgresql.org Content-Type: multipart/related; boundary="001a1148cb04ed5a4e0552a6312e" List-Archive: List-Help: List-ID: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: X-Mailing-List: pgsql-performance Precedence: bulk Sender: pgsql-performance-owner@postgresql.org --001a1148cb04ed5a4e0552a6312e Content-Type: multipart/alternative; boundary="001a1148cb04ed5a4a0552a6312d" --001a1148cb04ed5a4a0552a6312d Content-Type: text/plain; charset="UTF-8" Dear pgsql-performance list, I think I've found a case where the query planner chooses quite a suboptimal plan for joining three tables. The main "fact" table (metric_value) links to two others with far fewer rows (like an OLAP/star design). We retrieve and summarise a large fraction of rows from the main table, and sort according to an index on that table, and I'd like to speed it up, since we will need to run this query many times per day. I would really appreciate your advice, thank you in advance! The following SQL creates test data which can be used to reproduce the problem: drop table if exists metric_pos; create table metric_pos (id serial primary key, pos integer); insert into metric_pos (pos) SELECT (random() * 1000)::integer from generate_series(1,100); create index idx_metric_pos_id_pos on metric_pos (id, pos); drop table if exists asset_pos; create table asset_pos (id serial primary key, pos integer); insert into asset_pos (pos) SELECT (random() * 1000)::integer from generate_series(1,100); drop TABLE if exists metric_value; CREATE TABLE metric_value ( id_asset integer NOT NULL, id_metric integer NOT NULL, value double precision NOT NULL, date date NOT NULL, timerange_transaction tstzrange NOT NULL, id bigserial NOT NULL, CONSTRAINT cons_metric_value_pk PRIMARY KEY (id) ) WITH ( OIDS=FALSE ); insert into metric_value (id_asset, id_metric, date, value, timerange_transaction) select asset_pos.id, metric_pos.id, generate_series('2015-06-01'::date, '2017-06-01'::date, '1 day'), random() * 1000, tstzrange(current_timestamp, NULL) from metric_pos, asset_pos; CREATE INDEX idx_metric_value_id_metric_id_asset_date ON metric_value (id_metric, id_asset, date, timerange_transaction, value); This is an example of the kind of query we would like to speed up: SELECT metric_pos.pos AS pos_metric, asset_pos.pos AS pos_asset, date, value FROM metric_value INNER JOIN asset_pos ON asset_pos.id = metric_value.id_asset INNER JOIN metric_pos ON metric_pos.id = metric_value.id_metric WHERE date >= '2016-01-01' and date < '2016-06-01' AND timerange_transaction @> current_timestamp ORDER BY metric_value.id_metric, metric_value.id_asset, date This takes ~12 seconds from psql. Wrapping it in "SELECT SUM(value) FROM (...) AS t" reduces that to ~8 seconds, so the rest is probably data transfer overhead which is unavoidable. The actual query plan selected is (explain.depesz.com ): Sort (cost=378949.08..382749.26 rows=1520071 width=28) (actual time=7917.686..8400.254 rows=1520000 loops=1) Sort Key: metric_value.id_metric, metric_value.id_asset, metric_value.date Sort Method: external merge Disk: 62408kB Buffers: shared hit=24421 read=52392, temp read=7803 written=7803 -> Hash Join (cost=3.31..222870.41 rows=1520071 width=28) (actual time=0.295..6049.550 rows=1520000 loops=1) Hash Cond: (metric_value.id_asset = asset_pos.id) Buffers: shared hit=24421 read=52392 -> Nested Loop (cost=0.56..201966.69 <056%202019%206669> rows=1520071 width=24) (actual time=0.174..4671.452 <01744%20671452> rows=1520000 loops=1) Buffers: shared hit=24420 read=52392 -> Seq Scan on metric_pos (cost=0.00..1.50 rows=100 width=8) (actual time=0.015..0.125 rows=100 loops=1) Buffers: shared hit=1 -> Index Only Scan using idx_metric_value_id_metric_id_asset_date on metric_value (cost=0.56..1867.64 rows=15201 width=20) (actual time=0.090..40.978 rows=15200 loops=100) Index Cond: ((id_metric = metric_pos.id) AND (date >= '2016-01-01'::date) AND (date < '2016-06-01'::date)) Filter: (timerange_transaction @> now()) Heap Fetches: 1520000 Buffers: shared hit=24419 read=52392 -> Hash (cost=1.50..1.50 rows=100 width=8) (actual time=0.102..0.102 rows=100 loops=1) Buckets: 1024 Batches: 1 Memory Usage: 12kB Buffers: shared hit=1 -> Seq Scan on asset_pos (cost=0.00..1.50 rows=100 width=8) (actual time=0.012..0.052 rows=100 loops=1) Buffers: shared hit=1 Planning time: 1.498 ms Execution time: 8992.846 ms Or visually: [image: Inline images 2] What I find interesting about this query plan is: The records can already be read in order from idx_metric_value.... If this was selected as the primary table, and metric_pos was joined to it, then the output would also be in order, and no sort would be needed. We should be able to use a merge join to metric_pos, because it can be read in order of id_metric (its primary key, and the first column in idx_metric_value...). If not, a hash join should be faster than a nested loop, if we only have to hash ~100 records. I think that the joins should be fairly trivial: easily held in memory and indexed by relatively small integers. They would probably be temporary tables in our real use case. But removing them (and just selecting the IDs from metric_value) cuts 4 seconds off the query time (to 3.3 seconds). Why are they slow? If I remove one of the joins (asset_pos) then I get a merge join between two indexes, as expected, but it has a materialize just before it which makes no sense to me. Why do we need to materialize here? And why materialise 100 rows into 1.5 million rows? (explain.depesz.com ) SELECT metric_pos.pos AS pos_metric, id_asset AS pos_asset, date, value FROM metric_value INNER JOIN metric_pos ON metric_pos.id = metric_value.id_metric WHERE date >= '2016-01-01' and date < '2016-06-01' AND timerange_transaction @> current_timestamp ORDER BY metric_value.id_metric, metric_value.id_asset, date Merge Join (cost=0.70..209302.76 <070%202093%200276> rows=1520071 width=28) (actual time=0.097..4899.972 rows=1520000 loops=1) Merge Cond: (metric_value.id_metric = metric_pos.id) Buffers: shared hit=76403 -> Index Only Scan using idx_metric_value_id_metric_id_asset_date on metric_value (cost=0.56..182696.87 <056%201826%209687> rows=1520071 width=20) (actual time=0.074..3259.870 rows=1520000 lo ops=1) Index Cond: ((date >= '2016-01-01'::date) AND (date < '2016-06-01'::date)) Filter: (timerange_transaction @> now()) Heap Fetches: 1520000 Buffers: shared hit=76401 -> Materialize (cost=0.14..4.89 rows=100 width=8) (actual time=0.018..228.265 rows=1504801 loops=1) Buffers: shared hit=2 -> Index Only Scan using idx_metric_pos_id_pos on metric_pos (cost=0.14..4.64 rows=100 width=8) (actual time=0.013..0.133 rows=100 loops=1) Heap Fetches: 100 Buffers: shared hit=2 Planning time: 0.761 ms Execution time: 5253.260 ms The size of the result set is approximately 91 MB (measured with psql -c | wc -c). Why does it take 4 seconds to transfer this much data over a UNIX socket on the same box? Can it be made faster? The data is quite redundant (it's sorted for a start) so compression makes a big difference, and simple prefix elimination could probably reduce the volume of redundant data sent back to the client. Standard background info: - PostgreSQL 9.6.2 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-4), 64-bit, compiled from source. - shared_buffers = 15GB, work_mem = 100MB, seq_page_cost = 0.5, random_page_cost = 1.0, cpu_tuple_cost = 0.01. - HP ProLiant DL580 G7, Xeon(R) CPU E7- 4850 @ 2.00GHz * 80 cores, hardware RAID, 3.6 TB SAS array. Thanks again in advance for any suggestions, hints or questions. Cheers, Chris. --001a1148cb04ed5a4a0552a6312d Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Dear pgsql-per= formance list,

I think I've found a case where the q= uery planner chooses quite a suboptimal plan for joining three tables. The = main "fact" table (metric_value) links to two others with far few= er rows (like an OLAP/star design). We retrieve and summarise a large fract= ion of rows from the main table, and sort according to an index on that tab= le, and I'd like to speed it up, since we will need to run this query m= any times per day. I would really appreciate your advice, thank you in adva= nce!

The following SQL creates test data which can= be used to reproduce the problem:

drop table if exists metric_pos;
create table metric_pos (id= serial primary key, pos integer);
insert into metric_pos (pos) SELECT (random() * 1= 000)::integer from generate_series(1,100);
create index idx_metric_pos_id_pos on metric_pos= (id, pos);
<= br>
drop ta= ble if exists asset_pos;
create table asset_pos (id serial primary key, pos integer);<= /font>
insert into= asset_pos (pos) SELECT (random() * 1000)::integer from generate_series(1,1= 00);

drop TABLE i= f exists metric_value;
CREATE TABLE metric_value
(
=C2=A0 id_asset integer NOT NULL,
=
=C2=A0 id_metric integer NOT NULL,=
=C2=A0 val= ue double precision NOT NULL,
=C2=A0 date date NOT NULL,
<= font face=3D"monospace, monospace">=C2=A0 timerange_transaction tstzrange N= OT NULL,
= =C2=A0 id bigserial NOT NULL,
=C2=A0 CONSTRAINT cons_metric_value_pk PRIMARY KEY (id)<= /font>
)
WITH (
<= /div>
=C2=A0 OIDS=3DFALSE
);
=

insert into metric_value (id_asset, id_metric= , date, value, timerange_transaction)=C2=A0
select asset_pos.id, me= tric_pos.id, generate_series('2015-06-01'::date, '2017= -06-01'::date, '1 day'), random() * 1000, tstzrange(current_tim= estamp, NULL)=C2=A0
fr= om metric_pos, asset_pos;

CREATE IN= DEX idx_metric_value_id_metric_id_asset_date ON metric_value (id_metri= c, id_asset, date, timerange_transaction, value);

This is an example of the kind of query we would li= ke to speed up:

F= ROM metric_value
INNER JOIN asset_pos ON asset_pos.id =3D metric_value.id_asset
INNER JOIN metric_pos ON metric_pos.id =3D metric_value.id= _metric
WHE= RE=C2=A0
da= te >=3D '2016-01-01' and date < '2016-06-01'=C2=A0
AND timerange= _transaction @> current_timestamp=C2=A0
ORDER BY metric_value.id_metric, metric_val= ue.id_asset, date

This t= akes ~12 seconds from psql. Wrapping it in "SELECT SUM(value) FROM (..= .) AS t" reduces that to ~8 seconds, so the rest is probably data tran= sfer overhead which is unavoidable.

The actual que= ry plan selected is (explain.depesz.com):

=C2=A0Sort =C2=A0(cost=3D378949.08..382749.26 = rows=3D1520071 width=3D28) (actual time=3D7917.686..8400.254 rows=3D1520000= loops=3D1)
=C2=A0 =C2= =A0Sort Key: metric_value.id_metric, metric_value.id_asset, metric_value.da= te
=C2=A0 =C2=A0Sort M= ethod: external merge =C2=A0Disk: 62408kB
=C2=A0 =C2=A0Buffers: shared hit=3D24421 read=3D52392, = temp read=3D7803 written=3D7803
=C2=A0 =C2=A0-> =C2=A0Hash Join =C2=A0(cost=3D3.31..222870.41 = rows=3D1520071 width=3D28) (actual time=3D0.295..6049.550 rows=3D1520000 lo= ops=3D1)
=C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0Hash Cond: (metric_value.id_asset =3D asset_pos.id)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0Buffers: sh= ared hit=3D24421 read=3D52392
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0-> =C2=A0Nested Loop =C2=A0(co= st=3D0.56..201966.69 rows=3D1520071 width=3D24) (actual time=3D0.174..46= 71.452 rows=3D1520000 loops=3D1)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0Buffe= rs: shared hit=3D24420 read=3D52392
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0-> = =C2=A0Seq Scan on metric_pos =C2=A0(cost=3D0.00..1.50 rows=3D100 width=3D8)= (actual time=3D0.015..0.125 rows=3D100 loops=3D1)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0Buffers: shared hit=3D1
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0-> =C2=A0Index Only Scan using idx_metric_value_id_metric_i= d_asset_date on metric_value =C2=A0(cost=3D0.56..1867.64 rows=3D15201 = width=3D20) (actual time=3D0.090..40.978 rows=3D15200 loops=3D100)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0Index Cond: ((id_metric =3D metric_pos.id) AND (date >=3D '20= 16-01-01'::date) AND (date < '2016-06-01'::date))
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0Filter: (timerange_transaction= @> now())
=C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0Heap F= etches: 1520000
=C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0Buffe= rs: shared hit=3D24419 read=3D52392
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0-> =C2=A0Hash =C2=A0(cos= t=3D1.50..1.50 rows=3D100 width=3D8) (actual time=3D0.102..0.102 rows=3D100= loops=3D1)
=C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0Buckets: 1024 =C2=A0Batches: 1= =C2=A0Memory Usage: 12kB
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0Buffers: shared = hit=3D1
=C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0-> =C2=A0Seq Scan on asset_pos = =C2=A0(cost=3D0.00..1.50 rows=3D100 width=3D8) (actual time=3D0.012..0.052 = rows=3D100 loops=3D1)
= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0Buffers: shared hit=3D1
=C2=A0Planning time: 1.498 ms
=C2=A0Execution time: 8992.846 ms

Or visually:

3D"Inline<= br>

What I find interesting about this query plan = is:

The records can already be read in order from = idx_metric_value.... If this was selected as the primary table, and metric_= pos was joined to it, then the output would also be in order, and no sort w= ould be needed.

We should be able to use a merge join to = metric_pos, because it can be read in order of id_metric (its primary key, = and the first column in idx_metric_value...). If not, a hash join should be= faster than a nested loop, if we only have to hash ~100 records.

I think that the joins should be fairly trivial: easily held in me= mory and indexed by relatively small integers. They would probably be tempo= rary tables in our real use case. But removing them (and just selecting the= IDs from metric_value) cuts 4 seconds off the query time (to 3.3 seconds).= Why are they slow?

If I remove one of the joins (= asset_pos) then I get a merge join between two indexes, as expected, but it= has a materialize just before it which makes no sense to me. Why do we nee= d to materialize here? And why materialise 100 rows into 1.5 million rows? = (explain.de= pesz.com)

= SELECT metric_pos.pos AS pos_metric, id_asset AS pos_asset, date, value
FROM metric_va= lue
INNER J= OIN metric_pos ON metric= _pos.id =3D metric_value.id_metric
WHERE
date >=3D '2016-01-01' and date < '= ;2016-06-01'
AND timerange_transaction @> current_timestamp
<= div>
ORDER BY metric_value.id_metri= c, metric_value.id_asset, date

=C2=A0Merge Join =C2=A0(cost=3D0.70..209302.76 rows=3D1520071 wid= th=3D28) (actual time=3D0.097..4899.972 rows=3D1520000 loops=3D1)
=C2=A0 =C2=A0Merge C= ond: (metric_value.id_metric =3D metric_pos.id)
=C2=A0 =C2=A0Buffers: shared hit=3D76403
=C2=A0 =C2=A0-> =C2=A0Ind= ex Only Scan using idx_metric_value_id_metric_id_asset_date on metric_= value =C2=A0(cost=3D0.56..182696.87 rows=3D1520071 width=3D20) (actual= time=3D0.074..3259.870 rows=3D1520000 lo
ops=3D1)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0Index Cond: = ((date >=3D '2016-01-01'::date) AND (date < '2016-06-01&#= 39;::date))
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0Filter: (timerange_transaction @> now= ())
=C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0Heap Fetches: 1520000
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0Buf= fers: shared hit=3D76401
=C2=A0 =C2=A0-> =C2=A0Materialize =C2=A0(cost=3D0.14..4.89= rows=3D100 width=3D8) (actual time=3D0.018..228.265 rows=3D1504801 loops= =3D1)
=C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0Buffers: shared hit=3D2
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0-> =C2=A0Index Only Scan using idx_metric_pos_id_pos on metric_pos = =C2=A0(cost=3D0.14..4.64 rows=3D100 width=3D8) (actual time=3D0.013..0.133 = rows=3D100 loops=3D1)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0Heap Fetc= hes: 100
= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0Buffers: shared hit= =3D2
=C2=A0= Planning time: 0.761 ms
=C2=A0Execution time: 5253.260 ms

The size of the result set is approximate= ly 91 MB (measured with psql -c | wc -c). Why does it take 4 seconds to tra= nsfer this much data over a UNIX socket on the same box? Can it be made fas= ter? The data is quite redundant (it's sorted for a start) so compressi= on makes a big difference, and simple prefix elimination could probably red= uce the volume of redundant data sent back to the client.

Standard background info:
=
  • PostgreSQL 9.6.2 on x86_64-pc-linux-gnu, compiled by gcc (GCC)= 4.8.5 20150623 (Red Hat 4.8.5-4), 64-bit, compiled from source.
  • shared_buffers =3D 15GB,=C2=A0work_mem =3D 100MB,=C2=A0seq_page_cost =3D = 0.5,=C2=A0random_page_cost =3D 1.0,=C2=A0cpu_tuple_cost =3D 0.01.
  • H= P ProLiant DL580 G7, Xeon(R) CPU E7- 4850 =C2=A0@ 2.00GHz * 80 cores, hardw= are RAID, 3.6 TB SAS array.
Thanks again in advance for any s= uggestions, hints or questions.

= Cheers, Chris.
--001a1148cb04ed5a4a0552a6312d-- --001a1148cb04ed5a4e0552a6312e Content-Type: image/png; name="image.png" Content-Disposition: inline; filename="image.png" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: ii_15cd4c3be5277bf5 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 --001a1148cb04ed5a4e0552a6312e--