Is it possible to have a "fast-write" Index?

Started by deavidover 10 years ago23 messages
#1deavid
deavidsedice@gmail.com

There are several use cases where I see useful an index, but adding it will
slow too much inserts and updates.
For example, when we have 10 million rows on a table, and it's a table
which has frequent updates, we need several index to speed up selects, but
then we'll slow down updates a lot, specially when we have 10 or more
indexes.
Other cases involve indexes for text search, which are used only for user
search and aren't that important, so we want to have them, but we don't
want the overload they put whenever we write on the table.
I know different approaches that already solve some of those problems in
some ways (table partitioning, partial indexes, etc), but i don't feel they
are the solution to every problem of this kind.

Some people already asked for "delayed write" indexes, but the idea gets
discarded because the index could get out of sync, so it can omit results
and this is unacceptable. But i think maybe that could be fixed in several
ways and we can have a fast and reliable index (but maybe not so fast on
selects).

Since I do not know every internal of postgres, i feel simpler to share
here and ask which things can or cannot be done.

Let's imagine there is a new type of index called "weird_btree", where we
trade-off simplicity for speed. In almost every mode, we will rely on
VACUUM to put our index in optimal state.

Mode 1: on "aminsert" mark the index as INVALID. So, if you modified the
table you need to run REINDEX/CREATE INDEX CONCURRENTLY before doing
SELECT. This is almost the same as create index concurrently, the main
difference is you don't have to remember to drop the index before writing.
(I don't see much benefit here)

Mode 2: on "aminsert", put the new entry in a plain, unordered list instead
of the btree. Inserting at the end of a list should be faster than big
btrees and you'll know later which entries you missed indexing.

Mode 2.a: on index scan (amrescan, amgettuple), pretend that after the
btree there is the list and output every row, out-of order. You will have
to tell postgres that our index isn't sorted and it will have to recheck
every row.

Mode 2.b: mark the index invalid instead. When doing the next vacuum, sort
the list and insert it to the btree in a bulk operation. If it's ok, mark
the index valid.

Mode 3: on "aminsert", put the new entry on a second btree; leaving the
first one untouched. Because the second btree is new, will be small, and
writes should be faster. When doing a index scan, read tuples from both at
same time (like merge sort). On vacuum, merge the second btree onto the
first. On this mode, the index is sorted and there's no need of recheck.

Anyone thinks this would be a interesting feature for postgresql?
Did I miss something?

PD: Maybe it's also possible to take advantage of clustering, and have
indexes which entries are range of TIDs; but i'm not sure if this is too
exotic, or if it will make a difference.

Sincerely,
David.

#2Jim Nasby
Jim.Nasby@BlueTreble.com
In reply to: deavid (#1)
Re: Is it possible to have a "fast-write" Index?

On 6/5/15 11:07 AM, deavid wrote:

Did I miss something?

These are interesting ideas but the problem here is the problem is far
to hypothetical. You're trying to defer index maintenance cost in a case
where if there's any real problem the index pages are already in memory.
So if it's too slow it's not because of IO... but then why is it too slow?

If you have significantly more than 10M rows then IO would be much more
likely to be a problem, but at that point you should probably just be
partitioning anyway.

If you want to attract attention here I think you'll need to come up
with some concrete scenarios and provide data on where all the
performance hit actually is.
--
Jim Nasby, Data Architect, Blue Treble Consulting, Austin TX
Data in Trouble? Get it in Treble! http://BlueTreble.com

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#3Tom Lane
tgl@sss.pgh.pa.us
In reply to: deavid (#1)
Re: Is it possible to have a "fast-write" Index?

deavid <deavidsedice@gmail.com> writes:

Some people already asked for "delayed write" indexes, but the idea gets
discarded because the index could get out of sync, so it can omit results
and this is unacceptable. But i think maybe that could be fixed in several
ways and we can have a fast and reliable index (but maybe not so fast on
selects).

FWIW, GIN indexes already implement something that's like your mode 2 but
a bit better: there's an unordered "pending insertions" list that has to
be scanned by every search in addition to checking the main index body.
Every so often the pending insertions list is automatically flushed into
the main index body.

The reason we do this for GIN is that that index type puts a huge premium
on doing inserts "in bulk"; it's a lot more efficient if you push many
rows into the index at once, because frequently they'll be inserting into
the same per-key posting lists. I do not see much opportunity for a
corresponding gain for btree.

So I really doubt that anyone would have any enthusiasm for saddling btree
with a similar mechanism. It's complicated (and has been the cause of
multiple bugs); it's hard to figure out when is the optimal time to flush
the pending insertions; and it slows down searches in favor of making
inserts cheap, which is generally not the way to bet --- if that's the
tradeoff you want, why not drop the index altogether?

But anyway, since you can use contrib/btree_gin to get more or less btree
semantics for GIN indexes (except for uniqueness enforcement), you might
try whether just replacing your btree indexes with GIN indexes provides
any win for your insertions.

regards, tom lane

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#4Claudio Freire
klaussfreire@gmail.com
In reply to: Tom Lane (#3)
Re: Is it possible to have a "fast-write" Index?

On Fri, Jun 5, 2015 at 2:59 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote:

deavid <deavidsedice@gmail.com> writes:

Some people already asked for "delayed write" indexes, but the idea gets
discarded because the index could get out of sync, so it can omit results
and this is unacceptable. But i think maybe that could be fixed in several
ways and we can have a fast and reliable index (but maybe not so fast on
selects).

FWIW, GIN indexes already implement something that's like your mode 2 but
a bit better: there's an unordered "pending insertions" list that has to
be scanned by every search in addition to checking the main index body.
Every so often the pending insertions list is automatically flushed into
the main index body.

The reason we do this for GIN is that that index type puts a huge premium
on doing inserts "in bulk"; it's a lot more efficient if you push many
rows into the index at once, because frequently they'll be inserting into
the same per-key posting lists. I do not see much opportunity for a
corresponding gain for btree.

A forest of btrees (say mode 2.c) may not be a bad idea. When tables
grow consistently, the cost of I/O is usually high in FPW and random
I/O due to the large spread of index updates. I don't have numbers,
but on the databases I've handled it certainly was so.

If you have a btree_forest am that will consist of several btrees that
follow the GIN pattern only instead of an unordered list you have an
ordered btree (which also simplifies merging), you should gain a lot.

The big btrees will be read-only, so they will be compact (100% fill
rate), you will generate less WAL (updates are all local on the small
"staging" btree) and even the disk may perform better with that
pattern.

It is in fact a pattern used by inverted indexes already, so it
wouldn't be too far-fetched.

It is however hard to figure out when compaction has to happen.
Concurrency shouldn't be an issue though, since all but the smallest
btree would be read-only, so you only need a lock while modifying the
forest structure (adding a new btree, swapping components with merged
versions, etc).

It would indeed, though, require a lot of extra storage to perform
compaction. An alternative would be to implement compaction as a
massive insert/delete instead. Certainly, how exactly compaction gets
implemented would be key in deciding whether the approach breaks even.

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#5Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: deavid (#1)
Re: Is it possible to have a "fast-write" Index?

deavid wrote:

There are several use cases where I see useful an index, but adding it will
slow too much inserts and updates.

Maybe try a BRIN index. You can't use them for text search currently,
or many other cases for that matter, but there are enough interesting
cases in which they are useful that perhaps you don't need anything
extra.

--
�lvaro Herrera http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#6Gavin Flower
GavinFlower@archidevsys.co.nz
In reply to: deavid (#1)
Re: Is it possible to have a "fast-write" Index?

On 06/06/15 04:07, deavid wrote:

There are several use cases where I see useful an index, but adding it
will slow too much inserts and updates.
For example, when we have 10 million rows on a table, and it's a table
which has frequent updates, we need several index to speed up selects,
but then we'll slow down updates a lot, specially when we have 10 or
more indexes.
Other cases involve indexes for text search, which are used only for
user search and aren't that important, so we want to have them, but we
don't want the overload they put whenever we write on the table.
I know different approaches that already solve some of those problems
in some ways (table partitioning, partial indexes, etc), but i don't
feel they are the solution to every problem of this kind.

Some people already asked for "delayed write" indexes, but the idea
gets discarded because the index could get out of sync, so it can omit
results and this is unacceptable. But i think maybe that could be
fixed in several ways and we can have a fast and reliable index (but
maybe not so fast on selects).

Since I do not know every internal of postgres, i feel simpler to
share here and ask which things can or cannot be done.

Let's imagine there is a new type of index called "weird_btree", where
we trade-off simplicity for speed. In almost every mode, we will rely
on VACUUM to put our index in optimal state.

Mode 1: on "aminsert" mark the index as INVALID. So, if you modified
the table you need to run REINDEX/CREATE INDEX CONCURRENTLY before
doing SELECT. This is almost the same as create index concurrently,
the main difference is you don't have to remember to drop the index
before writing. (I don't see much benefit here)

Mode 2: on "aminsert", put the new entry in a plain, unordered list
instead of the btree. Inserting at the end of a list should be faster
than big btrees and you'll know later which entries you missed indexing.

Mode 2.a: on index scan (amrescan, amgettuple), pretend that after the
btree there is the list and output every row, out-of order. You will
have to tell postgres that our index isn't sorted and it will have to
recheck every row.

Mode 2.b: mark the index invalid instead. When doing the next vacuum,
sort the list and insert it to the btree in a bulk operation. If it's
ok, mark the index valid.

Mode 3: on "aminsert", put the new entry on a second btree; leaving
the first one untouched. Because the second btree is new, will be
small, and writes should be faster. When doing a index scan, read
tuples from both at same time (like merge sort). On vacuum, merge the
second btree onto the first. On this mode, the index is sorted and
there's no need of recheck.

Anyone thinks this would be a interesting feature for postgresql?
Did I miss something?

PD: Maybe it's also possible to take advantage of clustering, and have
indexes which entries are range of TIDs; but i'm not sure if this is
too exotic, or if it will make a difference.

Sincerely,
David.

How about a hybrid indexing system, with 2 parts:

(1) existing index system which is checked first and has been mostly
optimised for speed of reading. If there are only a few inserts/updates
and the system is not heavily loaded, then it gets modified
immediately. The threshold for being too busy, and few enough changes,
could be configurable.

(2) overflow index optimised for writing. Possible in memory and not
backed to permanent storage. A crash would require a complete index
rebuild - but only when there were entries in it (or at least more than
some configurable threshold, to allow for cases were some missing index
entries are acceptable).

So where the index is needed for a query, part 1 is checked first, and
the part 2 if necessary

Have a background process that will move entries from part 2 to part 1,
when the systems is less busy.

Cheers,
Gavin

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#7deavid
deavidsedice@gmail.com
In reply to: Gavin Flower (#6)
Re: Is it possible to have a "fast-write" Index?

Thanks to everybody for answering. I wasn't expecting this attention; this
is a great community :-)

Jim asked me about something real. Well, the problem is this showed up more
than five years ago, and keeps popping from time to time since in different
circumstances. I solved them in different ways each time, depending the
exact use-case. I wanted to generalize, because seems a good feature for
several situations; and I don't expect a solution for me as each time I hit
with this I found some way to sort it out.
As Jim said, we need here are figures for real examples, and i don't have
yet. I'll do my "homework" and email back with exact problems with exact
timing. Give me a week or two.

Also, some of you are talking about IO. Well, it's hard to say without the
figures here, but I'm pretty sure I'm hitting CPU time only. We use SSD on
those big databases, and also in my tests i tried setting fsync=off.

So the problem is: i see a low iowait, and CPU time for one core is at
80-90% most of the time. I can buy more ram, better disks, or cpu's with
more cores. But one cpu core would have more-or-less the same speed no
matter how much money you invest.

When someone wants a delayed-write index is similar to setting
"synchronous_commit = off". We want to give an OK to the backend as soon
as is possible and do this work in background. But we also want some
reliability against crashes.

Also, if the task is done in background it may be done from other backend,
so probably several indexes could be packed at once using different backend
processes. We could use the entire cpu if our index writes aren't tied to
the session who wrote the row.

PD: I'm very interested on existent approaches like GIN or BRIN (this one
is new to me). Thanks a lot; i'll try them in my tests.

#8ktm@rice.edu
ktm@rice.edu
In reply to: deavid (#7)
Re: Is it possible to have a "fast-write" Index?

On Fri, Jun 05, 2015 at 11:54:01PM +0000, deavid wrote:

Thanks to everybody for answering. I wasn't expecting this attention; this
is a great community :-)

Jim asked me about something real. Well, the problem is this showed up more
than five years ago, and keeps popping from time to time since in different
circumstances. I solved them in different ways each time, depending the
exact use-case. I wanted to generalize, because seems a good feature for
several situations; and I don't expect a solution for me as each time I hit
with this I found some way to sort it out.
As Jim said, we need here are figures for real examples, and i don't have
yet. I'll do my "homework" and email back with exact problems with exact
timing. Give me a week or two.

Also, some of you are talking about IO. Well, it's hard to say without the
figures here, but I'm pretty sure I'm hitting CPU time only. We use SSD on
those big databases, and also in my tests i tried setting fsync=off.

So the problem is: i see a low iowait, and CPU time for one core is at
80-90% most of the time. I can buy more ram, better disks, or cpu's with
more cores. But one cpu core would have more-or-less the same speed no
matter how much money you invest.

When someone wants a delayed-write index is similar to setting
"synchronous_commit = off". We want to give an OK to the backend as soon
as is possible and do this work in background. But we also want some
reliability against crashes.

Also, if the task is done in background it may be done from other backend,
so probably several indexes could be packed at once using different backend
processes. We could use the entire cpu if our index writes aren't tied to
the session who wrote the row.

PD: I'm very interested on existent approaches like GIN or BRIN (this one
is new to me). Thanks a lot; i'll try them in my tests.

Hi David,

Here is an interesting read comparing LSM and Fractal Tree indexing:

http://highscalability.com/blog/2014/8/6/tokutek-white-paper-a-comparison-of-log-structured-merge-lsm.html

Regards,
Ken

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#9deavid
deavidsedice@gmail.com
In reply to: ktm@rice.edu (#8)
Re: Is it possible to have a "fast-write" Index?

Hi again. I tried to do some test on my office computer, but after spending
2-3 hours I gave up. I'm going to need a real SSD disk to try these things.
100k rows of my "delivery notes" table use 100MB of disk; and 2Gb of RAM
may be not enough to emulate a fast IO. (I was disabling fsync, activating
write caches, etc)

I downloaded Postgresql 9.5-dev from git sources, compiled everything and
restored there two client databases (10Gb each one). My goal was to test
gin_btree and brin indexes as well, but i gave up before doing a complete
test of gin.

Now I have a better plan, I'm going to use my laptop (intel i5, 4Gb of ram)
and i will put here a spare SSD i wasn't using (OCZ Agility 2 120Gb). Hope
this time I could get some figures closer to production.

By now, my results were a bit disappointing: (comparing gin_btree against
regular btree for a column with very low cardinality)
- create index and updates: about 10-20% faster (i had a primary key, so
btree unique checks may be here blurring the results)
- selects: about 2-5 times slower
- index size: about 2 times smaller

What i've found is, I was wrong on fillfactor. (Maybe something has changed
here since postgresql 8.1). I believed a fillfactor lower than 80 will do
more harm than good. At least that was the case 5 years ago. Now I could
get a noticeable speedup with fillfactor=50 in the case of updating the
whole table.

Hope i could setup this laptop soon and get those tests done.

El sáb., 6 jun. 2015 a las 13:07, ktm@rice.edu (<ktm@rice.edu>) escribió:

Show quoted text

On Fri, Jun 05, 2015 at 11:54:01PM +0000, deavid wrote:

Thanks to everybody for answering. I wasn't expecting this attention;

this

is a great community :-)

Jim asked me about something real. Well, the problem is this showed up

more

than five years ago, and keeps popping from time to time since in

different

circumstances. I solved them in different ways each time, depending the
exact use-case. I wanted to generalize, because seems a good feature for
several situations; and I don't expect a solution for me as each time I

hit

with this I found some way to sort it out.
As Jim said, we need here are figures for real examples, and i don't have
yet. I'll do my "homework" and email back with exact problems with exact
timing. Give me a week or two.

Also, some of you are talking about IO. Well, it's hard to say without

the

figures here, but I'm pretty sure I'm hitting CPU time only. We use SSD

on

those big databases, and also in my tests i tried setting fsync=off.

So the problem is: i see a low iowait, and CPU time for one core is at
80-90% most of the time. I can buy more ram, better disks, or cpu's with
more cores. But one cpu core would have more-or-less the same speed no
matter how much money you invest.

When someone wants a delayed-write index is similar to setting
"synchronous_commit = off". We want to give an OK to the backend as soon
as is possible and do this work in background. But we also want some
reliability against crashes.

Also, if the task is done in background it may be done from other

backend,

so probably several indexes could be packed at once using different

backend

processes. We could use the entire cpu if our index writes aren't tied to
the session who wrote the row.

PD: I'm very interested on existent approaches like GIN or BRIN (this one
is new to me). Thanks a lot; i'll try them in my tests.

Hi David,

Here is an interesting read comparing LSM and Fractal Tree indexing:

http://highscalability.com/blog/2014/8/6/tokutek-white-paper-a-comparison-of-log-structured-merge-lsm.html

Regards,
Ken

#10Claudio Freire
klaussfreire@gmail.com
In reply to: deavid (#9)
Re: Is it possible to have a "fast-write" Index?

On Wed, Jun 10, 2015 at 6:01 PM, deavid <deavidsedice@gmail.com> wrote:

By now, my results were a bit disappointing: (comparing gin_btree against
regular btree for a column with very low cardinality)
- create index and updates: about 10-20% faster (i had a primary key, so
btree unique checks may be here blurring the results)

That could be the effect of GIN's buffering (lets call it LSM? it's similar)

So that with pure btrees could get a similar speedup.

On Wed, Jun 10, 2015 at 6:01 PM, deavid <deavidsedice@gmail.com> wrote:

What i've found is, I was wrong on fillfactor. (Maybe something has changed
here since postgresql 8.1). I believed a fillfactor lower than 80 will do
more harm than good. At least that was the case 5 years ago. Now I could get
a noticeable speedup with fillfactor=50 in the case of updating the whole
table.

8.1 didn't have HOT. I'd bet it's that.

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#11Jim Nasby
Jim.Nasby@BlueTreble.com
In reply to: deavid (#7)
Re: Is it possible to have a "fast-write" Index?

On 6/5/15 6:54 PM, deavid wrote:

So the problem is: i see a low iowait, and CPU time for one core is at
80-90% most of the time. I can buy more ram, better disks, or cpu's with
more cores. But one cpu core would have more-or-less the same speed no
matter how much money you invest.

When someone wants a delayed-write index is similar to setting
"synchronous_commit = off". We want to give an OK to the backend as
soon as is possible and do this work in background. But we also want
some reliability against crashes.

Also, if the task is done in background it may be done from other
backend, so probably several indexes could be packed at once using
different backend processes. We could use the entire cpu if our index
writes aren't tied to the session who wrote the row.

Something that might help here would be doing the index maintenance in
parallel via background workers. There's now enough parallelism
infrastructure that it shouldn't be too hard to hack up a quick test of
that.
--
Jim Nasby, Data Architect, Blue Treble Consulting, Austin TX
Data in Trouble? Get it in Treble! http://BlueTreble.com

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#12Qingqing Zhou
zhouqq.postgres@gmail.com
In reply to: Tom Lane (#3)
Re: Is it possible to have a "fast-write" Index?

On Fri, Jun 5, 2015 at 10:59 AM, Tom Lane <tgl@sss.pgh.pa.us> wrote:

So I really doubt that anyone would have any enthusiasm for saddling btree
with a similar mechanism. It's complicated (and has been the cause of
multiple bugs); it's hard to figure out when is the optimal time to flush
the pending insertions; and it slows down searches in favor of making
inserts cheap, which is generally not the way to bet --- if that's the
tradeoff you want, why not drop the index altogether?

I have seen a case that a major fact table with up to 7 indices, every
15~60 mins with large amount of data loading, and there are
concurrrent seeks against indices at the same time. We can play with
partitioning, or sarcrifice some application semantics, to alleviate
the pressure but it is good to see if we can improve: sorting and
batching insert into btree is helpful for better IO and locking
behavior. So can we guard the case that hard to handle, e.g., the
indices enforcing some constraints (like uniqueness), and improve the
loading senario?

Hint bits update is also painful in above case, but it is out of the topic here.

Thanks,
Qingqing

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#13Simon Riggs
simon@2ndQuadrant.com
In reply to: deavid (#1)
Re: Is it possible to have a "fast-write" Index?

On 5 June 2015 at 18:07, deavid <deavidsedice@gmail.com> wrote:

There are several use cases where I see useful an index, but adding it
will slow too much inserts and updates.
For example, when we have 10 million rows on a table, and it's a table
which has frequent updates, we need several index to speed up selects, but
then we'll slow down updates a lot, specially when we have 10 or more
indexes.
Other cases involve indexes for text search, which are used only for user
search and aren't that important, so we want to have them, but we don't
want the overload they put whenever we write on the table.
I know different approaches that already solve some of those problems in
some ways (table partitioning, partial indexes, etc), but i don't feel they
are the solution to every problem of this kind.

Some people already asked for "delayed write" indexes, but the idea gets
discarded because the index could get out of sync, so it can omit results
and this is unacceptable. But i think maybe that could be fixed in several
ways and we can have a fast and reliable index (but maybe not so fast on
selects).

This is exactly the use case and mechanism for BRIN indexes.

--
Simon Riggs http://www.2ndQuadrant.com/
<http://www.2ndquadrant.com/&gt;
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

#14deavid
deavidsedice@gmail.com
In reply to: Simon Riggs (#13)
6 attachment(s)
Re: Is it possible to have a "fast-write" Index?

So I just ran a test case for hash, btree, gin_btree and brin indexes. Also
without indexes, and without primary keys.
* Testing "deliverynotes" table.
- Definition and use case:
It is a table contaning real delivery note headers of several years
It consists of 300k rows, 128 columns, 63 indexes, 243Mb of data
excluding indexes. Since is a table visible for users, almost every
column can be searched so we need lots of indexes. We do not need
searches to be the fastest possible, we only need to accelerate a
bit our user searches; without harming too much writes.
- Things to test:
- measure index creation times.
- measure index space.
- with indexes but without primary key
- with everything
- Create fully, delete everything and Insert again data in blocks
- Test updates for recent data

I attached the logs for every test, if anyone wants to see what i'm exactly
testing.
This was tested on my i5 laptop with 4Gb of RAM and a 120Gb SSD (OCZ
Agility 3). I'm trying to measure CPU time, not I/O time, so some
configurations and tests are specific to avoid as much as IO as I can.
I'm using a dev build for Postgresql 9.5 downloaded from git sources.

Conclusions:
- Gin_btree seems slower in almost every case. It's writes are marginally
better than regular btrees even when using work_mem=160MB. (May be 20%
faster than btree). They are smaller than I thought.
- BRIN indexes seem very fast for writes. For selects maybe is a blend
between having indexes and don't having them. They don't recognize that
some values are simply out of range of indexed values, and that's a pity.
If the values we want are packed together I guess I would get even better
results.
- Primary keys and uniqueness checks doesn't seem to make any difference
here.
- Having no indexes at all is faster than I imagined. (Sometimes it beats
BRIN or Btree) Maybe because the IO here is faster than usual.
- Hash indexes: i tried to do something, but they take too much time to
build and i don't know why. If creates are slow, updates should be slow
too. I'm not going to test them again.

And finally, don't know why but i couldn't vacuum or analyze tables. It
always get stalled without doing anything; so i had to comment every
vacuum. Maybe there is a bug in this dev version or i misconfigured
something.

El vie., 12 jun. 2015 a las 7:27, Simon Riggs (<simon@2ndquadrant.com>)
escribió:

Show quoted text

On 5 June 2015 at 18:07, deavid <deavidsedice@gmail.com> wrote:

There are several use cases where I see useful an index, but adding it
will slow too much inserts and updates.
For example, when we have 10 million rows on a table, and it's a table
which has frequent updates, we need several index to speed up selects, but
then we'll slow down updates a lot, specially when we have 10 or more
indexes.
Other cases involve indexes for text search, which are used only for user
search and aren't that important, so we want to have them, but we don't
want the overload they put whenever we write on the table.
I know different approaches that already solve some of those problems in
some ways (table partitioning, partial indexes, etc), but i don't feel they
are the solution to every problem of this kind.

Some people already asked for "delayed write" indexes, but the idea gets
discarded because the index could get out of sync, so it can omit results
and this is unacceptable. But i think maybe that could be fixed in several
ways and we can have a fast and reliable index (but maybe not so fast on
selects).

This is exactly the use case and mechanism for BRIN indexes.

--
Simon Riggs http://www.2ndQuadrant.com/
<http://www.2ndquadrant.com/&gt;

PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

Attachments:

testA_prepare_full_brin.sql.logtext/x-log; charset=US-ASCII; name=testA_prepare_full_brin.sql.logDownload
testA_prepare_noindexes.sql.logtext/x-log; charset=US-ASCII; name=testA_prepare_noindexes.sql.logDownload
testA_prepare_full_hash.sql.logtext/x-log; charset=US-ASCII; name=testA_prepare_full_hash.sql.logDownload
testA_prepare_full_gin.sql.logtext/x-log; charset=US-ASCII; name=testA_prepare_full_gin.sql.logDownload
testA_prepare_full_btree.sql.logtext/x-log; charset=US-ASCII; name=testA_prepare_full_btree.sql.logDownload
testA_prepare_nopkey_btree.sql.logtext/x-log; charset=US-ASCII; name=testA_prepare_nopkey_btree.sql.logDownload
#15deavid
deavidsedice@gmail.com
In reply to: deavid (#14)
Re: Is it possible to have a "fast-write" Index?

Sorry; Because some misconfiugration vacuum and analyze were'nt working.
Now I'm getting better numbers for BRIN indexes where there are zero rows
to match.

El sáb., 13 jun. 2015 a las 3:17, deavid (<deavidsedice@gmail.com>)
escribió:

Show quoted text

So I just ran a test case for hash, btree, gin_btree and brin indexes.
Also without indexes, and without primary keys.
* Testing "deliverynotes" table.
- Definition and use case:
It is a table contaning real delivery note headers of several years
It consists of 300k rows, 128 columns, 63 indexes, 243Mb of data
excluding indexes. Since is a table visible for users, almost every
column can be searched so we need lots of indexes. We do not need
searches to be the fastest possible, we only need to accelerate a
bit our user searches; without harming too much writes.
- Things to test:
- measure index creation times.
- measure index space.
- with indexes but without primary key
- with everything
- Create fully, delete everything and Insert again data in blocks
- Test updates for recent data

I attached the logs for every test, if anyone wants to see what i'm
exactly testing.
This was tested on my i5 laptop with 4Gb of RAM and a 120Gb SSD (OCZ
Agility 3). I'm trying to measure CPU time, not I/O time, so some
configurations and tests are specific to avoid as much as IO as I can.
I'm using a dev build for Postgresql 9.5 downloaded from git sources.

Conclusions:
- Gin_btree seems slower in almost every case. It's writes are marginally
better than regular btrees even when using work_mem=160MB. (May be 20%
faster than btree). They are smaller than I thought.
- BRIN indexes seem very fast for writes. For selects maybe is a blend
between having indexes and don't having them. They don't recognize that
some values are simply out of range of indexed values, and that's a pity.
If the values we want are packed together I guess I would get even better
results.
- Primary keys and uniqueness checks doesn't seem to make any difference
here.
- Having no indexes at all is faster than I imagined. (Sometimes it beats
BRIN or Btree) Maybe because the IO here is faster than usual.
- Hash indexes: i tried to do something, but they take too much time to
build and i don't know why. If creates are slow, updates should be slow
too. I'm not going to test them again.

And finally, don't know why but i couldn't vacuum or analyze tables. It
always get stalled without doing anything; so i had to comment every
vacuum. Maybe there is a bug in this dev version or i misconfigured
something.

El vie., 12 jun. 2015 a las 7:27, Simon Riggs (<simon@2ndquadrant.com>)
escribió:

On 5 June 2015 at 18:07, deavid <deavidsedice@gmail.com> wrote:

There are several use cases where I see useful an index, but adding it
will slow too much inserts and updates.
For example, when we have 10 million rows on a table, and it's a table
which has frequent updates, we need several index to speed up selects, but
then we'll slow down updates a lot, specially when we have 10 or more
indexes.
Other cases involve indexes for text search, which are used only for
user search and aren't that important, so we want to have them, but we
don't want the overload they put whenever we write on the table.
I know different approaches that already solve some of those problems in
some ways (table partitioning, partial indexes, etc), but i don't feel they
are the solution to every problem of this kind.

Some people already asked for "delayed write" indexes, but the idea gets
discarded because the index could get out of sync, so it can omit results
and this is unacceptable. But i think maybe that could be fixed in several
ways and we can have a fast and reliable index (but maybe not so fast on
selects).

This is exactly the use case and mechanism for BRIN indexes.

--
Simon Riggs http://www.2ndQuadrant.com/
<http://www.2ndquadrant.com/&gt;

PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

#16deavid
deavidsedice@gmail.com
In reply to: deavid (#15)
1 attachment(s)
Re: Is it possible to have a "fast-write" Index?

I did another try on BRIN and GIN indexes, and I compared to regular btree
indexes. Now i have 16M rows to do the test.

The numbers seem to be good. Both GIN and BRIN seem good options for
certain tables with more writes than reads (Specially BRIN is very good)

I want to share with you my test; I used real-world data, but i didn't had
time to do something accurate or real-word uses. I know the methodology is
not enough, and maybe some calculations on the spreadsheet are wrong. I
tried to do my best.

I'm using an SSD and I'm trying to compare CPU cost, not I/O.

In short, the results were: (compared to btree)
- INSERT: GIN is 50% faster; BRIN is 6x faster. This is the best scenario.
- UPDATE: each case has a winner; for big updates BRIN is 10x faster and
GIN is 25x faster. For small updates (most real world cases) BTREE is
always the winner; but BRIN gives some good results too.
- DELETE: Almost no difference between the three.
- SELECT: BTREE here is the winner. BRIN is 10% slower, and GIN performance
seems a bit random.

VACUUM, ANALYZE and other tasks are 6x faster with BRIN, 50% faster with
GIN.
Index sizes are 50% smaller with GIN, but with BRIN they are very very
small

Hope you find useful these numbers.

El sáb., 13 jun. 2015 a las 11:41, deavid (<deavidsedice@gmail.com>)
escribió:

Show quoted text

Sorry; Because some misconfiugration vacuum and analyze were'nt working.
Now I'm getting better numbers for BRIN indexes where there are zero rows
to match.

El sáb., 13 jun. 2015 a las 3:17, deavid (<deavidsedice@gmail.com>)
escribió:

So I just ran a test case for hash, btree, gin_btree and brin indexes.
Also without indexes, and without primary keys.
* Testing "deliverynotes" table.
- Definition and use case:
It is a table contaning real delivery note headers of several years
It consists of 300k rows, 128 columns, 63 indexes, 243Mb of data
excluding indexes. Since is a table visible for users, almost every
column can be searched so we need lots of indexes. We do not need
searches to be the fastest possible, we only need to accelerate a
bit our user searches; without harming too much writes.
- Things to test:
- measure index creation times.
- measure index space.
- with indexes but without primary key
- with everything
- Create fully, delete everything and Insert again data in blocks
- Test updates for recent data

I attached the logs for every test, if anyone wants to see what i'm
exactly testing.
This was tested on my i5 laptop with 4Gb of RAM and a 120Gb SSD (OCZ
Agility 3). I'm trying to measure CPU time, not I/O time, so some
configurations and tests are specific to avoid as much as IO as I can.
I'm using a dev build for Postgresql 9.5 downloaded from git sources.

Conclusions:
- Gin_btree seems slower in almost every case. It's writes are marginally
better than regular btrees even when using work_mem=160MB. (May be 20%
faster than btree). They are smaller than I thought.
- BRIN indexes seem very fast for writes. For selects maybe is a blend
between having indexes and don't having them. They don't recognize that
some values are simply out of range of indexed values, and that's a pity.
If the values we want are packed together I guess I would get even better
results.
- Primary keys and uniqueness checks doesn't seem to make any difference
here.
- Having no indexes at all is faster than I imagined. (Sometimes it beats
BRIN or Btree) Maybe because the IO here is faster than usual.
- Hash indexes: i tried to do something, but they take too much time to
build and i don't know why. If creates are slow, updates should be slow
too. I'm not going to test them again.

And finally, don't know why but i couldn't vacuum or analyze tables. It
always get stalled without doing anything; so i had to comment every
vacuum. Maybe there is a bug in this dev version or i misconfigured
something.

El vie., 12 jun. 2015 a las 7:27, Simon Riggs (<simon@2ndquadrant.com>)
escribió:

On 5 June 2015 at 18:07, deavid <deavidsedice@gmail.com> wrote:

There are several use cases where I see useful an index, but adding it
will slow too much inserts and updates.
For example, when we have 10 million rows on a table, and it's a table
which has frequent updates, we need several index to speed up selects, but
then we'll slow down updates a lot, specially when we have 10 or more
indexes.
Other cases involve indexes for text search, which are used only for
user search and aren't that important, so we want to have them, but we
don't want the overload they put whenever we write on the table.
I know different approaches that already solve some of those problems
in some ways (table partitioning, partial indexes, etc), but i don't feel
they are the solution to every problem of this kind.

Some people already asked for "delayed write" indexes, but the idea
gets discarded because the index could get out of sync, so it can omit
results and this is unacceptable. But i think maybe that could be fixed in
several ways and we can have a fast and reliable index (but maybe not so
fast on selects).

This is exactly the use case and mechanism for BRIN indexes.

--
Simon Riggs http://www.2ndQuadrant.com/
<http://www.2ndquadrant.com/&gt;

PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

Attachments:

compare_indexes.odsapplication/vnd.oasis.opendocument.spreadsheet; name=compare_indexes.odsDownload
PKI��F�l9�..mimetypeapplication/vnd.oasis.opendocument.spreadsheetPKI��Fcontent.xml�]ms����_�q;��T��B����N����q^�q:���Z�e�I�������R�%[v�`[��8����Y,^��?�N'�/Q���l�zd����(����>�:j�����Srv��(^L�Y�&��mA�Y�+���]��^fq����(���^2�fU��2�W�U�d��	:{^��G_slf�]���K.���Gix��l�P����l����s�@�O�a_���$����w���^�{yy�]r/I�]���Ok��5n~�N
�h��&�),�R�v+�4�C�|�,��bz���	��F���(�k���<+��e���/�[�yx�h;+����GxS�����0?��}U�<,��;���t�-�`W�j��s��%z9�$��&CI�B\F��-/�/��_�q�K����a8�5�L�U�h���1��D�"�[2�n��g�[_����O��h^����;�,���U���n�Tt�h��y]1gx���j�����v�a�V�q:���8�nH��G�]��w����ezgJ�SS�������:K.f��
��}�Gil��"[o�
�<I�r��-�a�����b����$Ig��1��'��R��~#�~���z2:���k�f�����q�<��n:�EIK��{]��/��u����puF�p������ur��m���;���(���)���W�i<�����p�d?^���{��W|g��"�]d�q�� �q>��%L����w�v����n��0��ey4��Li���Z�p29
��.�M���8H���J[zt_	��Y�"=���@�a�xOm���y�	�[�Yx'�&��^�s9�3VEiGY�,���Q�g�4��M����xd�r�1���B�%q���=�l�p+����-M.�	)�R��L�y����
�[��,�$�<����r�<���r��z���)�Q�����Sy���b�_SjI�r�0���$���g�6�@���&#x�$���7E-��E���)�{�oW@��/0��:��aq����4��o��8���(zMiwX`t;���z2S3:,~\������J��J���q��-�M�+R�[�R$E��0t��,�h����q���a]���r�&������U�e�Y<��$A��s������w�I<������*��)ax����UoK���:a6��ye(E?���=,t�5�S�����W��Qn�V��xp���]E0�G�y��*iW�]P��_���e��y�W���pnJ)�?��e]�X3� �"{Us]��h���WL��'����
O+�O���Si�+U"�A�'9��n��������?���gI�}�$������������}��w�y���n����i�:mP�
��`�L���F^�CY$���os�.���"`/��s3~�����p�_�P�{��(	G����;���EG��*g 6Wj��A�h\z����z����u�K�G}��u��h�I-yX��i�p�:�'nP�
$��2��X�J�Y�?�oX��k�lL{As���j��6�:��N[���i�;q�:m�f�Qc��Fw�{X�c���~�B,��2)���I�N���������f�4�GP+����i���)���I�����J&S5N.��������V5�����<������{h��G��W��|��<py?���v%b��{���5��lql�������Oo��o�z�����a+������_i�JY�Rf��F��I��O��a�E+��d�M����V�q��>(������Z���`�-8J�����6��m6XA}��s#�f�*��`o�e�l��>��eA�p;��i����m6X&%�^�te��*��`o�e�l��>K��h@�Tv�S2����'o�zMZ�������{�Yo���w�~���wH��?���b�By�5b�A����T�
�)nH��9��	Fp��������j���L�{�����Lif7Q�e�\����@:���7d-���Yh %��*�O�-���~s��������Q���!9��@�8a��8�.�1~u�	N��%t���D�S<(-���)�PG#*)Q��f�u#�$���(�;j��������'-J�=0-v�.�z��8��O�%%���g�Q77G[ ]��I�[X(�;6<@��xck��`M�m��t�<ni[����A�q�T��tUB�����Nb���Qc����P���#!$�N}���XdK�i%_ ���a8r)�@:���� _��"[�M+)�����0\q��H7B>!8!
���V�L���%z
2p6��Fn�,��jB0��UQ@_���B&�p	�JAp�T ]��(�w+�������D	������ �9������ag
��&��(�O�f��|8>���[��-��EL��TP�*Y��Zo�Z����w�����������i\!w�`��O����H~��F�_j�������Hk
u�C�����\X���(�)�A�cN7���x
;cH��n�g��� �q��l�����t������6��9�D~�Yh��n����3N#e�q�A9��l8M�G�
�1���� ������NY�DB�:Xku.}��{�Z/lJ[��nHj��y�D~���B���y�D����6Xg����������kNJ��mbp��&e�NY�o����Xn���Br�Y;PHO!�(�m�hy7���B����c7]X��*��&n�n{�F�3�K���
�v��;cn�v�FJr�a�,����FS�1l���3�9\�����++�t��c����y��O���`����W�\!�'I@}����<����Ng��f.�7��7���q�E���n7��d���j��`@s�� ��U�)�����c�N�:����&���|��x��r����V���dj�
�t�}
7�Z.�G�BI��r���������.g<��3�Tdjo�t�����a��������������<��"��6j��z��g�p'�-Yc/u4O}���5HGu��sf���=��hH�#+jv4���<�PB��!���)��lW:[�������G���a�����EG�"����,��9����h�����5V	u�K3@G��"%�%�����4�������HG� X�rs>�^��R�3��_bY��~
�#OK��C��<�$�{����-�G�7�PGnN0�
��p�!;t��v�� _��BP���.���-
�y��J���PW3�����������$�W������wc�g���n�9��K����?���b���	��5������"�H�^*<�5��))��A��>�v�*�&m"�j!�M�U��2���^�w���}�K��f@�|-|BS�9>��f����s��������1����AH���m�53{r62�����
Rn����3��n�j�t���s�3��+p�������=}�5�=_h�SI��~U�o���������qWY{}�If�m��*�w���c6PEy���1W�����]ckCf{U�#b���d��3��v��2h�J���&4�x�������gm]���!D��%'��E����X��l���1"����{���m��}{>��B<,���9�LI[;vM{U�g�PT2p��o���
�����b:�|&�{6W�9�L����*@gB�tR2������5��B=����;��`����2�5���<
�a�OA~�g������3m�
*h@�"\�cTgg*+>�����A*_�I���m��$KEg{M�G?�Z�c/�������j�(�<�@oy�V���
��u�L=�)5���G~b��6sL�C{U���o��B��;��r�4�o�IA6���$@nVU��[��l����f� 5zs�Y^���O�S��pr�
��c���A��2J����>�jk�t�m�s:��&$�p����y�/<P�<Fg��Dx�����:��qG�rwt�t#���-���P���{��f�}7M����n��;Cg�7����'R)%t��������mU9�W��b������6��p>I�o��Yxf\�r�R�Xxn�
�`��}a>+�]r���x������a��0{��G��L��O������kB���@��!9A����r=��@��
����u�6T�A_�}��gVa�/����M��bl��*��~W*J�J9��R$\�4S���)���a�`/�T/51�D_�i�eq2�L��R$���<�����d����(^L�YB�r����PK���Z�PKI��Fmeta.xml��K�� �����
�56r<�,F]L5��J�E�Ii1D�3����&m����;�s��N�
��v��
�Ahn���
��}
�P��������}��-�&�V��yi�z��i:�1���1��9�^-��fS������6��sG��0��D�0-�O�+*��;�VM���	��+;6��R#{Y�s������}�Vuk�&�7l\�I>�`���cT��;������8O��uLh�<����0�dY��'YR����
G%8��[Z0J-�4��,I���+6����_|(z;�U���h���_���k#�
�:��^��=�o6�~�{/��8������g����{���4�vGk~w8�IK�{�D/9��#��i�|��IL�k�
Bnz����Y������\T��V=A����5�[�D�PK({R��PPKI��F
styles.xml�Z�n�6��S*Pt�h��Oc7q.��E����(�+%
$'����~o�7����i�����]�$H �;�����������������b3R�<�Ev���:.7���4�1Y'<�rR($�-#r��\������cI���9�k�yI
'�n��f);b�M7���"7j����d����
�)���*���iS<�S�o$C)G1�K���7�.��R�:w��|w4�"��*4������J0�J��0���b�6'
O�Oc�&U~E�dj�����H��vu\NS��i��u69�����-������r�L���)�c���Y�
&��W/�q%��kil��X�r�6-�)�9��j����e�������w�*"�xc{�y�G�! ��!��BozP�I(H������������U9NU=���H�^(�sB�B��kJv�Z�l��Uh@��5*��B��)������q���Hl�Y2�MI�S��uKC3b����ihh���G����oC=��1����8����u)�c.�1A	�������g�Yw��P����w����:��9e��c\r��g�YK�����[�v��R�%U1��k,�qf8n�s�;��7���b��T$�M���,7{�����a���/b�A�i���ZE[=n�,giBR\���r�k�Lf��08x��.����BQh���A/QB����� �O�|O�N���1t �S�f��*��,�1��`�O��C�'.C�`���u3�B7����Z}�3r3�����P������Q�S<b���wG���BK*�?h{�������	>f���S���y�\�qjX��*�K���ZDnq�w�G�`����7y�&�)��W���p�	��Y�����*bU��0VA"P����]	��e���X�}�C��r���|��,-��W}�0J����b&�g�E��{�oW�Q^I��]�\��k(Q���*@:�H	��b�B��$��StY��i����	} �04Y����_�a�������_��z�}h��+J}Si��-n���4��rZ@0*��\B3�$8�,�����+!�b}���":~�]\sQ�o��aF�)As�P� �h1G�s���U�����y���=������gNW;������k<P�������6�`f�F�u�I���o�_KO�K�EB��q�YE�|�8S�.|���d5�������d�C�m�'bO�rG���So��)�5�����0����}�,nc]�$�3�����Vk�p����9�(w�c������G2�Vs�z���
��f;W<"�an1�3�@v4��At2���~b�������������;mb�u�0��}Ww��	��`��x������@�WBwv)�q��\X�	�P��o����� A"���i���E���Y3����S(���DP�����kdxp��up� ���Ow���[^���^��"�u�jw�L u���v��XZc)���l;L����	����6�a,2�a$���AQ���W\)��.�w�p����/o%�&zLl�v|0�w�o�wz���D��_��W%�VW����|@���R4�gN
f�7��������4��e�'��~�����uwT��������*��5�Z�X�����g����������b�������p�)H8��v�;������s�Yn��o����g��������[�1���ik�>jE���.v��[��������L�a��O�{���U�	���w�h��2Yt�:tRd���V�����@rE����Y�����DQm�n~�9���Uk�S�8]����O��cH�����^bm~���"����3,gahn����	�c�)|��������_PK�e�~6� PKI��Fmanifest.rdf���n�0��<�e��@/r(��j��5�X/������VQ�������F3�����a�����T4c)%�Hh��+:�.���:���+��j���*�wn*9_��-7l���(x��<O�"��8qH���	�Bi��|9��	fWQt���y� =��:���
a�R��� ��@�	L��t��NK�3��Q9�����`����<`�+�������^����\��|�hz�czu����#�`�2�O��;y���.�����vDl@��g�����UG�PK��h��PKI��FConfigurations2/popupmenu/PKI��FConfigurations2/statusbar/PKI��FConfigurations2/toolbar/PKI��FConfigurations2/menubar/PKI��FConfigurations2/floater/PKI��F'Configurations2/accelerator/current.xmlPKPKI��FConfigurations2/images/Bitmaps/PKI��FConfigurations2/toolpanel/PKI��FConfigurations2/progressbar/PKI��FObject 1/content.xml�[Ko�8���4�#��-�H2��n�az���^��9M�ZJ����[$%��e[N[�40�	Y���Wi��/��=�QR�?Y��Z$�yB������_�����o�|��1Y%<�f$�P��
~?���\i���������g�\U��$oV�L����g���F/W��������%og-~�Y1���wcK^�\��c�K��P�
\��{F�oO�������v;{�\��E�����q�WlS\I�F����l�ix3R���I^��|��1\�������xM�@o����� �� 1�f�������
D����c,�l�.���*��M�m������:A�����=6�w�w�VD��E���E�gC���"�2L���@�g��&��erV�����xC2|d�����
�Gd�t����A
.�����	��[�6U�����6��H�AV0'p �!��+%��:��r<D�b������(&�j^[ yZ
 �/��Z�m[������"�$a���:��g�
"�����)����^�[�9�JH^�����Ad�q�dj�d���+qY�P4��OG��<����������o+���HU���Q������]���O�?\���P�2�+�SX���V����<?:2G(��)JHL3�P�pL@	���L��NU���'�8�� �d�7KR��
�V�{��()d��(������D�54\R�_V�F�2}�I�����R���V)���8k�8r�3���@�X�{Mkx����,��Q��8S��C�B{Y���F�-�v��4�r��sD�0���7�	����p��CB���j*�c�M��$!9�	c^k�Jb]��I�@��� �B$+�C#��JP���G�tS!���$�e�7���l�zR�Od$�E�ZB��/�u��x��g�d4��#��BRS�XCT�U#�-A/���:��"�H�$����%���@����#����F����#�oq�irq{c�����N}�����.��W�w���v4�7)���q��m�,t}���y�����.����B3_.���#.�$I	��T�,��?b.o<uC,H*H);����)!�{��!Q��	]6�<������w�0��0����yN�<�D���bt����W��D�����L:�em����T�
N��7e�3�'?t���3�lWk��M��q����C�'9��0�Kgn�Vvb!�%|���	��;�������_	z�m�a���\��s�M��(2��3��7�,���S�����5��'�v�lz~�.V���:���-�&����������j�d�d�v3��QR��M���e���R��������1������90n�$�*����`��0�v4�UJ�R/&����t���K85�`�Bp������E�|�A�pU�I"���;�{�� X���Qk�k^d��^[Q�=���>�K{1�������b��Md�Cr��ZH�(�;J����>b���0�|-���>-d��o�`��(��8��0��k������m���&�,�^�e����s4�RB>��1a#F����'��s��4
i��dP��e'p��Q�{�i���-
U }O7���7ZT�Pp(�m�/D�'��\�5�h4z�[�>�
=��|������]�H�t�}����a����Ug��Ls��m�~��]}�U^�`<����/V;\����y4o������Tt�������W���X�����j�p��`���fd�X�����L������U������z�U�>�@=so��'����d��!�?�c��{��2��:������Q��NS�l��HH?���6�G�YpO���������gr����rx��N}k�i�%��ibk�/
X�h=����9�([|7Z����]L��y���T���`8��fQ���{8l6��\��Q��rX�-���251��B��Lm��{8n�-���5Kc�NV�e�qjb�f�������p����%r��;�����z����S����{ijl�����D����CM���bnw��g�
��"��Nx������K�9�^��w��q�7�O����X��PK��|'3PKI��FObject 1/styles.xml�VK��0��W V=i�%�K��\m�+�6�Zc#�	����<�dI���3�7o��>_j��6\�]���8b�(�e�����H����O[U����*r�����W�Ldi�N��OZ
n
�kf
K
�09��]xW�����m��.%;����={p���K�5
��ZJ���*!�n��7Q\�o��hmS ����]���P��l��������(J�93([eh��S}`zqz���1�jqW����������i��ty��t>��Y��C�|��XnG��=O�/�;��!���2��C8���UP���.C�H���@k��]�_�f��v�\~��:�8�G[��c������B!�5���K���O�{����A�1{��R�A����aF���U��q���$!X�}���a�;�VL,�3&���7p`ar��Y��j��FN��%
k���y���}�o]��rp��h��e�y�
3�5��F�k2ED��&`�1�Gt6�P���R��*��QQ�o���2i��B�i�9 �k������Ai��#�Q��[rs����]��l6���>K���^6��X�w7%u/�����8������%�Ip������i���4#v+k2(OxL��=��U��9U>E�w���tbH������PK
6���PKI��FObject 1/meta.xml��Ao� �����*O�iZ�6�a�&�l�n
�W��`k?�*��-M�#�����G�=�UpB�*�s�����J�9y{}�d[<d�pP�4��Q��F��K�n�X�Ig53�U-����9�L�zjas���q�\)����s
����Kjl	�f�_�P)�\���SRV8$��&v0�������1���}\E)���.����\�%\���Ia�8u�#��nH��H��`�%���1���/Q����b�>,�xR��5M;����}����`�k>Q8H���O��d�d���~���P|PK�u��#LPKI��F�L�
~Q~QThumbnails/thumbnail.png�PNG


IHDR���P%QEIDATx����V3��{{��	wp�!����nE
��)v������H��R�x��C�\��V��/��v�l��K������73������	�a�@��8}a{
}a�)�����������5�3N�G�������.��+Q8��0i13; �������X��R\�a�%Z&H`���vpx��u�������e�/'f.r\u���)O�9����@lB����/.��� �z �AB}e����#��s6�t�D�-k~!8y0s����$\Oy��9��%b��']Hq�'�D����3��B��5)��y���<H�o������|o���!?f.���A�e"|(����/����wE����Cff���8��r���� ?�DyH8�t.���������#�&bm�JqU��=�h� a�sn��;`������%".��jnV	ph)~X����y�����*�`s�f�&bmAt�&{.�2A����"!�!;���
���� ���-�;l���sa�G\9�������K�<����A�-\2���B���������@�4��L�q\&���eLt���Syg�����y�D�%�\��*-��+Q</�s�y^El����D���#����b�%Z&�>����=��^)���9+�D�-������E���B�p=�i7�t���M~�t!����r���CT������A����\;��6��"�n\�!*#��>g�B1Y�!0GP�����'����K:<b�:gc��C"����mRF�N�3Y�q��`Gq�q�0Bu9Y��'���c��V��D!r ��� �DB�|���?�L��H$%FI����uh+���*h����bO9�}�����h���f�A�P�}	��
"222�82
���L3FN����e5j�Q�u�F��VK�I�&9�/0D)C��|�B���������P�T�|]v��tIPP BIPg?=�Y���=H�`�b1
������\(<<��G7�f���"���*�Z_��|o��JBW\�	DK���0�`h���#��9�r���#�.O~|e��_����O2#�O�J�2}��ms~C���:v�un�(�v��u����e��k��]�����v���^�rm��S/�Z��`��[����)��=�e��y	#��!#0��g���)����m������"�n���Z����U��\�Wwy����b�>��&��=���9�a�E�����*�����p R���
z��/��/���l^�#==���Z����F���[0gn��X�Y��UJ���_�g���L�������5�2����?��=��K{�3���iY��Z�����t����R<�+R�8@E`�J+C,8!!,�<=|��
;�����}p��Gor�(�,3�b��]k���_>���i������/n���[�)�C5d\�xt ���#���J�(�D��w���������&��d6Wm�z����3LO��xz)��K������z��3�8�J����3��b����j���F�P�����������-��[R��R^-[�X�[������"Xnr�E����*Q<�t���'7�7n�7�Ur���d�:����!KDT���$m������2dBz�����{B�A�c��z�b����)?G�_dH�V�'M���)nNR�=dR��Su�w������k���e�����������?s��I��� �W~o�wLo9���E����������7���i�),��"������4����L�;�]9}L�+�������}���U�w-��r����*���Xn�"Cv=�R���Z���e�W�V�t�5w%��������?�������Oo��v�����yzC������^�����~<��wG~������^���`E�r�_<~��������*��3�����sg����
jR^LH�&�����;hp��U�{����r�(\�ru%<�X����SF��C%��n���!7o?7k��?~��&������7�n�R�x���*�<d�8�L�a�����tyr	�()�d�����P�1�[��[�q����t�Y>^Z0.��huZFmZ����j�%�z��hk�/�e���t9FPuPPh����M����@}�
�WT��a���wNJ�)���;�Hd2c�0�A��~��j�a��J���'{��K�2�r��iI��.���8�r�'-
z��Zi-�U�=�<�zyz����tm@�F�
�3K�+������������������Z	p�����4*���w�%��{��&�*	
�HQ(U�c�Gda:��'6���Bl(Y�w�Pq��;�o����3(L������f��t\�����t[�T��q*�c-Bz��:Z�@�6���N:�
��?��%B�!��1:��x*��>�����������o��(:�J^PY�������dlo������Y�@w6���kf+�U,c�J>�$�Eb%GJ���o�4+6��& ad�A��<3?�4���v�	jg���:f
��@�8���l�l���?�S��%~X����&y��z7��/hU*y������$�W�~��W��|��EB��wm����E+7�+�������b��5�}���W�~�R�����4}#��9������
a��/��?<�	�-\2���.������m�_���v���iU5~��5�����7m��c�\�j��M[����{�wq5[D��&AQg�\��V�S��-s.��T������e)�xp&�C���8 grk�������xzz���x.S�\�����k�����Gz�xT�n�������C;|y���f�����i�
������/��%���@J�_u	$��?
�}]"q����b�P)�K�uE���<~R,�,�l��50�}�6��G�
�J&��g~!$xZ�����C	�ovv6����?�_+��o[��R��'v~��k���:�����,��{�����%B���j�M�>��f�!���>���P��u���W��k�����������[�6����u���r�t��IO�_]���D�:��g/S��<�{��=�6��A��&�nz���3i��-H����\�ft0����DM��-]%�Jl�(N��\6���!�T�l�HX,�,\] [�"f�E����Q�
�>�Dj~&��!�.�����2�q�$�	�H������R)�0t��	���:��D��sns����� q��J���s�;�����������(��.1)��AQ1E�(���D3���������a�^j�3Q~������D=�1�!p
l�!��:n����L<���/�{���QS�>>��9Rt����m�o����qEJJ���3J�8����o�CC��;<�����	�5)��y`%����[�*�d��%��%��}~~>���Mmzj_�������<��=�&�5|�o����*_����a�Z����|��g���:�3>��;�,)�!.�=[�������5�����{b+sy���J5��[��C;�I���
�:
�3���C�g��q�tx������K�<����A�-\2���.�Rs=��t*����2�����F�8������\;f��
�,��a������QYgIp��Z)N*�!����Yo�2�<2d��O Q.T �	�q�^wR#�������ux���'<�L�=g��es�v���V����^�������hj���m�W)U�~0�E��L�����@GRqjb�����6|f��L�
O�����X,�!_O������[VV�^��2N����Y�����`�EX&#���LQ�i���Y?V���HWk��w���q\�1��oq����`rR%n���B�lj��bl���Ab|��(�������,� 30e�B.�f���0 :N�_��(��Y[��=�6��/��}L@�b�	S��j��K���x�M��JgF&'L=�}��H���+/�6�d�6/����2B��G�
���v5�GV���2�D]�x8t�����b���7Z�g���l�U��|�f��)�>n���/�}JDe�)2����#���(�a9�\���\�q���<F�D��S��D�?��
�a�R	FYr�R�����6���-0�����o44���)�:vh7}T�{����8�(���\�q���-�(��
�8��E���t�������iS��\�~l��o?���������y`���f3��P���<��i�=N�ar	0n>����k!'O������?k8�g������������_(���N��R�l�b��u��q�`�l��B0k��/���)���Q�N_��{�z��/^��,Z��i������/�n��HD0)C��A�-sg�A�������A�U����D@[��W��L�U�d_�
���������9�2����/��?<�$���Up�OK
�[� (tm��� ��dB%R�\fo! j>��Hm�o�{�����{�k��C����f�iI��_"��>E�}L�Y,Ri���U5���\\����=�Jq�!���u7[F�70/�/^�J��+n��ut|��+�:{���
5=o_�E����ui�����a�Co�����|�����9x*�L��6333���d���Y%���x�a%�C���s�;�������	2N
��X�h��5�n[�J�Y�2��,�v�q�Ri�&�Y�0`��i���a|��Q;�������m{	�7�x��������c�C�u���EX���j��Y����Tl�q�����^��U������
;u�{���kR-,%���bM��2���S�f�W��������y}{��}��
[�d��������oQ�>& �!jw6]N��>/���^�~��}���J�o����r��3��0d����=�y������#��#��D��c�e����A�&ZR�j�/^Z���G`�yC�\�|�����������&���WO�h�C�U,A�!'����|j��rH�W�'+�D�-�V������W� �z��n���-)��B���@���mz�ic}D����!jl_�Q[��8�\����#L��,��b��
�~%�������Y[R 6V��-Jq�i %t��jOOz�FR�������\��d�1��Z3���W��yZR���L�*lMPGf��2���+�]jh��	y�zH8Q��CV��t���8��M�����J5�1����&�uxyI��z���C�m.���#MXtn[�����~��y���>�k�9�Z�vu���������a10Nt�;(�_K����C���k��	��=��1<1)�Q����U8{h��1��[�0r���/����T,�r~��nu�E"�j25$�2�D���Q&�#�\\r���l6[j���v�^��p�j��e�R}J��7�\^�p�Wcf�������%~�c��>��� 0W{xJ��'�N������5~_�t����3�<ltx��B�����_)���Hb�O]��?=D��a���m��s~�>~��������_�:�F��������4�aO=1�7m�����������@k�y�zz�����������2�K-����������d������w��c�<����p�{�� ��������?h��Io�QZD�3���K���e��;��qj�%�e�.P�t�m_X*�H�C	J~� -9�FPr�"5���4
�|j�	~��53OK�,KiR�P�J�sa��j�Xz�=��6�H��1��:�3��#����i}A���b��v=��:���K��J��+h����7-	.��n����,.T�Y!Y��}?JU^_��*�[M���!q}?f.r�.�@�\~L��@�H�,�A��g�4�4����E*w�R���-��={z���f,��4;~����!#L�T��&�:�w
a��
���	l�����<{J�� 0x�������L��|���S�3��W�x��j��_���(^�z�h��Q��Y+�O �_�=Q(��������FA'.?������?������G�4��O�j|����4����8����N�"LZ����c��Y�[��������;��A��?����S��[�N��,�qz���[�R!B�l��?/�n�o<Y�~���6���Y%���x�a%�C���s�;�������Q
��	S��h�^#��zh��QS�/Y���k�ZN,]��Y�q��%{�,?lb�����Bm3�X���=�s��_�-������-[�<�YM\���2�#���]�6��	��	&;t�1N����7�2�1�Ml���_]����h�X����3�a��{�<�O�8�k?&��o(3dC��*DO���{�m����� �peH�q��P�Oy��9��%b��']Hq�'�$~�N��)O�9����@lB����/.������G�SC����*���K�L��P��b%�c{Q���-�9h��l.]`��<-)�y��-����>���C�g�2{���zD��>&=d/�d�XPj�"A�b��q� ���Sqj6L��6=$��t��y�^'�*7�MD������������z���D������������=<����<�L!!�2����o\��}Lz��������o�]��W�#�f�*X��/S|���d�7����]��*��Y�l�cR���>~�����%�'
�������p�������'���V����v���P�<�X	8$2oy�'f.r\u���)O�9����@l��C����S�/�=��B���Lm����;�:wp����~����uo�	��C������h�����h���e2[H�x�������E����Qw�Ct~�@b4��~�\������M[-�x���d�M���s�o��I�ht����[*e��!Z����FY1��2~X��� ���
.�iI��S
���cKW��yq��/�r�/��I|��C,�����{�����_����3���J���(��f

O'����}Lz��@��������������S��%L��
u@���������j(R�R��?���xn[1��`����������y�����i��;`������%".��jnV	p6\���!���9���U���,�4���z
�!��y_�6#5#'?22��Y�I��`��kW/���b��/U�������Rk�����d(�+]��_���i�"�
%D-��X,Z�y�=��@�����*N�;E@*�
�(Uj;���
kE=�E�=���SF��������� =$�C\D��rh(��s������9dp�9T�����s6V��[�Z�����E���B�p=�i7�t���M~�t!����r���>^=��8.��Ev`�%Z&�{X��L<$\�
��<-��j��C~�\�	DK�c��/�O�q��iI!��WGpa�bO Z��h�>��AR��"�!V��D�Z�C���D�q�
b|H(Q��~��<H\�
�.����B��}������R\�a�%Z&��L���	%*�2Vr���D�p��J�+�S���K$.C;M�_\�	!��L8Q�����D[&���{}/���#���e���_� bM`������8y���P&���uX��UM1Nm7��Af�a�Pe����c�D��2�$�����xYS�8]e0o?T����q�e��CT
-H0S�G�x������
�"��^��F'`1��r�H���@&����7��T�R��)��I/���X�$����?,������\�\TS����6z��
�O"��\5c���;V���e�J]��X���oo���vo�v��3�����A��cf���8P�?v��/FN+��~�t����9O��x�r�$�������Y%J��L������J6Y������q0���f��)�������X����X������2�]��)@�=a�I��(�_e����Z�#�2��-��6�I���T�!��_9|�Ab�h���OLQy�kZc��ec�j���gM�H���"�>�o�n=��4yP����1�I��B%���������zN?���W��e����N\��������c\_�C�� ��	�P�{��^8�D�J��w|W��$������Y�he��C�d���������}���3��$RP3��X�Q�{Nh�}��#G<�0�����������������2c��A_�n��k�W���w����Ny~���C��p�T|�sw� �Ua}�E�w�!���!��#'���c��������N����_&-Z�i�v���|��!��|7=��R)��J$T-���}��..�������nZ�hH7
4�7sM��aT���l��(�r��sgN:tl�7��R��%�������]d��T���cyE�.�
R
�����O�T���������+Q���)#����	;�����g-�V�����I�R���%7e��1ewY�x!��.�q����K��I��	����R.r�jR���v���Yfy����/�����sN(�����H	�)�xN5j�h�{hjZ�L&�*`H�{���7���a��S�>pt�N��a�7I)8�z�W^0)��+���77Wg2c�TW������y@
��%()gej6\�sx�yH�.��d����!�����.K�n��j�>��E�\B��od�2�*4�\"�A�k����Y���H��#H�Aa��HB���/*S��c"�,U�~M!#�*��z��s�U���1d����10����#�=$+�����u��� 9D���c��K��)�m@�*E7I��8a�YLT
��%*�*a�~}V��g���T@p�uV�JG�m�o�`#��0�6��-��JX��.�o��@b������C�\E�������.��#�0s�'-
����}p��sO���%�('f.r\u����c��{}�w��U�����u����3Qq\���	�<F�D���y�.��te
�.����B��b�xH�4=��yZ��M?�������w�1:m�Gc�
������/��%���@J�_u	$��?
�}]"q�B
�.����Br��=�����0/`�l5�I�8��������z�	�v�x�]t��r�$k�K9���qop��A�S�uD�u�.���4K��D�V�l��c�h��'0���*l{!�T&k6:�&�~1AM����l����O����(H�;\�,���LS�<���
��b�H�8�7��2�S1D����p��C	�q�l1#��v X���0B�_5��p�L&�LFS����� r�f�F�$sQ���`��/J�f3&��h=DP��?w& �TT�/(K��c��R��S�]��a���,C&?�Zg���SQ���3�\]>o2�7-~
G���V��U��mR93�������F]pl�h�>S�����.i��
�WT������JX�.�[����c��#�z����6��]�y����*��X,�+z����y���c���;���		��m��;�o]�xJ�-:��{����w�����,��j�i��~�@|����"����O{t��]��rf���v#[��Dl����|�U:B���_f��t���7;w�`�*_�Y��i���e	�)��Og�^�
�'�nIKO��0�7���,����~�^��z�qj�h�����Mh+���W���i�QS���GN��&;+=A���iS�[�))����IQt������s��iO������E?K~�b�n!��W�)��j-z����;����X?��$�WC4��e$�K5�T:����~�������;~��t��	#���?��e�N����-�������x!�Q�D)�]�R*pC$R�Bj�-���t��2�;�xE�@��R{x^;�u�P���-���C)AB�R�L�T"������I��M�-,�����+rn���	k^[v�1���U���Ii���6-Y4�K�����-�y��h��]o?p/��h���/	�f^��4�����1���UJ��?��/qh���U&�U��?}��K�%_$_����/Z"���W(*��N��2c��25��}n�yS����Q�\�����-����1l���	F(���������zP���Y0*'���;�z
Wj�5J�*C}�q�0��:��-����[��K?�AN��?7��n4�"Ow���Q����2V��g��ek��A�����\����aCG�SyFe�����N�4q�����k����A���GL�������=�K_]D|#�{q%9��g�{~�`c
��,Q�M�Y����D3eQ�[7������f�F�Q�\��G�g��1s�6�+����=}�
8��I�^�M����8���_:�Z����O~n�{{J����Z_��n�����p��bO Z�(N
Sc"��g��/Ld�e���>���� r�eK�)4^�l{��>.Q)�������Z��op�q��{�z��y���CR�RV�Zk\�@s����������9��8�;br��Os�x\l`j���3�s�!��6nM���<A�� o��m�o�>{�$/�4��W8,QH�1cc=��wo2�������k��1`��O'N���{@�K������u7����`�]4"�C�y4.>�R+��0^R���0\�����e�\zyiiY�P��pS�����|"0")R����60�z	-_����\ �@R
�0��%��xr�l^frx����"��s����F>5�#���j��j�b��W*�'��A<�j�4��Q�lAK�$Z���cBRs����7�B����E[��^BT����;vhC�����O��v����<Y�GK�)[��b����+��%E���+����H���������"���ww�q���j_����u���[PC���G���+g~���������%Q.T ��K3T�t!����r�[��"|��.�:�����������(�S /�%��LA���{B�A��|V$�XI8�t.������Cn5.s��@<��m<H�o������|o���!?f.������C\�xX����s�A��_������#q&F9�.���q���3	��O�X�(5����"��e��cf� ���!*3�H�0�������PFa��V���"�3��i�TxB�ovl{J>�l����H��Sr���ND�-)6	�Vb�`���,"��w�!��H��i���u�+=a�`�V&l1B�,s�]�R=H�������_C��?P��[�R�S�Fn+~r�P���9k�Fhe��R��$ \$����M��Sr�;�4n�"C��)=�4Kb��@���'>O�-_��o���V�*%�S
�����f��u��3����dQ��	�����r��J�B!��Y���Kg��2%��H{��E��\���ST���-���Xt!��w���r��H ������34������&�HD�!7����%���J��"��g�@��z��+��?H��Q�5Z���������P����Je�[,@�����}V���E��dN������B�W/m���cw���@��r����vn�#�������Ezc�Z���j������2bb��M����������������.Z�0X��h�����yK�
�[���;w�{H�Yc\���t�`��0iD�M��{����_���s�������v�,�E�V�G
����?�eQ��;Sf������O�o��q�!��$,\��������K$Ew�L����hk��a�e@�����]�?�e�[7o�~�X�\�'������+}���Wi�5j��Z���I���_���[�
r��.���FNB�A��z���j�x�;}�Y�2^�����Sw���w�;}�8����-��i�kd�� j����VgK�T� �B�P*��H�r��'(�H�����Jy?M��)K�3����Uj;D�����/jG@m:ur�������x">>w~;����P�������*
�P��?s����g���5�bP��P���{?�Tx��agw,���R*
������7i������-���n�~��~�N�8P�d����-k�9~�l��M�����=lV�9��4]Hq������)>D�S�;�jt��O>�qU���m{���+���W%c
��,�P�RB���T��q��h��T�V�� ��gj�����g�W�
5�,0��w������{q���u�
����,[��t�O0j��m�,��X��>TyH���,�%kT������Ss������I���T �	��tY)��@�F��z�R��s���S��j��g�c��t��������������"�y�@c��$'�"�8��F?���;�q�N����v�WcN�}�w������i��K;�k�u���
L^:�J�r�1}��}�>^W��Ik^���#�:y��;����^��g4`^J,��D��k��^?k����@��}�I�d`Y ��6~���y��EJT�����+�����d��T<��������E-���b6�=}
���������C���<�D�67_����)Y�}�v���h����f4��v��7X�ifP�����|����{�9r���[r�
�
��|��.�D��������Y�:�-]!o��Lb��	a^@�'��Y�Z�������J��5�vnY]�x�����5�l\����3f���_OH�y
/����^�x1@���G]�m��I/?�����>�n��}�_��<99�[�au+�Y���s�=����=~V��.�w��'I�����'^<�W=�����}��l4�����3�����|�|��K��P��|��`�V�R55��}�z�R9t����J��8L�0	4�������@N��B8
:�k���k1n�4�L����	�'�W�y���;�-�k����	�������a���1q�HTc��������5j��� AH4�Wm�o�e���&[6{K,�Q\r`Z����{����Z�e����z����JF����4�c���2�h��t�a���MA��K����[S���>��5������z�D������� $�sz *�h6[$�u��-�GE��+����R	�,:���B��S�4�yPA�_��s��E���L2,��:}j��
N����r��\%�~��A����A>&����9'�tH�7g������[�����<(d���D�Z�s�n!k(���X�a,���9��h9����w��MKZdj&�������N�%c��D]pCN'�F
d�YA�Ad�G�������{��;��'z!����/(�S�*��S{�����w�����lq��
a��:��3	�������3�0j�]�9[(���X��Gn4.���K��?fb�]�dE��%����/�����v&��6:g���?�d�x�8�b%��B����BS���\�>����W6;�z+���#�!s�?.�ry��]"q��4]Hq�'��Vk��I�z��
���6���\���,�!��CAnr��@<�x�.�8����1����u�OK
a��:�3{���.>5������#���tU�>���q�Z�L������)l���
��	AA�������n�� �TS_?@�6)�Z���
��0u�9D��	�������-cM������Sj����@�&+��� �1��b�y�]s��~@�
��!E��ZP������s|}��S�`j~%��j����S��	���h�����&�z���uS�v��Y����iV�����4�Yy��MYy�6`���������G��d�t�����S'�<P+d�L�����l]�R��.Q�g��@�����/�?z�!=q��u�f��a#�]<x�4�og������e�uom�XdR��YS������Cu�j��wk���=Z���Y�xo?Q=��%C0]��/����;W�_�]�f�)���/�?�0~T�o7��<�����k�j[��|�1  `��e;�m[��O;W�8���E	=��5u���pr������W���|��!��OU�lQ_�6w���>9����EG�h��X��=�C������_�)�j�*}�. �(��:����K�����LJ+U�~�/{�4�U��Z)h\���iD���
���(dQ�FN�l��i���$��
[n�v���9���/q����1���<r��Vs�������i��EdTt���b���T�y��
3����f�x�Z7fB�H���NN��kX%��������������s����jZ����sb��y_�������^�r������
���o�{��i�[_�(Y�z`����2�d����18���D���V����;����P�+�jX�j�[����f��=<}���o��j	�	�V��f�����>q������T���PJ	z�y�8*E(��$���74h�����O��7m��e��Y���p��U�^�Hl�Re*����*��}�JO�?U�"���U�.� ���;<u����j�����@�[�G�������g6��JL��w��*��"�V������[I�T��T~nN���}eyz��f�z�MJG<��{�7�'�o���I-*$k���q��wn�������Go^�2J�Q(�����/������O������>������3�q"4-5����4��
�+��/^�i�������M�����S���.]!��~�B���=!� ����;0h��`Oi�v��A�8!_�a����F5�������wk����0��[�o��\Z/��}�k��`�4b�����������5(�!L���orz|������N>sxw��gl�.�n����1��
���{;������o�:�u������&����+}��v����o6�Iy�G
�.D���x.�'n4���U���,[��Q�+D����.�{��@O����g-B�{���l����G'��^A���gm���&�t%��+���yUz��od��c��|��^E ����OKV�~c��i$����w�%�iD`��+�T_��|?��\��A���c���e��C�'�w��c�-@Pj�D�+j
2f[\L�i��8*Dj�,��7���.KG/!��Z��%K�jgOrm?��g�>��z=5n�P���P����
�#�Jp��Z1>���=��O�H�u�P6���!Lm�������da*�L�]<Qb]�O;.�YB�[E
���,�FH�R��'M��r�J���qjb�������	�C�c�xJ���������u�vf��Mg���J�?h��I	�����W�o��,kD�v�����}���C��@%$$�����V���S %�������.��T!M�_\�	!�U���4���r�������(	��E������^��5U��(C"|(�2$�����3r�\�@|�	��rr���=Fu ��Xb��(�Cvp�q����c��x�Q���{���l�r/W��q:�Sqgkt��o�JK����~K�zF�a��
O����2w��1�9';���=�C�LFC�NG}h����z�
,&c�NGX��*�<//_�P������j�.�l!��C�)�Z�G"a6�%	 ]v���[�@��A���Cnr��yMH��0���!7�����k�)�4��b�A�>�o�7F������$�F����P3������N^TH+���=�j#Ji��D�S����9y��Um@T���S_M��"<�&K��}?+R���������;��}[V������S���W���~m`���Q����jQ�S�����l_�����T!
���|b_b��i5�=��"<����Bz�����{B�A����m"���I����IW��z��%f���~C���T�%3�x��B�6������B50����Z�:G}U�����J
�q��WS�����<=��1a���*����'�����u��3�.]�u�����C{'�o����+w^4�f;���
;|��������E��u2�_��WwjV������7���U6�L&3��Y0�n]�=e^�Q�n�|�T�[h���
���hO~���u�+��� ����C���O�f�H�;7���eF�#��
�Tb�%8,�r��[�<��H���������C7���)S�xz������h���7������}{zr�����Z��R{B*svj�FI��n<���lz������#A��>��/���'.^�O�
<�B��>
rI���,��x[�UQ����1	��l��,!A�,���F%�o��7Z��o�q���J
k��O���CT�����������}�������)9�VTC6p��8���R,/s���,��gi��J�e��i�Z�	�:���2�O���D+U�
�3f��`3���+�p �C��-��k��/��7�?o��F�8 w.���e����{J�7�Yn��	���F���~i�j�w��Q�|@���\��R�>������O_|�Mk�V�yI:XM���-��N�g:T�>���v'O��'����+��������\�EH�����N �I%����nHM�������������P��U��S)��y�#���)��IsW�IL�P#04��^����HQB��mR�������~��	S���;K�*�!�D��i�f��-kV,�s������[;oB���d0a� r*GP����hk��!\�D���L���<����K�Lp#=Ds����p<8,��\���@$)�Y����z��;���k�R����/|��-�J
�J�Y��DL����>�+5���9��������%a?�H�C��EF����'�X����<��G�
 [���	��B�X"D��� ����p�I�����j��];C�=�����P���<-Y�P+�+.������1:�U�g
�����Cc���������,��D._��e�3�o0D@�Uv9�iI��X.((W\�	DK���!�O�O$�����"h�fu�S>	=D8}�c��q�q�b���<<V������RN�,Z�$p:qpW����`sv{���q�+�U�\�e���2�O�+9��C	��A��+{.�2�]�u������VP5�������]�s!��~�B���=!� ���!��n4�C N�.G<��$�5��������!UA���{B�A��6���h�yl3W}�f�]O����;�Jl'�T���,W5�}f$�#���9:�c�w������\/�S��r]S��mRzCj;0����N�V&�"���'�Q��Q���z��=������.�iO�"A���$*�03����/cm��V�<�cf��p�4��?d����
r����S�����I�R�f��d���G�P������n�p��|�����f�`�>�9�:)�C�����*4�~�@@�<�s/Q_�zy��O�
z"3��o��5oRP����:��b�"�D[�CPr�����&^V1Io�@�Nu�'���iC�p=En_>�WU,e������|��
�g���Q����r+�����������Q��!?�Z�������W,�����P������d�����&KJ��;t�ut��[i��B�/�?���0?��'NU�Z�t�j=:4����KV�l�n�����W#����)�����]G+�����y�����*��_�0������U�����x�)�����j<���_[$�@_�|�A�T��z�\����O�!�U�`"/�����\�����m(��A���j�B)A�����=�u�.G�<e�An���/TDVv�����4&��}�Z�2Z�>���=
�1���/�IU����ZM{7�o4c�!A��������t��6��w���w���0cV���L����6�L�j���U�6���!X�}���w��o�^��e����� ����k�����[���]Z�m�s�������Q���g7^������1CCpP`.�?�S���w�8����E�T>������J����J�jeyyi���#�O����������|V�l��� ��(�]�e�2$�H*����cSf�8����/���2w���������0~�!~����� �	3q�F
mZ>���x�e��1S6pu�tF\�w��GO�����c*��T�l���~#d��N�Q6>,���&lY:����F��m�ZM��*"w����4@,����d���m��k��������������yu���E�*�;w���������1�M����dt�Ib�&-ss��$��]�l���*�}��~�2��K'x�������Q�����R�:#�|�����>m�NL(R����7�L�t��I�����������%��rX�>C?/�294<As1r5�^PMB�pC>$�����g������C{d2)5��:���C
���P�R�Om=5�&}d����oX����PM&��c�6 �D�v����F�����R
BC|&3]%@1?WW�f�YS�~����c�l^3"p���l���!�����y��1U���Zw;)7���������~��
��������x�e�����,G!���^�����r��a��Z�Hb�+}d�e��E~����x����>w�K��~��^��p��������3��.];m�a�CoI�2uJ����y�z��,2%?�U1r	$�
l�����'K��Zw'�p��Z5k��1�z�J��'F����l����g����[��L�`Md�(���WI
�����D=�����x����Jy��q�T�a����ge�zyj�5n����H�R;vN��t5C��7����^�E�522��Y� �����������z��U�7XPE�v�2�x��_$%�����$��
���<�Y�R����3!Q�!������<�IGdd(|����*��t��\���������a��J�rQ��F����<6h�a���]��?�pz��Xl��k���e
���"�[z�!�e�_�1��a�Z��``O8������ENo%��J�
�hH���}|����:�r����_&z�����5^��=(��,AV�P����A�^�$�B�cn=�E�_tD�N*��J�%���K
�D���D=<�������h^���I@����z�|��R�"�K�2�;V�� ���mc��[���ct.B+H�*R�y�I�E�X;�VC����)�"{����45�����D-5�h):��L*2&D&d� ��r�_�V��d*�\+�(]��[~`�z�&c.3O���m�\��A��� "����F'����F����t[�Z�UW��Ls���]J����&`���"��,���C��u7Yfq�.@0��[�T��i�����<'
��`��v���ma�Cd�A�	��<����zH6�<�����������g�1�Ys��=C�w�_���[�!Ze��wc��MfX������"������������\���jU����C�a��vl�V��`�6�x`��\$X=�Ln!�funsVl�����q�+�U��D�����k�������E��o\)���������n�RE�#����m�X�	4BH������ ���|i��ECeZ�>���+����'��=�p�p��Cz�!�>��qec}-�[9�G.�.56?.�rY�Yp�H\�����/V�p� R����q�E���p	������ (�i�.�|�H���D=�Q�<�Y��^�ES'����5?�o�g������O���z�fdPw�8�p�<�E=����z�Q�m{
��p6S��Qq��i�����q��)DU�f�
u���|����v�1/W�&D�I�}5H��M�h����8	eH.���L&##����(a2S� �_����?$�C<eI1�����-����	��L������!�8u��R7oZ�6Hy����7�_�r�b�����D����l^:�N�"T�9����c���v�7xX�je�U
9��DH��4]���)�v�%��>:��G+�S�u�"��-}T\i�#��Y�]���!���y�P)*��C5��jR��5n���kas�5��a�{�������q�+�U��D�%
?�������*M@^j��������5���z�y r����=��������
.�i����p����=����I|#�NZ���k�|��q�����qdDx����%RE���`D��a��D�����W(f���tJ�����K6)W�	�BP5E���=�q�V�.D��D�$���J_q�!�D�b����D�2<X�t!���A���e���)�0A��_�2|�O-���>5��N�l��X���tq�(C�2d�:8=�����
�j;�W��B��"D�2U�������G��q�`�"�UG!H�����s:���M~�t!����C)R� <7�]8,%%�	���L(Q�19~��<Hxz�����{��6�X��1q����y5�>,�}j�DE=d�FQT���_��������G���X�e���D.����`=��9�}���x�A�����tv��n%�m^�sB�n/�p*F`���N}FvG`�ZK�'~��u�(kO���IC���F�M�����������q� �Q>�b��E�������a������l+����IEND�B`�PKI��FObject 2/content.xml�[Y���~���R�>���f�/��8��U��Z1��A#)�>��� $!{��U��c��������?�����"���h���PDq�yZ�������i���X���/#�R��F(��~��X���b'��`E\,3��bY�K����Z���JW�R��d2{E�s��PNeV�=^�<]sE�sG���2+Zp���S�Eb�x=�Y�8$q��i�-�|iY����SS���� �*�38����L*�(�x�����&�Z���l�}�V7)���\Nv
+���/�������p��������K���K#�7e������'��~9��L��R�=W�2�'o���������N��\��m����*�^�%�yx�<dI�y\�cN:l��_T�v��Q\` V
w�EtQ��?���p�Sv"�oqV�,;yF�C��S��<����^0��Hg��L������t#�h����>$������zx=�"���U���H���M��T����Bk��`����C�e� �Tl��=��"���I����'m���4*F#- | MD�����A��i�Tj�h=�8(aQ�r,~��R���#��F�6������P����*v�z�k}S������+[��*��C��0NYb�	9�1�x��qVmf�x�����z�F��ku���-^4k���Q-�HlY6��[�K^���y��"DI�d"��ZM�5u����IWV��S#E\V�.��Rz�����������3U�5�:N���[�H��~�t�@��L}E�h�(/�}��T1�]UwN����p(�"���Y$Fy�AH����0�E���Q�3#�I��fI�WND�jG�����4x���Vb����d����6	�vP���Tg���h�b^����������;	{�I?��0���4��\Uy)yX������Mn<�7>��jhF*7���d���\��f����c���]��T��kGM/�Sd�K�>A-��s�NY�@�8R�12��l�U��[�������J���aJu|w�p���y���TDuyv��-�wgA���7�jhNuq��`D�`{W���.��#�HX���+�LN |f���� &��Dr5�7����#1^X����t��#��3��,��*5�r�A�o��Q�R�E�u���6A��	�^�6�G������!t�Aa�����{#��;���4��-���.�q������U��sR7.���I��m|��7��w]-F,
�_�Y_
5�����Ce���>��geES��V��j��|��J�~Z�f�\GF��l'LXQ4;_!+�����Vp�K����ox=����g�Y���&r�b&f��&Wi��!gY��l��O�'k ODi�����a����C���"�O�����{Y����;k�I�f+2qgz�nd����������X'�X�BH��*�!3ac�Ct�J�������c�L/PJ:��B"�����jg�2N�<�q������/�k�md��8��K�BV)r2�R@>����S����|����~�N�J��j#H�8�#�����G��;��G��N������]%�9�
�
_�K��	��'{�C��=3io�|{�h��>���6��W�n��d\�V��	��q*�I�������g�5G"B3p���G�+��T�j�fE����8F[{�O
�q�UU�����0�X����5:�g�kl��}�QQ��O��a6^��V�*���;X������I�0���W%[g�4P�G:�����z����\�5�w�IC5n`|���"\�t
�[��j^�4���G; 9�{2t�4��9g7;&���]�`���ix����vu\s-�a��}�����5���${��!3%D!%v������5D���}-���t&�p@m��<��4�d>�% �E���:rg�~����l�4�y4P��"���=�U�!2�~��������K=����M�~���g�d�t	E����`W�d�je���l(����kW�I?1��x���������\�v� h�=�=�-���i�T�#"�P�"G��!2�~�$�u���G}�}
���#3�<���� �}���?0���

�I�y���������A!�&��U�!2[�!�@�p]�z��]�I?6��}(%F����V��`�!B��W��A7W�Cs��=�|D�A{����b��:��bNf����=7p=JQ����v�����c���C�"�f�3��b\P��jS��m��m5����ze������I��p�sz�{�l	�B�6��%|������C}�{e�|Lm�����������PK�VI$	�7PKI��FObject 2/styles.xml�VK��0��W V=i�%�K��\m�+�6�Zc#�	����<�dI���3�7o��>_j��6\�]���8b�(�e�����H����O[U����*r�����W�Ldi�N��OZ
n
�kf
K
�09��]xW�����m��.%;����={p���K�5
��ZJ���*!�n��7Q\�o��hmS ����]���P��l��������(J�93([eh��S}`zqz���1�jqW����������i��ty��t>��Y��C�|��XnG��=O�/�;��!���2��C8���UP���.C�H���@k��]�_�f��v�\~��:�8�G[��c������B!�5���K���O�{����A�1{��R�A����aF���U��q���$!X�}���a�;�VL,�3&���7p`ar��Y��j��FN��%
k���y���}�o]��rp��h��e�y�
3�5��F�k2ED��&`�1�Gt6�P���R��*��QQ�o���2i��B�i�9 �k������Ai��#�Q��[rs����]��l6���>K���^6��X�w7%u/�����8������%�Ip������i���4#v+k2(OxL��=��U��9U>E�w���tbH������PK
6���PKI��FObject 2/meta.xml��Ao� �����*O�iZ�6�a�&�l�n
�W��`k?�*��-M�#�����G�=�UpB�*�s�����J�9y{}�d[<d�pP�4��Q��F��K�n�X�Ig53�U-����9�L�zjas���q�\)����s
����Kjl	�f�_�P)�\���SRV8$��&v0�������1���}\E)���.����\�%\���Ia�8u�#��nH��H��`�%���1���/Q����b�>,�xR��5M;����}����`�k>Q8H���O��d�d���~���P|PK�u��#LPKI��Fsettings.xml�Zms�:�~E��w���v�����o��mA��[�T�
	����D{[
�E���{��*I��p�8��������qD��R��*G���Cdv��G��s�k�����\������c��[��<Nx3Y�TBF�p����7���$�c����k���#�t�����ZE���O��juM�j���V��G4��*����R�BH�Y�5T���|V�6B�RMCim������� y9F��n�6�c�.I�\ �hM�:����8r0�#(�E�
�""Bi��� ���"�����`�	��<��T=���C4�gJr~~r�/���cD<��^�F��Z��.�V�H����&�@i�>Q���1hJ���%��#}����A#d��[���!p����i1K��~��>+��}��3%`+�H�P��?����L �*���[
��^�_��
��kt�Y�z���������)��K*u��-7�oQ�T�g�;�E�R��$L�.���i��`jQ%����/��
�[s�J'n�RQZ��09����E��:��[����LY���S��(�`������K<,&h�Z��������G�y���C3�����w�}��TT],w!������1�#��8;��Y	v�@+}����OL�!�d{R	�5�P�DS����l���������RH,�50m�2"+�MOR�	��w~�Moi��"�Px+t<�@<W�����/�:	��D�Zw�(A����~4{�b��Cr!d 6�G��x�L/��U�%��v2Y�ALy�3��6� kX�����9�6$�AF3U�x5��}��-
� �J�7�0�c��^���
5�Z(�t7��N���RZ3��wM����+0����W�CL���?�o�z�n[���]�������s+~��?��������4H[��guz?���N����U���q�����kr����*�h���^��\=L�j������}V��_���8�9�~�zu��;�����o:���t���K��Mz;��������$��z4�M������1�^��|�s:R#����p�v����|��dj����Fw���w�6w��{����ew���#���v���7�=���A�5�rz�$�!�h���8���]&��X�/?�PP`7���;���N/�������T�UT����W�X�!��_Q����|����j��kD��P����W?�,�Jo6���R� ����V8���k@f!x?"��kH
V34��sP�V��9`��K����|��n�s�{ t����;��jm���U��j�������9Q���j��*��T<o=dT�;�����D-��$�PK�XC�"PKI��FObject 3/content.xml�Z[���~���b+���pu{�Ry��C����d[;��v~}�$�c���;U;]�nt�:�OGx�>���������d=�2�9-7/��~�l'����<���fd��lW���3^6��	��z��/�N�K�kZ/K\�z�dK^���Z��KeK�����W��tC�\a�;����-+fS:x?WX�BPM�5�+|�������
yq`���bm��Z��~�w�������4u�w8����`�+�\��4V����oA<�?�k�T��W"f�7�,���fvE�m.�&�b1�6�0�A>?�An���^�I�~������D1����*���M�m�s�{W��nP���P��g�{�}/hC���]e�0����b*h����a�7Y�}��@�|W�{�:����_~�g�%>1���6-�������;�\A*.�>0���	��{��M�.���v������N�B�C��o�����zH]�4h��r����$Oo
��b��Bk�+apr��#��*I�)��@�Y������24����E��I5��E
�m���!=<Dq��N���c�#���:h������f�����d���&�k8`�l����Yc}�z�I��������0=�O9�h��]1��c(��R�Rmfs��
P=�]=��V�����l�Y�������Nd#p���T5"J�'Yy�J�����%Qf
������'��>rdL����Q�n�N���'8�8	�����@�X�{M�x����,����,���C1��W���EUM��n���%�<�9��;|S@�c����+P�W��Ri��]N�-�sR�a�k�YM�+1I:�r#nlRT���H7%=C
�o������N��).�f����0������U8�vQA���6��jsZCgm�_	����)�-h6�� 7t� ��^KW�7��~�X}��)�6��A�;�����6�������Vzt7R]��\�����A�I���K��A�����F�h���rxF�e���%�S��[���h���in"�0�F�b
VO��|Cl!�u����G,��N��3� Aj9,�Y��	>��|$��?��y���4x��q��`��b�+��jN4�	j2��������3��E����!]���]b�"R[$w$)�}[6���e�C��z�hr:Q~��M����w��ErG�<��6-�������o��G�}�Q~���n�M�l�G4���{�t�J��k�h�~���n��8�u���(S��=r/�&j	�<?�����N��T^�8�EN�v@�aQ� ��H}���
�~��{��QS��]�d�u�e��F��n
��o�:g��22�k')������8XtnB�}'�4~�����P�R�O��N���2��P1��p5�����e�|�`\��<�-�b����=��"]��>�^�-r/5�E��cmv�Ai2�{�,B��?��2�\��������!qB/	�td%u�x16;��xy���F�
����G%h���>L5���8��xI]�m#h>��*���qU���NI
P|:�j��������}�?�\_)��l�I�;��C���h�q�od����������p^�8/#.:3"�����~�fFf������C�7�y����9�����1c��
�[3��i.Ss���g]���-\-�x�aV_J
�`��9���e=��Ei�>������D�h�b�0��������+#�P�"���L���V��udU�C�0 [����~�
��{k��0�����U��Y��
j2�s�<�Q�����k@�A��E�$QG����r��&�
L�p����V��������qQ/b��<��H�(7���w�w���8��'��#�M������0JP�����p����6���|����V�d=�B�x�4�#Y��x'�c�c�{�I�8	QE��1�<��\h|P����I?L�y���S���
�Z�iQd?r������������"������=����~n_����'��~��=�����PK�oX��+PKI��FObject 3/styles.xml���r� ���)2��Cog&��>@��c�)F���}�.�&)�K[�/	I��i���cJs��$[o��
.�C���9}JN�?{(KN.��5�&��C0��b��h<$����KR3�
��09�pHcj�����=�
L���-y����P](���kk�K�Z�%����-�Ap�~H��4����}�U�l��!o��3��Jx���	��i��34������>1�������jW�8=�_/[��-��E�T�&:�H�z�������o7��h���.�+n�
pz�D��
P_�e�)�\�'Z�C����k@�9�2����l��=�Z�[g��J�U���#;�v�����aq����<����l�<�����#��|�*U����V�#�|)��3�ex�!�1�py�������:7������-uK��������&����t���/��PK�����yPKI��FObject 3/meta.xml��Ao� �����*O�iZ�6�a�&�l�n
�W��`k?�*��-M�#�����G�=�UpB�*�s�����J�9y{}�d[<d�pP�4��Q��F��K�n�X�Ig53�U-����9�L�zjas���q�\)����s
����Kjl	�f�_�P)�\���SRV8$��&v0�������1���}\E)���.����\�%\���Ia�8u�#��nH��H��`�%���1���/Q����b�>,�xR��5M;����}����`�k>Q8H���O��d�d���~���P|PK�u��#LPKI��FObjectReplacements/Object 1�]mlG~�>��}w��8�/q������I#���s��!�zD���Pj�*
P�&Mi���*�SRR�-*�R��H~D���J�PPEUDE
�* �y�������o|��n.s�����;�<��;���zsgz������D����/�}[>�	p&
p�*�nv�������!�����"	������T�Z��V��>X{
�Q����{<����,D�9�9�[��U���9��\t��yw;���s�+'��&wm��}|b������������m�(G#���;����~�?��k������7�z��C���?�9�9]|�K��P	�%u"
��p����R��,�'Eft{������7�0w��8�����W���*&�o�����y/H������E�1�^�0�����E�1�^�0������y/H������E�1�^�0�����rc�� a"����rc�� a"���/���������(����{A�D�H���H� y/HX�SNo� �|�����E�1�~K>����~Qn����yZ\�~Qn������$�����A,���\��E�1�~K>�����%V�����X�! /�5������������A,���7~��b�����{u~K>$������X�!!o�.���	y���� �|H��?���CB���	~K>$��?����CB��c)~K>$��?����C@^�)%��C^��@���0C��!�Lb[�/_�[����r�	k�zp|~1?�����^V�"�����sA�A�F��],�5�y�b7���_�����A��<��CL��`��J���N���X&�WR�#�0�mQ��-wsQ��e,���)�7p��������G�n.�/k�|e,���)��.�������w����^���X&�WR����E������7�5���eB|Up��/���{C�[<�=����(�"9����Wr���U���k���*�A�O�Oc����8��DyKrv�+c�_<H�)�z/������K�� g�!�2�	�U���"�'c��x�G^����]���X&�WR|��^����{�<�����:�W�2!�*x��S�uC�?	��8��D����:�W�2!�*x��S����qy���c���_�����z�O�ZH��!�"�S�-��������e��!��}/k�������(F�b�.���V
Rd�����#�7�H���^��E1L�\4H�)b���TG���,�u�\����@��"�wjy��V���,�u�\����@��"���<"�Z�#$*�z"�0!r1� E�H���G>m5<����!rQ"
Rd�h�V��+Q�PY���(�	�����+�[Z-����+y?���q��{A����%�?��:�?�w�{A����%�i���Tu��.y/���Q����LN���m������ve\��y��a^	[�{	�������C�N'�����7����=������r@�l��9�D�a��,�
�8������|w��{�.��e�������sz�K{I�5��M��&�M�Kq�6��
����
�/���+X�'X�
�/�Sm�`�>���`�����l�'��,_��]�`�>��`���q�+��O�!+�\������@�I��F�R������t��js[,D�tDn���*��#C�����`�J��Lu����Z:>3�U��6�1���f.Di�>�KG��*���:v�;1����6�,��N�	jY��	N{��Hm��gy�B��z	�
/��^R���l���������=�������,����$oO�%e�%�����JK���^Rv^�� ����$oO�%e�%
��K�KK���^Rv^2^R�X��������F���<���i��l�d�z��
RX�u�`=�n��G0
�f<��x���G�>���@��u�n��z����-i9}k���0=�h�c����Wr_�bw������Qz����C�{���7�N�l����^B�_hx��1�n]�+L�4��J�����:�x��7���K�-�1���Wt����{m�C��5�Y�'NV�9��}�e��t��T'7��M
r�"��QnZ,7-�����f�)&7������T~P��t���*oPnJ/������rS���BnZ)7���:�����ZnZ#7u�M7�M]r�Z�Iez�:
|�z���d7���)H���y�|x�o������;�I����{���^F�5���N!�(�^58��^n�()a���'{�%<;
�:
\�c}��{�@�.����h�m
�h	4��D������e�&_��j�ZV	6_Y`����	L�
�?��xZ1��$NU�v���v���g��D����y���
<�x���M�����J�9S�#8j����?��bk������5�>LC�����uP����dzt����0����l*<��K�O�����FT�S��R��)5����R��)5�-5�yq������[��q~3�����[*�g��8�<y��h��8z�McH����s�F7�cL����2��7�����;�=����^�k%U$���������W5�!��&��u��L���T���r��1�'M�����QH��?�$������~��&��R4,o���?������G���%�R�o����/���F
� ����8&��1���8+<?��_E���������i��k�c��$Xi���y�����������q7��=���|��%cl[z���������x����"y�����F�-LO��Vc@��s�SC-/_���z����UV��]Vn*��]�)���sJ�nN���yj�(uN����)�dN��9��)vN�8��+QxN�9�h�9e���S;�@�s�_[���a�s�e���s���S��rM�)�9�g'��0	�/�^��[�aO�Xi;���s����PK�����PKI��FObjectReplacements/Object 2�]p��o��w�>A�b*��VF�x#�)�c���F�(��Z�BA���-��Z���pZ�t�NGS�Vk��@�*c��:*�;���{s��n���{g�~9������9���>2����-M!)|��V2��Ys��JEva3

�"W�l���;r�F��g�l5�:�>�G���_�W�AP`����z
joC��l�j��L���^�	�d�G�g��X&`���B1;m��O�gj����+$�Q��y�[&�i�=sZr�������O�A6��j<��s��S-��ws�4~MmH����3CJ���P�R�.��}���u�H��c=(>�8?J����:��z�����ipN1���,P�:`���������O�����z����g��)��*�K�g�g��)��:�����3I��]��B���$�S���_
=>��O�_b�z|&�_�W�Y[��R�M���[*�/���M���D�/���M��������B���&	��A���c�z|6I��_=��R�Y��$A�>^]s�~Yw�<	>�$��[���M���?(����l� x�����l� x���}�l� x�����$A�>	��wl�I��}��oWe���$x����&	��A������g���EV���O�
1�d~��K�{�B���R���t�q���E\`�"����qN���jt�(Q��S�?
����A"���k�V�"���B�\��9�Z�]T�c��l��!rN/D�E�O�g��,��<\�S��>,[�n�����s��S��"7�b7���j�[�X���9'�"�"�������1�����O;�e��
�srx!r.�|��T�������GE��l��!rN/D�E�O���qba���E*#"w�g��wC��^����]�#�:y����H/��N��3����$����8��������`Xh<�s7�z*����D��-�|����/W2��S�4�*�V!�v7�w����N��)�J3�2��W���*��+�v7�w����N��)�J?�3-�`Zj���K��
�sy!�S�|�����LW�ULW��������1��;%���*]�]�i��	��V9�T��;��B|���_����������Ze=&�v7�w����N��)�JoD���jL{�r[DR�n��������+������7���7���-��7w�/n��y�#���ot��<�	y>�W��ia���#L-��O�pE�s�sy!�S�|�o�Ng�f��>z��w����N��)�Jo�d�{_����V���p{.�c./�wJ�O�Uz[e�{8���B�^��;��B|���_��gF����1����?�%�sy!�S�|������m�-�ml����j�\|�\^���<����v���6����V��y~��w����N����O���!�]�UR�8C��3�"���J�n�
`)������)�n�U��woF
=�
8�2�BU&�{�&���o[��E�n�?��z8�B������j}^�����:����W|���N����go�a���^��5���/�����,N�Q�U��
|�)����8{}�8���c�_��O�������������7�`�����l�x�O��f�����G��T��?^<<���B�__PwJ���������G�>A���E�N`;�
X�1j^|��E���X�n�-������[�wC���b>�P�8xx�b����
�Ye���.��c�Y�=�+�/b�<�s�W5���!�{{�
����E��[�������>%����j��)�n`��'�9�]lRw��w��h�2Sf<���.��M5���5��Oz�O�W�O����*����T��������c���1���(��9J?���Oj���n����:�����z�W�i�F?m�����+�4[���j���~���Os5�i�F?�����h����K��h�ST�����������~zB������S����(��:J?m��O�G��h�~�������m1����t F?E����8�4;N?-��O7�~�������6��#N?m��O��8�O�����8�������Sm�~�����O�1��_�~j��O�����:��A���t�i�F?����F��;�����S�J�iZ�te9����~Z[J?�,��`n�?���{'0Tt�N�w�&	Lr�����'uY���g���-0��&3��7����d�i3���L�����n&sO����7���f2�r���>�UC���5���5�U���z�7}������j���j���j�jo}��������+5����I�Wu	���8}�*N_���Wo����b��%1�J��+��>��{��U[������������u�J�NP}�F�������:}���WU:}�K��>����5��M��z]�����W���|���W*6��74�j�F_���W5��c��:��W�:}U��W�f2Wj&s�f2�����dN�����j�U�F_=��W5�j���/h�UH�����W7D���#���0}�4L_}VI_����U�W�+��������cX|:�}q00I`��$�,>j'tT�e^Kr^����Sf���<�9�^p��f0M��j	�Z/]�|����eus.�:wZR�f��g���2Et���
��C�m��G�����O�_-���	�<���!���a����c��Z��U������+3#J�l�6�)d�T`�Th�t�=Wsf&�$���8�������92c��������.;����Ff���Q��fy���,T-#}���"���c��2o������N����o�C��
����{�.s��9oT�<�O��o�C�����<�J~��-��|���� ������D��� �?noX4H�����S$�����I�q;xCA�o;x�>���0����"?>=�V�t�������O+;%��=�n�D�}����H�p������$���U�o�E�a
��<R�T���u����a��{�����M1N�M�C;=�2I���JJ����D��z7~Y)'�������ob�h�]U��W����Irb�?>x���a�2&D�,�k��2�	�DPf����g ��vy7x6�PI�lw���v�z��L�������Jl�.�oj,�m:���v���T�D��9����y��y��n�d�|��F�&s�5������� 
�7��)�,,�8��#�0�_a��)�nS5���{1�#u�n�����]L��2��r����+��*�h���o��7i�M�}S��)f������1a�Te@����c�o�h��[R�m}K�D��`}�z}+�wo}K�j}K�[����qv����C����&q��}�����$:'�[�����Ew��&���q
� ����)X���-X�l�=��;��SB���_����x�������������K-�PK��5Sz
8�PKI��FObjectReplacements/Object 3�][lTE�w���o/,E
�%*7�=$�X�SAj[m��MM��`�UL�x����I 1��1jx���h���d�����/�hb4FS�����������a(s�s������������3��O@�#+�}�q������Oxo6�������X6;��U�z�l���i��7����W�$Y)�*Q|
����]y�~y%���j��v�����li���!,�NK�N;����g	+3x�v���}dh�5>b=<��z`� G#�Iv��k��
�
��N��������r������G���k\<���,��H('R�<G<��4K����^�3z����b�;�u	��e������$�N�gVr��*#�������/����At"~)���2�n��?���"���D'��:�Ye�� :�����EVy7�N��Vp��*#��������2�n�����~�UF�
�y��h^�
�b�k@��j�Ye�� �����/���{Ay
����Ye�� ���_Z��"���������k�_d������������U	y/�!�y�YC)y/�.���bxh�1�5!�����������U^C^����yAyM�+P�1�5!��)�������G�^C^����{AyM�+���1�5!�|g�������fI)y/H4�X�B����3��`�����*�L���r����_�?��������y�6���9A-H����o��mM��V~/��r �� ����Z������~�-���EyA�P� �h���V*�w1�4���kyV5dyV��e�P�w�����#��i�0���zXa��\��]�g�)�NV�l���l���P��"��X*�/g�)�6�y���P����qS:��Kc��,x��?bA��NS3���<��d����o;RXa��\��mG<��S�]J���%��QXQ~���>��X*�/g�)�r�u�r����r�Q_KE�e���dX\
��d���?\��\@PJ/��O�n�h�'�P�[���+�'"��$Z��4	E~us��N��$��(��	v�Z�G���v������t��H}h�`^�``����/L����LL=�M$�w�������4[���vPp��9K?�?��������X�n
g��lg���k<��"��Y4�-�\�J��5Tp��T%����Ue�U�X��*La����M���*G��@ez�2�(C�V��\j����4+!m�]��QM�&�SH�V���hr��#)��u����JG�N���4���x�6�xr��i2O�\���%�y]&�n�x����{&o�z*S����T��(�2�,��t*�m��U�mM\��@ez�2�*�S#Wfs�2��2�(C�����W��W7�x�5B�NI��X,����*�x������0�aw���x������0�awWB������*�E<���wcpP��k�v���!����BHc��!���T�t`_�J��{A���G��Sm��!����X��?i,��d�u��B�b�������x��(^�8w�S������� t/������bW{�.��H��&.>�����07�������������b?���)|'��d5�����������,��<Oe�e����d*���2�U��Uc�U�
�������[S@��L�����c�{g�1��%��y%�r���������
�1{���9���c��c����L��x�����P�X5���c�U�J��*��j����Z���U�?/��B�U���U�?����k(=�X��9�Zlyj�;�d���)�
�S,3��9��)�)�J�)� ;��UrN�_lyj�;�\j��S�#�S~�s����o�3��Ts�1������x���PKY�w�p�vPKI��FMETA-INF/manifest.xml�V=o�0��+]
�����	Rt(
�\0�If��<&��/��������A6�x|���N��j�d��	�rQ��47��}C~�������l��8�w�,��n�6�[]���5S�j��@��{���-�8;P��Y�����<���}v�������c ���V�74�
��aH��-���C��,�����9R���A��#����Y�
����F�;�������B����Fw��v�J�8	aj,����=x���r^G	�?D�G���p�.h��	U�����G���:_1;���V^�k&���������@��K�V���Ll}�����x� ��b���R�]%v�J�v��n?�~�A2���g��u�M�	y��x1���QU��gg�b�J��������/_C�mHz
�J����;�[�����Y��PK>C���PKI��F�l9�..mimetypePKI��F���Z�Tcontent.xmlPKI��F({R��PLmeta.xmlPKI��F�e�~6� 
&styles.xmlPKI��F��h���manifest.rdfPKI��F�Configurations2/popupmenu/PKI��FConfigurations2/statusbar/PKI��FCConfigurations2/toolbar/PKI��FyConfigurations2/menubar/PKI��F�Configurations2/floater/PKI��F'�Configurations2/accelerator/current.xmlPKI��F<Configurations2/images/Bitmaps/PKI��FyConfigurations2/toolpanel/PKI��F�Configurations2/progressbar/PKI��F��|'3�Object 1/content.xmlPKI��F
6���T&Object 1/styles.xmlPKI��F�u��#L)Object 1/meta.xmlPKI��F�L�
~Q~Q~*Thumbnails/thumbnail.pngPKI��F�VI$	�72|Object 2/content.xmlPKI��F
6�����Object 2/styles.xmlPKI��F�u��#L`�Object 2/meta.xmlPKI��F�XC�"��settings.xmlPKI��F�oX��+?�Object 3/content.xmlPKI��F�����yr�Object 3/styles.xmlPKI��F�u��#Lu�Object 3/meta.xmlPKI��F�������ObjectReplacements/Object 1PKI��F��5Sz
8���ObjectReplacements/Object 2PKI��FY�w�p�vv�ObjectReplacements/Object 3PKI��F>C���/�META-INF/manifest.xmlPK�"�
#17Jim Nasby
Jim.Nasby@BlueTreble.com
In reply to: deavid (#14)
Re: Is it possible to have a "fast-write" Index?

On 6/12/15 9:17 PM, deavid wrote:

(upper(codagencia::text) );

FWIW, you should consider using citext for these cases; it would let you
cut down on the number of indexes (by 50%?).
--
Jim Nasby, Data Architect, Blue Treble Consulting, Austin TX
Data in Trouble? Get it in Treble! http://BlueTreble.com

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#18Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: deavid (#16)
Re: Is it possible to have a "fast-write" Index?

deavid wrote:

I did another try on BRIN and GIN indexes, and I compared to regular btree
indexes. Now i have 16M rows to do the test.

The numbers seem to be good. Both GIN and BRIN seem good options for
certain tables with more writes than reads (Specially BRIN is very good)

Thanks, that's very nice to hear.

So you may or may not have realized two important details regarding
BRIN. One is that when you insert into a table, the values are not
immediately put into the index but only as part of a later vacuum, or a
brin_summarize_new_values() function call. Either of those things scan
the not-already-summarized part of the table and insert the summarized
values into the index. If the new values are not in the index, then a
query would have to read that part of the table completely instead of
excluding it from the scan.

The other thing is that in BRIN you can tell the system to make the
summary information very detailed or coarsely detailed -- say one
summary tuple for every page, or one summary tuple for every 128 pages.
The latter is the default. Obviously, the more detailed it is, the more
you can skip when scanning the table. If the values are perfectly
correlated, then there's no point to the extra detail, but if there's
some variability then it could be worthwhile. You change this by
specifying "WITH (pages_per_range=16)" to the CREATE INDEX command, or
by doing ALTER INDEX SET (pages_per_range=16) and then REINDEX it.

--
�lvaro Herrera http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#19Nicolas Barbier
nicolas.barbier@gmail.com
In reply to: deavid (#1)
Re: Is it possible to have a "fast-write" Index?

2015-06-05 deavid <deavidsedice@gmail.com>:

Mode 3: on "aminsert", put the new entry on a second btree; leaving the
first one untouched. Because the second btree is new, will be small, and
writes should be faster. When doing a index scan, read tuples from both at
same time (like merge sort). On vacuum, merge the second btree onto the
first. On this mode, the index is sorted and there's no need of recheck.

You might be interested in reading the thread “Fast insertion indexes:
why no developments” (2013), starting at
1383033222.73186.YahooMailNeo@web172602.mail.ir2.yahoo.com .

That thread talks mostly about reducing the (delayed) I/O caused by
inserting in a super-big index at a continuously high rate, while you
seem more interested in the delay problem caused by the CPU time used
when inserting in multiple indexes (which should be quite fast
already, as most of the writing is delayed).

Your problem (if it is really about delay and not about continuous
throughput) might be better served by a delay-reducing solution such
as writing a logical “row X is inserted, please make sure that all
indexes are up-to-date” to the WAL, instead of the physical “row X is
inserted into table A, part Y of index Z must be updated like this,
part Q of index S must be updated like so, etc” as is done now.
Updating the indexes (not only the writing itself) would then be
performed in a delayed fashion. Reading of an index must always
additionally scan the in-memory queue of logical WAL records that is
kept.

Of course, switching the WAL wholesale from a physical description of
the changes that must be performed to a logical description is
probably not feasible. Therefore, one could think about some new kind
of “logical WAL” that gets logged separately (or even mixed in with
the normal, physical WAL), where first the logical WAL is written
(“insert row X in table A”), after which other operations can continue
and the logical WAL is converted to physical WAL asynchronously (by
“performing” the changes as is currently done, but by a background
process). Recovery then would first need to replay the physical WAL,
and then replay the logical WAL.

Nicolas

--
A. Because it breaks the logical sequence of discussion.
Q. Why is top posting bad?

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#20Robert Haas
robertmhaas@gmail.com
In reply to: Tom Lane (#3)
Re: Is it possible to have a "fast-write" Index?

So I really doubt that anyone would have any enthusiasm for saddling btree
with a similar mechanism. It's complicated (and has been the cause of
multiple bugs); it's hard to figure out when is the optimal time to flush
the pending insertions; and it slows down searches in favor of making
inserts cheap, which is generally not the way to bet --- if that's the
tradeoff you want, why not drop the index altogether?

I'm not sure you're right about that. MySQL has a feature called
secondary index buffering:

https://dev.mysql.com/doc/refman/5.0/en/innodb-insert-buffering.html

Now that might not be exactly what we want to do for one reason or
another, but I think it would be silly to think that they implemented
that for any reason other than performance, so there may be some
performance to be gained there.

Consider that on a table with multiple indexes, we've got to insert
into all of them. If it turns out that the first leaf page we need
isn't in shared buffers, we'll wait for it to be read in. We won't
start the second index insertion until we've completed the first one,
and so on. So the whole thing is serial. In the system MySQL has
implemented, the foreground process would proceed unimpeded and any
indexes whose pages were not in the buffer pool would get updated in
the background.

Ignoring for the moment the complexities of whether they've got the
right design and how to implement it, that's sort of cool.

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#21Simon Riggs
simon@2ndQuadrant.com
In reply to: Robert Haas (#20)
Re: Is it possible to have a "fast-write" Index?

On 19 June 2015 at 14:30, Robert Haas <robertmhaas@gmail.com> wrote:

So I really doubt that anyone would have any enthusiasm for saddling

btree

with a similar mechanism. It's complicated (and has been the cause of
multiple bugs); it's hard to figure out when is the optimal time to flush
the pending insertions; and it slows down searches in favor of making
inserts cheap, which is generally not the way to bet --- if that's the
tradeoff you want, why not drop the index altogether?

I'm not sure you're right about that. MySQL has a feature called
secondary index buffering:

https://dev.mysql.com/doc/refman/5.0/en/innodb-insert-buffering.html

Now that might not be exactly what we want to do for one reason or
another, but I think it would be silly to think that they implemented
that for any reason other than performance, so there may be some
performance to be gained there.

Consider that on a table with multiple indexes, we've got to insert
into all of them. If it turns out that the first leaf page we need
isn't in shared buffers, we'll wait for it to be read in. We won't
start the second index insertion until we've completed the first one,
and so on. So the whole thing is serial. In the system MySQL has
implemented, the foreground process would proceed unimpeded and any
indexes whose pages were not in the buffer pool would get updated in
the background.

Ignoring for the moment the complexities of whether they've got the
right design and how to implement it, that's sort of cool.

Interesting.

Reading that URL it shows that they would need to write WAL to insert into
the buffer and then again to insert into the index. You might get away with
skipping WAL logs on the index buffer if you had a special WAL record to
record the event "all indexes updated for xid NNNN", but since that would
be written lazily it would significantly complicate the lazy update
mechanism to track that.

It doesn't say anything about their being only one index buffer per table,
nor do I think it would make sense to do it that way. So ISTM that the
foreground process still has to insert serially into N index buffers, with
each insert being WAL logged.

So the only saving for the foreground process is the random I/O from
inserting into the indexes, which means the value of the technique is in
the case where you have many very large secondary indexes - which is now
covered by BRIN.

--
Simon Riggs http://www.2ndQuadrant.com/
<http://www.2ndquadrant.com/&gt;
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

#22Merlin Moncure
mmoncure@gmail.com
In reply to: Qingqing Zhou (#12)
Re: Is it possible to have a "fast-write" Index?

On Thu, Jun 11, 2015 at 9:32 PM, Qingqing Zhou
<zhouqq.postgres@gmail.com> wrote:

On Fri, Jun 5, 2015 at 10:59 AM, Tom Lane <tgl@sss.pgh.pa.us> wrote:

So I really doubt that anyone would have any enthusiasm for saddling btree
with a similar mechanism. It's complicated (and has been the cause of
multiple bugs); it's hard to figure out when is the optimal time to flush
the pending insertions; and it slows down searches in favor of making
inserts cheap, which is generally not the way to bet --- if that's the
tradeoff you want, why not drop the index altogether?

Hint bits update is also painful in above case, but it is out of the topic here.

Are your records spread out around many transactions or so you tend to
have large batches all with the same xid?

merlin

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#23deavid
deavidsedice@gmail.com
In reply to: Simon Riggs (#21)
Re: Is it possible to have a "fast-write" Index?

El vie., 19 jun. 2015 a las 15:06, Simon Riggs (<simon@2ndquadrant.com>)
escribió:

It doesn't say anything about their being only one index buffer per table,
nor do I think it would make sense to do it that way. So ISTM that the
foreground process still has to insert serially into N index buffers, with
each insert being WAL logged.

So the only saving for the foreground process is the random I/O from
inserting into the indexes, which means the value of the technique is in
the case where you have many very large secondary indexes - which is now
covered by BRIN.

I'm still learning how postgresql, but, you're assuming when inserting in
bulk into an insert would require the same amount of CPU cycles and the
same amount of kB written compared to doing it row-by-row.

Most memory-based indexes have a bulk load technique that relies in having
the data pre-sorted. Sorting pure random data and then bulk-inserting it
into the index is faster than the classic insertion. (less CPU time, no
idea about IO)

Database indexes are disk-based and there are some points (regarding IO
performance) that are hard for me to fully understand. But seems logic that
would be faster to scan the index only once from begin to end and do
something like a "merge sort" between pre-sorted input and the index.

So I guess I missed something. Maybe is WAL logging the problem? If so,
could this work for TEMP/UNLOGGED tables?

Lots of tables that are heavily written are materialized views (or they
perform more or less the same), so they could be refreshed in case of
server failure. I hope bulk inserts could double the performance;
otherwise, this
idea may not be worth it.

About BRIN indexes, i'm really impressed. They are several times faster
than I could imagine. Also, on select they perform very well. I have to
test them more, with more complex queries (they would work when used on
JOIN clauses?). If select times are good enough even in those cases, then
there's no need for doing bulk-inserts with btree.