Re: [HACKERS] [Fwd: Index Advisor]

Started by Gurjeet Singhabout 19 years ago39 messages
#1Gurjeet Singh
singh.gurjeet@gmail.com
1 attachment(s)

Hi All,

Please find attached the latest version of the patch attached. It
is based on REL8_2_STABLE.

It includes a few bug fixes and an improvement to the size
estimation function. It also includes a work-around to circumvent the
problem we were facing earlier in xact.c; it now fakes itself to be a
PL/xxx module by surrounding the BIST()/RARCST() calls inside an
SPI_connect()/SPI_finish() block.

Please note that the sample_*.txt files in the contrib module,
which show a few different sample runs, may be a little out of date.

Best regards,

--
gurjeet[.singh]@EnterpriseDB.com
singh.gurjeet@{ gmail | hotmail | yahoo }.com

Attachments:

pg_index_adviser-REL8_2_STABLE20061208-v22.patch.gzapplication/x-gzip; name=pg_index_adviser-REL8_2_STABLE20061208-v22.patch.gzDownload
#2Bruce Momjian
bruce@momjian.us
In reply to: Gurjeet Singh (#1)
Re: [PATCHES] [Fwd: Index Advisor]

I have looked over this patch, and it completes part of this TODO item:

o Add SET PERFORMANCE_TIPS option to suggest INDEX, VACUUM, VACUUM
ANALYZE, and CLUSTER

Here is the foundation of it:

For an incoming EXPLAIN command, the planner generates the plan and, if
the Index Adviser is enabled, then the query is sent to the Index
Adviser for any suggestions it can make. The Adviser derives a set of
potentially useful indexes (index candidates) for this query by
analyzing the query predicates. These indexes are inserted into the
system catalog as virtual indexes; that is, they are not created on
disk.

Then, the query is again sent to the planner, and this time the planner
makes it's decisions taking the just-created vitual indexes into account
too. All index candidates used in the final plan represent the
recommendation for the query and are inserted into the advise_index
table by the Adviser.

The gain of this recommendation is estimated by comparing the execution
cost difference of this plan to the plan generated before virtual
indexes were created.

It involves a patch to the backend, and a /contrib module to access it.

I think we have to decide if we want this, and whether it should be in
/contrib or fully integrated into the backend. I am thinking the API
needs to be simpified, perhaps by removing the system table and having
the recommendations just logged to the server logs.

---------------------------------------------------------------------------

Gurjeet Singh wrote:

Hi All,

Please find attached the latest version of the patch attached. It
is based on REL8_2_STABLE.

It includes a few bug fixes and an improvement to the size
estimation function. It also includes a work-around to circumvent the
problem we were facing earlier in xact.c; it now fakes itself to be a
PL/xxx module by surrounding the BIST()/RARCST() calls inside an
SPI_connect()/SPI_finish() block.

Please note that the sample_*.txt files in the contrib module,
which show a few different sample runs, may be a little out of date.

Best regards,

--
gurjeet[.singh]@EnterpriseDB.com
singh.gurjeet@{ gmail | hotmail | yahoo }.com

[ Attachment, skipping... ]

---------------------------(end of broadcast)---------------------------
TIP 5: don't forget to increase your free space map settings

--
Bruce Momjian bruce@momjian.us
EnterpriseDB http://www.enterprisedb.com

+ If your life is a hard drive, Christ can be your backup. +

#3Kenneth Marshall
ktm@it.is.rice.edu
In reply to: Bruce Momjian (#2)
Re: [PATCHES] [Fwd: Index Advisor]

One problem with only putting this information in the system logs
is that when we provide database services to a member of our
community we do not actually give them an account of the DB server
or log server. This means that this very useful information would
need to be passed through an intermediary or another tool developed
to allow access to this information. I think that having this available
from a table would be very nice. My two cents.

Ken

Show quoted text

On Sat, Jan 06, 2007 at 04:08:24PM -0500, Bruce Momjian wrote:

I have looked over this patch, and it completes part of this TODO item:

o Add SET PERFORMANCE_TIPS option to suggest INDEX, VACUUM, VACUUM
ANALYZE, and CLUSTER

Here is the foundation of it:

For an incoming EXPLAIN command, the planner generates the plan and, if
the Index Adviser is enabled, then the query is sent to the Index
Adviser for any suggestions it can make. The Adviser derives a set of
potentially useful indexes (index candidates) for this query by
analyzing the query predicates. These indexes are inserted into the
system catalog as virtual indexes; that is, they are not created on
disk.

Then, the query is again sent to the planner, and this time the planner
makes it's decisions taking the just-created vitual indexes into account
too. All index candidates used in the final plan represent the
recommendation for the query and are inserted into the advise_index
table by the Adviser.

The gain of this recommendation is estimated by comparing the execution
cost difference of this plan to the plan generated before virtual
indexes were created.

It involves a patch to the backend, and a /contrib module to access it.

I think we have to decide if we want this, and whether it should be in
/contrib or fully integrated into the backend. I am thinking the API
needs to be simpified, perhaps by removing the system table and having
the recommendations just logged to the server logs.

---------------------------------------------------------------------------

Gurjeet Singh wrote:

Hi All,

Please find attached the latest version of the patch attached. It
is based on REL8_2_STABLE.

It includes a few bug fixes and an improvement to the size
estimation function. It also includes a work-around to circumvent the
problem we were facing earlier in xact.c; it now fakes itself to be a
PL/xxx module by surrounding the BIST()/RARCST() calls inside an
SPI_connect()/SPI_finish() block.

Please note that the sample_*.txt files in the contrib module,
which show a few different sample runs, may be a little out of date.

Best regards,

--
gurjeet[.singh]@EnterpriseDB.com
singh.gurjeet@{ gmail | hotmail | yahoo }.com

[ Attachment, skipping... ]

---------------------------(end of broadcast)---------------------------
TIP 5: don't forget to increase your free space map settings

--
Bruce Momjian bruce@momjian.us
EnterpriseDB http://www.enterprisedb.com

+ If your life is a hard drive, Christ can be your backup. +

---------------------------(end of broadcast)---------------------------
TIP 9: In versions below 8.0, the planner will ignore your desire to
choose an index scan if your joining column's datatypes do not
match

#4Bruce Momjian
bruce@momjian.us
In reply to: Kenneth Marshall (#3)
Re: [PATCHES] [Fwd: Index Advisor]

Kenneth Marshall wrote:

One problem with only putting this information in the system logs
is that when we provide database services to a member of our
community we do not actually give them an account of the DB server
or log server. This means that this very useful information would
need to be passed through an intermediary or another tool developed
to allow access to this information. I think that having this available
from a table would be very nice. My two cents.

Well, you can still run EXPLAIN manually and see the suggestions. I am
not sure even how a system table is going to work in a shared
environment for this usage. Perhaps we need to allow a table name to be
passed using the EXPLAIN, or now that I think of it, EXPLAIN output is
actually is just a single-column text table, and perhaps we would just
need to give people a way of saving that off.

The really nifty use seemed to be setting the GUC to ON and running and
application, and capturing all the suggestions. Perhaps we need to be
able to pass a single-text-column table as the GUC value and use that
for capturing the output suggestions. But again, if you are doing it
for an application and setting it for all logins, don't you probably
have access to the server logs.

Anyway, this is a new direction for us, but I think a useful one, and I
find the implementation used here creative.

---------------------------------------------------------------------------

Ken

On Sat, Jan 06, 2007 at 04:08:24PM -0500, Bruce Momjian wrote:

I have looked over this patch, and it completes part of this TODO item:

o Add SET PERFORMANCE_TIPS option to suggest INDEX, VACUUM, VACUUM
ANALYZE, and CLUSTER

Here is the foundation of it:

For an incoming EXPLAIN command, the planner generates the plan and, if
the Index Adviser is enabled, then the query is sent to the Index
Adviser for any suggestions it can make. The Adviser derives a set of
potentially useful indexes (index candidates) for this query by
analyzing the query predicates. These indexes are inserted into the
system catalog as virtual indexes; that is, they are not created on
disk.

Then, the query is again sent to the planner, and this time the planner
makes it's decisions taking the just-created vitual indexes into account
too. All index candidates used in the final plan represent the
recommendation for the query and are inserted into the advise_index
table by the Adviser.

The gain of this recommendation is estimated by comparing the execution
cost difference of this plan to the plan generated before virtual
indexes were created.

It involves a patch to the backend, and a /contrib module to access it.

I think we have to decide if we want this, and whether it should be in
/contrib or fully integrated into the backend. I am thinking the API
needs to be simpified, perhaps by removing the system table and having
the recommendations just logged to the server logs.

---------------------------------------------------------------------------

Gurjeet Singh wrote:

Hi All,

Please find attached the latest version of the patch attached. It
is based on REL8_2_STABLE.

It includes a few bug fixes and an improvement to the size
estimation function. It also includes a work-around to circumvent the
problem we were facing earlier in xact.c; it now fakes itself to be a
PL/xxx module by surrounding the BIST()/RARCST() calls inside an
SPI_connect()/SPI_finish() block.

Please note that the sample_*.txt files in the contrib module,
which show a few different sample runs, may be a little out of date.

Best regards,

--
gurjeet[.singh]@EnterpriseDB.com
singh.gurjeet@{ gmail | hotmail | yahoo }.com

[ Attachment, skipping... ]

---------------------------(end of broadcast)---------------------------
TIP 5: don't forget to increase your free space map settings

--
Bruce Momjian bruce@momjian.us
EnterpriseDB http://www.enterprisedb.com

+ If your life is a hard drive, Christ can be your backup. +

---------------------------(end of broadcast)---------------------------
TIP 9: In versions below 8.0, the planner will ignore your desire to
choose an index scan if your joining column's datatypes do not
match

--
Bruce Momjian bruce@momjian.us
EnterpriseDB http://www.enterprisedb.com

+ If your life is a hard drive, Christ can be your backup. +

#5Simon Riggs
simon@2ndquadrant.com
In reply to: Bruce Momjian (#2)
Re: [PATCHES] [Fwd: Index Advisor]

On Sat, 2007-01-06 at 16:08 -0500, Bruce Momjian wrote:

I have looked over this patch, and it completes part of this TODO item:

o Add SET PERFORMANCE_TIPS option to suggest INDEX, VACUUM, VACUUM
ANALYZE, and CLUSTER

It involves a patch to the backend, and a /contrib module to access it.

I think we have to decide if we want this, and whether it should be in
/contrib or fully integrated into the backend. I am thinking the API
needs to be simpified, perhaps by removing the system table and having
the recommendations just logged to the server logs.

The patch to the backend is in the form of a plugin API, which does
nothing when there is no plugin. IMHO there is a significant amount of
code there and it is too early to try to get all of that into the
backend, especially when more tested things like Tsearch2 haven't.
Plugins are cool because we can update them without needing to bounce a
production server, which means the code can evolve faster than it would
do if it was directly in the backend. (You do need to reconnect to allow
local_preload_libraries to be re-read). Tuning out the wierd
recommendations will take some time/effort - I don't know there are any,
but then my gut tells me there very likely are some.

The output isn't a system table, its a user space table. The reason for
having an output table is that we can use multiple invocations of the
adviser to build up a set of new indexes for a complete workload.
Reading things back out of the log would make that more difficult, since
we really want this to be automated by pgAdmin et al.

--
Simon Riggs
EnterpriseDB http://www.enterprisedb.com

#6Gurjeet Singh
singh.gurjeet@gmail.com
In reply to: Bruce Momjian (#2)
Re: [PATCHES] [Fwd: Index Advisor]

On 1/7/07, Bruce Momjian <bruce@momjian.us> wrote:

I have looked over this patch,

Thanks

I think we have to decide if we want this, and whether it should be in

/contrib or fully integrated into the backend.

Well, as already said, the plugin architecture gives others a way to develop
and deploy their own index advisers, or even something else that does nifty
things with the generated plan!

I am thinking the API

needs to be simpified, perhaps by removing the system table and having
the recommendations just logged to the server logs.

The advise_index table not required to be a system table anymore, as
required by the original patch. It can be any table/view on which the
executing user has INSERT permissions. The Adviser internally builds an
'INSERT INTO advise_index ...' statement and executes it through SPI. So, it
actually behaves as if the user is doing and INSERT. As a side effect, if
the EXPLAIN is done in a transaction, which is later rolled back, the
recommendations inserted in the advise_index will also be lost!

contrib/pg_advise_index/sample_error_messages.txt also shows an interesting
usage, where advise_index is actually a VIEW with a RULE that redirects
INSERTs into another advise_index_data table.

Best regards,

--
gurjeet[.singh]@EnterpriseDB.com
singh.gurjeet@{ gmail | hotmail | yahoo }.com

#7Gurjeet Singh
singh.gurjeet@gmail.com
In reply to: Gurjeet Singh (#6)
Re: [PATCHES] [Fwd: Index Advisor]

On 1/7/07, Gurjeet Singh <singh.gurjeet@gmail.com> wrote:

contrib/pg_advise_index/sample_error_messages.txt also shows an
interesting usage, where advise_index is actually a VIEW with a RULE that
redirects INSERTs into another advise_index_data table.

Also, the DDL for the advise_index table can be found in
advise_index.create.sql script in the contrib module.

Regards,

--
gurjeet[.singh]@EnterpriseDB.com
singh.gurjeet@{ gmail | hotmail | yahoo }.com

#8Bruce Momjian
bruce@momjian.us
In reply to: Simon Riggs (#5)
Re: [PATCHES] [Fwd: Index Advisor]

Simon Riggs wrote:

On Sat, 2007-01-06 at 16:08 -0500, Bruce Momjian wrote:

I have looked over this patch, and it completes part of this TODO item:

o Add SET PERFORMANCE_TIPS option to suggest INDEX, VACUUM, VACUUM
ANALYZE, and CLUSTER

It involves a patch to the backend, and a /contrib module to access it.

I think we have to decide if we want this, and whether it should be in
/contrib or fully integrated into the backend. I am thinking the API
needs to be simpified, perhaps by removing the system table and having
the recommendations just logged to the server logs.

The patch to the backend is in the form of a plugin API, which does
nothing when there is no plugin. IMHO there is a significant amount of
code there and it is too early to try to get all of that into the
backend, especially when more tested things like Tsearch2 haven't.
Plugins are cool because we can update them without needing to bounce a
production server, which means the code can evolve faster than it would
do if it was directly in the backend. (You do need to reconnect to allow
local_preload_libraries to be re-read). Tuning out the wierd
recommendations will take some time/effort - I don't know there are any,
but then my gut tells me there very likely are some.

The output isn't a system table, its a user space table. The reason for
having an output table is that we can use multiple invocations of the
adviser to build up a set of new indexes for a complete workload.
Reading things back out of the log would make that more difficult, since
we really want this to be automated by pgAdmin et al.

The complex part of this is that the feature requires patches to the
backend, and has a /contrib component. If it could be just in /contrib,
I agree we would just keep it there until there is a clear direction,
but having it in both places seems difficult. I don't think we can
maintain a patch to the backend code in /contrib, so it would have to
ship with our backend code. That's why I was asking about getting it
integrated fully.

--
Bruce Momjian bruce@momjian.us
EnterpriseDB http://www.enterprisedb.com

+ If your life is a hard drive, Christ can be your backup. +

#9Simon Riggs
simon@2ndquadrant.com
In reply to: Bruce Momjian (#8)
Re: [PATCHES] [Fwd: Index Advisor]

On Mon, 2007-01-08 at 11:28 -0500, Bruce Momjian wrote:

Simon Riggs wrote:

On Sat, 2007-01-06 at 16:08 -0500, Bruce Momjian wrote:

I have looked over this patch, and it completes part of this TODO item:

o Add SET PERFORMANCE_TIPS option to suggest INDEX, VACUUM, VACUUM
ANALYZE, and CLUSTER

It involves a patch to the backend, and a /contrib module to access it.

I think we have to decide if we want this, and whether it should be in
/contrib or fully integrated into the backend. I am thinking the API
needs to be simpified, perhaps by removing the system table and having
the recommendations just logged to the server logs.

The patch to the backend is in the form of a plugin API, which does
nothing when there is no plugin. IMHO there is a significant amount of
code there and it is too early to try to get all of that into the
backend, especially when more tested things like Tsearch2 haven't.
Plugins are cool because we can update them without needing to bounce a
production server, which means the code can evolve faster than it would
do if it was directly in the backend. (You do need to reconnect to allow
local_preload_libraries to be re-read). Tuning out the wierd
recommendations will take some time/effort - I don't know there are any,
but then my gut tells me there very likely are some.

The output isn't a system table, its a user space table. The reason for
having an output table is that we can use multiple invocations of the
adviser to build up a set of new indexes for a complete workload.
Reading things back out of the log would make that more difficult, since
we really want this to be automated by pgAdmin et al.

The complex part of this is that the feature requires patches to the
backend, and has a /contrib component. If it could be just in /contrib,
I agree we would just keep it there until there is a clear direction,
but having it in both places seems difficult. I don't think we can
maintain a patch to the backend code in /contrib, so it would have to
ship with our backend code. That's why I was asking about getting it
integrated fully.

The plugin approach is exactly what happened with the debugger. The
backend has an appropriate plugin API and the debugger is a plugin.

The patch to the backend shouldn't be in contrib, definitely.

I would say its up to the installer to offer the opportunity to load the
adviser plugin, or not. I like plugins because they encourage faster
paced development, diversity and choice. e.g. Multiple java language
plugins give users choice. We could include an adviser plugin with the
main distribution, as happens with PL/pgSQL...

--
Simon Riggs
EnterpriseDB http://www.enterprisedb.com

#10Tom Lane
tgl@sss.pgh.pa.us
In reply to: Simon Riggs (#9)
Re: [PATCHES] [Fwd: Index Advisor]

"Simon Riggs" <simon@2ndquadrant.com> writes:

On Mon, 2007-01-08 at 11:28 -0500, Bruce Momjian wrote:

The complex part of this is that the feature requires patches to the
backend, and has a /contrib component.

The plugin approach is exactly what happened with the debugger. The
backend has an appropriate plugin API and the debugger is a plugin.

The patch to the backend shouldn't be in contrib, definitely.

I would say its up to the installer to offer the opportunity to load the
adviser plugin, or not. I like plugins because they encourage faster
paced development, diversity and choice.

I would suggest that if we want to encourage faster development, we
should do the same thing we did with the plpgsql debugger support:
put the plugin hooks into the backend and keep the actual plugin(s)
as separate pgfoundry projects. That way the index advisor can have
a release every few weeks if it needs it .... and it will, for awhile.
Stuff in contrib is necessarily tied to the backend release cycle.

(This is not a statement that I approve of the specific plugin hooks
proposed --- I don't particularly. But if we can come up with something
a bit cleaner, that's how I'd approach it.)

regards, tom lane

#11Simon Riggs
simon@2ndquadrant.com
In reply to: Tom Lane (#10)
Re: [PATCHES] [Fwd: Index Advisor]

On Mon, 2007-01-08 at 12:16 -0500, Tom Lane wrote:

"Simon Riggs" <simon@2ndquadrant.com> writes:

On Mon, 2007-01-08 at 11:28 -0500, Bruce Momjian wrote:

The complex part of this is that the feature requires patches to the
backend, and has a /contrib component.

The plugin approach is exactly what happened with the debugger. The
backend has an appropriate plugin API and the debugger is a plugin.

The patch to the backend shouldn't be in contrib, definitely.

I would say its up to the installer to offer the opportunity to load the
adviser plugin, or not. I like plugins because they encourage faster
paced development, diversity and choice.

I would suggest that if we want to encourage faster development, we
should do the same thing we did with the plpgsql debugger support:
put the plugin hooks into the backend and keep the actual plugin(s)
as separate pgfoundry projects. That way the index advisor can have
a release every few weeks if it needs it .... and it will, for awhile.
Stuff in contrib is necessarily tied to the backend release cycle.

(This is not a statement that I approve of the specific plugin hooks
proposed --- I don't particularly. But if we can come up with something
a bit cleaner, that's how I'd approach it.)

Sounds good to me.

--
Simon Riggs
EnterpriseDB http://www.enterprisedb.com

#12Gurjeet Singh
singh.gurjeet@gmail.com
In reply to: Tom Lane (#10)
Re: [PATCHES] [Fwd: Index Advisor]

On 1/8/07, Tom Lane <tgl@sss.pgh.pa.us> wrote:

(This is not a statement that I approve of the specific plugin hooks
proposed --- I don't particularly. But if we can come up with something
a bit cleaner, that's how I'd approach it.)

I have another idea for making the hooks a bit more cleaner; I will try that
and run it through you guys later today.

Best regards,

--
gurjeet[.singh]@EnterpriseDB.com
singh.gurjeet@{ gmail | hotmail | yahoo }.com

#13Gurjeet Singh
singh.gurjeet@gmail.com
In reply to: Gurjeet Singh (#12)
1 attachment(s)

On 1/9/07, Gurjeet Singh <singh.gurjeet@gmail.com> wrote:

I have another idea for making the hooks a bit more cleaner; I will try
that and run it through you guys later today.

Please find attached the latest version of the patch. It applies cleanly on
REL8_2_STABLE.

The following restrictions are applied before generating an index candidate
(this is not mentioned in the README):

.) It should be a base relation; We do not generate advisory for a view or
Set Returning Function or something else.
.) It should not be a system table; like pg_class etc.
.) It should not be a temporary table. (May be we can allow these; opinions
please!!)
.) We do not recommend indexes on system columns; like oid, ctid etc.
.) The relation should have at least two pages.
.) The relation should have at least two tuples.

The last two restrictions put the onus on the user to keep the table
ANALYZEd or VACUUMed.

I have moved the calls to index_adviser() from two other places to the
end of planner(). IMO, that is the best place to place a call to the
Adviser; instead of duplicating code in every caller of planner().
index_adviser() makes sure that it doesn't get called recursively.

This change however costs us the loss of ability to append suggested
plan to the existing plan, if being called by the EXPLAIN command. Instead,
it now uses the newly written function explain_getPlanString() in
explain.cto get the string representation of the plan, and then emits
it as elog(
LOG,...).

The only kludge left now is the code enclosed in '#if GLOBAL_CAND_LIST'
in plancat.c. We need to decide whether we need the 'if' part or the 'else'
part! I already see a strong objection to the 'else' option, since it is
very close to the core of the optimizer! Opinions needed.

After adding the CREATE TABLE advise_index(...) script to
src/test/regress/sql/create_table.sql and enabling the GUC in the conf
file, 'make installcheck' runs fine, with a few acceptable diffs. Moreover,
post the 'make' run, we can see there are a few advises for the tables
involved in the test run. Four of them are ob serial columns of
hash-index-testing tables, so they don't make much point; but the rest three
of them are on big tables, and one of them is a multi-column-index
suggestion.

Now that there's just one call to the Index Adviser (from planner()) we can
now move forward in making it a plugin.

Best regards,

--
gurjeet[.singh]@EnterpriseDB.com
singh.gurjeet@{ gmail | hotmail | yahoo }.com

Attachments:

pg_index_adviser-REL8_2_STABLE-v23.patch.gzapplication/x-gzip; name=pg_index_adviser-REL8_2_STABLE-v23.patch.gzDownload
����Epg_index_adviser-REL8_2_STABLE-v23.patch�:ko7��S����(`)�d�y8q�N��M��:Z`�0�Jb=3��3r�����A�C�l'��A�h$�����*W_�Ef�����y���P?����??�p���@p����S�V�������Z�O�b�^����6�����j`�JWa��M%������|.��[|��������T|P�8<8x,?���<��x<�o�>�*�]�������	�,��h�<�.��{����}����j�V���������?���Y����_�O��g1�yp�����U�\1��������8;�<}u�A��\�o��b��8cx���^\�$�.5���n���`����n�lNo�\���+�����7�I0��`������Vplc����,>:>8������t4}����p�,�V<�	'�iL}9ku����d2��u�m��������������03Y�r�{�����7e�w/~��t���6��D�s�����������W�0~�������%`F
����^����a�|��%~}~vr��l���on6��137)��4�����&{7�`����o�����!4��#1}p�}�m?8�n������Y*���fa����-qBhm��t�7��m�hS�W������\,U
Fh'�p��Q��q���Y��=��/�|
Y�U�)KU�B
�a��6���a-Z��$ ���R���*��t(��A���U�@��`�6��Oxc������Fc��YU�\\ #����J]������$W(��;Q���-|D`P�J����\�X(�bw_9��
9A���1V�_�p!(Q�x
	�A�X;����z��#�d
���\)@)���*���`��#	CC�����Z��y�L��gGK]T�(x��fm��0^"�J6�&�
����]
�1"g�R�5�(��
$�6���KW�L�p)���-���Q�a���\�A� �\�+�+3%,guF�2��a���h���MU B�T��vrm�"����>eC�D�Y�|\#jk`U�H4U0).$	�h����[����J�����*R
���$�-�V
�.u!����Z�l���f#��dj�(V(�98�R��]C��R["i�RB�����6����h ������n�;��
r*
�������1��!.�u���e���zq���r#������V��ca�e�;���1�p��u��&�4�!���t�� �B���qBM��*�<�oA���Z��-;�
��#n�RV6�Pc�#tt��J��R;G�T���Wo?��_�:	�Cj�+t����
��������3�����3����.[�5]���6�T���w�$�n���OP�!tTp��/��"RX\P���s��n(���e@X�=X�7H�!�O���C�����2svNW�!f���|L�	�[��
�c|���K��j�G�=U!�4<��j���P
6�K��8���������z���'��2V_�K����|\�4���X;��E��@L?x�(�<i�\�k����=9�<=zp���<:��O��>�
�n��'Y  o)��\�J2�q}��(
�,��v�c; E�Z��w��)�n�w��x_(�T��h}�r[��]�j1@_�3�R�)���H�nIi�LB�������E��cN��$C�e��D&[GP��+YxV�R�D)Ys���DL�[�<���H�+9����oN��B����*O��Xl�l;��%�C�kB0A�L����v�����r���
�V���q������3���V�a������k,M�133��6�����b�8��������w=[n���f�x�(+�W��!�A�J����
�X��@�P�E������&y�&�g5	�\��<����`'�^�5�v��������s���/���m�?�e����cOg�`"��H����w�~|	��j�bG\Y���
��+��`�g�}��-2�d����m������B.@q���3�����d�U�������
��M��-�b��L���`�\gZbG�D�E����Q��n�e[zr�mw1=���g�(wj{F���
!�_�gt�3�2����xW��c���cjdB&�o������3V�^F�o�|��kN��g�U�od���`�q�],E
f�ve���9�&�g������2],Qq3GT2\e��2h�R���>�R��������*���s		R:�5$���T�M��0/�?��7S+t
v��J1UW�P]Y��oI����h'�U�#1] �uZ�!��R6-����AU ^Y�<
��VV�n�������a���=�A��>.�q2�+	����J/��fF�?d�������
��%z�T	��m�D�������Nn�����v6u-?�����x%"X�o�P����~�tsc$�J��K�j�����S:K	���������-a`��R7����e�+�s�a-�T��6�5�I_�+*����za�����4��R8TL������q�C�\^��R�Y����t<�
��2o#h�����0_��i��m�{�'N� T��Q&P�1�n��$�ap�K��7N�_�V�F�Q�����g
,�V�6�����e|��x]����>��k;PG7�����M��q�g����<5rwW���7���������ebUa4�A�alw>}*��B:�}�#I@��C�=�7�	�\%����1%�f�u�l��!0��M1m�V��h��?O��� ��p�.�9��LFE��a;����vY���FqF�����cs���5����`$o�q��X�@��s�3���Y�������('���� ��n?o�H�C�8�����j����������
��l���C�
�'��fK��?����0D���a~z*7�i1,�&L=�"wC�,T���6�(b`�
n&�M�
.��N��b��0����M+T�r]c�'���Q����<|��fh��ykQg)�<��������pB��%gt!���$������2����T�VO�Qd��3�y�&rS�E4Re�J��'����a�3��u��#{"S7[�A���hU�Z�HN�@���]z�U
�$��-�}������2�!b%��m{T�yr��H5k��!yE�Z#	����*�~�/��BpbV�K=3*��@TgW1�*�T��u�th���kXbE��������tx�E�Em�d�$P����D��];�Ipf��s��sW��7�x�BYUe*�$>�:���
�S�(b���{�'�!YE�hl��������������D��%8���Za����T<`�109�L�M�����L�
���d�����*PT�FQ;��f�
w��p�6�i�9�#S�{ wr�O�D�;�������x�V��:#��M�"L�g�>oG<��I"���t��l���nvQ����0��|f@<$TA������v�t���������S�d�^u��l����`���`���
��bg�D��>Vn�����=N��k[V����V�3�pG����$��J�����������L:�MLP�Ki�i�a+UOe��o�,+>�
��m]��6�v3eI0|�b�*Yti��"���4{���%�e��>�p��c��n\K��h�I�������0���R
H�9��u��&
��Y��c|��/)j�l�"���qq"11*�4�l/�GV�P�A���g%������(�v�I ��[��Rj��W h�'j�^z��e)�lk�f�����zQ���y+!#��n��������ZgP:�Ix���u��M$�ZZm�WY���K6���O!�����<'��N,�yo���ot���I�n��k�3�&�:V�	:���O�K�
a�����y�������O7/��p�z�����A����8|�����o����n^������
��������8��{��
���Vj�82,|K3�Z�E�(h6���'�R�*���wL�!�E2�KH�j�R�rN���'�CZ�w_��l<8 a>����-���.}v^�~K�`ky�D����H����?K]M2!�
Uh{�M�����[���_�M�������&���������]�������&�>A��4�#� ���n��.�_���
8^��|�O�i�����d���;<OU�#����=gJu��o�(�{b	�]5' nK���FAf5])34�}��R��,�u"�C��!�q������Q���t��&A`glb�*�O�Y ����:������P*�����1$`�T��:"+�L&C$��*�����J����
,�Y �M���%����OET..�������7����>�1�f$�N	��T�4�������"��4\����������I�^�]���%�#�Xd��-�O���k�)to ��	���kU�V�j"k��XU����$������F�= ��P�E������r47�	Kc�������8��Gx�������CU�����#���J�*�[�z�����^����l���O��qc4�0Q��	Ed@e\��^8+����=zJ����4Nm�W*w�����n"eH�.���?l��V���'<���8�.�dP��(�m�3�����K!�����r�[S���'p)(\nib�S+��y�����k��F���8����ND)��j,��9���p�,��vv����Lt n�nR�B�1�����*�ZX<�r���J"6�(,e�HL��Ds"j�|��o!�T7�9����z�2���|��L���*S���/�����?7md����F6���R�p�B���qr�G�l��.���d���~�c?%'��6ssX����o�����/��N�i�E{ �*���o�t��&}�]2��
��B��E�/&��R�I�N��z<FA���Z��a>rs��I_�To.�%n�L�3|~|1+� ���A�PZ~)z��g�Jk�l��Mg��������PW�a���i)���[U��-�\�.��nG�rd]�*���Z�W�y
 ��Y���3�p�@����+G?�r
��	�=f�K�j��s
X%�U��'��o^��!5��4E�K?xG-��5��(�!.,���EeZ����F���M�"��tfd�by
�ng����s!e��Ho����bp�$�`�
k�tf�1���[����B��-xg�f��,�Vd��R\ ,!�{gQ���F$R���R4v��=���I�K��a.�4��v�N��%Tng)b��P��y�L���!f���M2t%��VA��.��\��1N�
�Lf8�,��T�������}s*�	?�>�H8�����!�T��i�-
&��>�"����F����Fd"�N�qjH�/���4YG��
 )�8J����5�3<@j�M��,�O���Z��t[�en��i9���$�uV2������ ���Eh������Z+,�Q�b]�!�[�w4 ��SVeZ���S�V#5]e�1O3s�P6�.$d�����B�������Nh��,��r����~�ZK�oS���:���%���;������{�i����LF ���2Y���EM�,)�<A\gW�0���/^�f����I�����������hrdI�f�������IX�Q�C'����l����}���=��. ��<����_�p��'s~A���6c�����&������v�9�?qDK���vExow��C�K������?��_��j�����2@@��\O�!��p��A�
��%GB0ns�;��"i�QQK�+��1���:�JWyp
^MoX1�g2��	������tk�w1��e�S��Ir�J��ozg=�/����h�qM�K�\���0�K�D�)�=a/�:���~vy��r�m�d�,W+���z�Y�~�NP�
�+�d��dJGE�GzP#�J��q[7k=P��Umxp1I�&���P m��"��F�������2'{Ok6�[��l2�o���*�,P�F
���O�k���ZJ�r�l�g$Z��G��(��j�w����yB�l����������Y���`w�?��{�H	Y�@�Oh�~���o���(>���x�NQ�I�R�H4����P]D��p� $,M_
���$���U:H
��hN������?�z3Ro~2�d,�����V�#��gg�iDZ��R��S0��r$�YPiZYB}��W�)t����%��
1c`���I�*Wu{"y�	���E
M��w��������W�E�L���}T:d�����=62����[v]y�kH������/��8�@�a�Uy=yZZ��u3!��0���t��O���("��CvvH��?
����/��
;���0����[�����C �"*��q��]	���^��`����bJ����"<�P�l����eD��P�����FE>��H3t�n�8�d^�.Iu��-,�1�8,�m������@Y�9�����9�]����9+�0rlX�9I��r.Q*�e|��3h���Iv���� ����;���|?37#G�_���-���)-�AA�({q����D�E���P��>����V[�Z1����l	��-�����O����[<Q�t`���I���=_':�3Zg��en�����,��W3ejU��N���~��sTAL���3Y����g���d��@$�(�����t�Hg|����r��(a�F�2-�FhL�pA���_f2��jD�!���\@��r.���7�c��3"i��������Q\��y�6�{�H��	�C>���$�<�������'H�d
i:F����hV-�S�t�P������B��'|��]��r|�x��@�Ac&�	L���T�V~�qy�V��/i&-*c/sQ&(��~������R��"'�������</�=*��
����,�����,��������6u�������%9��e�`������d9\-0h�,�OC�pS�0�fEe�"��
�b�;�V��cN�;l�5_����:P���G��?�op�?1~z�E�e��,;�j8Uz�����0����&��E[�!�@?+�8������,�x����k�{������]��5N�i��`S�?r��B���m����/���SF#����EK�����|t�K�-D+�
��/�PuQz���v#4��n� ]1,G��3��8�&�ag{���.}P���k���u���h0~bOl��_������wjxz2��� M�'$w��A����Jj�C���
�,��W$����M�`��y��������&5d"xc9-`�d�����M�n :��"���<�=������|Q8�O�~_����[$X^�L3�&:/�\yv���Y��E%���{�+��O��mT�D ���	����������U��
y��/g'��{�!�5�����3�����������-x|u6���3�������X��D���Q����w1@)�1�3���QO�P���%o{.n�U6�)i�x� i�x�����6lR��U�]��D�1�T��`�pA��yC�W]���s)��B���4gx�����n�j%<����[U��P��� *UDQ}�e�u��f��[���[S<�����B�A=t�;Y�SY�}�\d9�������T����!)6������&l���m��Zr&��1�> ���y��F�o�j0��Z�7�/N�z}�5
���=������M
�)"�N����/���d�Y������
p���XoD�z-���C��#�T�DO�E+-��%	
�]�$�_���^��i�-����q"#�\��.p}�<M��..�z�YxXY��CS�!
-z#�?�"i�'�����}L��q�|��7�-��
��S��1��ul����*�j����c��}5����@Sn�Y�H�zQx�z�:�BzR&����5�)�#���')e5:9;��a#��y������X�8�[|�,Y�v)�Y;u�ZN*��R^���������4n5]e+��v�H�3�v���N��:�2F5d4.+������s
x{����5�4=�}oA�����~�,����^;F\�[��h���+����t^����+��emD���2A���}�j5������Ge��D~�:e����xe�G�>��Q�(%���-�?�a
��nb-"J��)P_�I�[�	������CK9T���w��������?�TW���ZX�?����I��C������A�[��� ��SU�Ovv?�4dV���7z������}��b�+���W��Z
�O��^�q<""J�@���x����|>_�A���!�Q�JWKur���rQW��.�B���.���z9����Q�+��^!�Hv3��h=��h��T-����Iftg��T��x��D�G�h�oV�L��2��\Se����5�Ao�+��&q�z�9/ ���C7�5��<b08:|���G]o~b��b��#y�m�"�������tAM�JcHX_q���1���
���
D����L�+�>�7��pO���.�����a��� �P�|�f����d`�Z���?@6->l#�7/�7��_<�:�����ai-�*_V�������A�R~�Su+��=�r�ohl����������Q�W���U���v(�[o|�q�R`�t]���D�8�
���e9jX�����"���m����;AL���7�f�&�'M(v��6��1��������NeFJ�D(��bc1����4���,�+��5p�}��l�:G�.p&]�.�9����������6��s,
Pvg���t�w��zI���;`��o��x*�����O���@��8�b���Q �pY:~�y��G�A�U)B������u���%]����qO���1��'r*__\�>oN���t��J~��R�V���`@���>�I
�#. '�L��l4k]����s��(�Rk!)�=�`hR��9I�����RP5I�;lj����*D���8�!�,�C}���Jv]����eR���s���!����1�m�Q��vK������0s4q�>�+��M����#[���I�i��.EM���R���9����-@����KG��������v�������Tg8K��1j>���V��	��)��n�
(?����0N�����G����x}�+lb��c=� ���m��al���C<��S2f1)��*�SO�h=�c�J�R����U������C��L�>y�h�N�zd�
�@��<�;�k)qG�j����2TP���&��nf,-�L2���m�x��RA2��- l2�B"/QF�nc4��iy3ED}�l�`���2�$���L;���N��;�Av�C��<
�M��x�����W�+D�O��aP�	����4��������w���Lw|�m������n�6��o�z�"�6C��-�s�\�k��N��K��==)bb�)�+��s�|�����R�P�q������������M8:uH�	p��a�j-:���:�N�������8�|�Q@�B������IaK�%����C���t���9.4zRJ�5��0B�E�M�*�j��������;�dh��Yl�d����a���
v����S)L��3�����`m��kt,?�dK�Zlu�����7��1���0���{{����N�@��.��M;���c"����
|d}X\�?�t�k:��'t�L�GL��	��N"�2K�'#^O^�7%��1m�tkb|-?~y��4���
A�=����@��������"T�b���g����J�����^`G���*���B�"@��j�h�������H�#Cu$�&��4`fC&�������Z���"������?��Uv7j�K/WfsW���q�%�^c��2��aG���BC��y��
�5���T�jT�xx���������7�����^}���(8�~1��������}E�U�;�-:%o����]Z-A�XF'��y��=���������bsQ����������p��'�������D~I�c��)q�V��G��k���
�%��zW�&��>t"�~�2���(���V���kzl�J�
/����c%7�oq�F;�}8���uS(0�({(5��u��\P4�+F4s�x�L�L�
�<��3Uk�*;y�l�,W�F���k-C#���������&�'v?��`�<��������� ������V�b�a�;>�e0p��l�o������D�E7/������ ��8)�������Ws����a�������#������y��b�!I�pHz�!%y�����`�����I�F��`�k�%*����Q�E5��3��l���I*/:j�����:�=O	�U��TT�q��}�B�M�GO��sr��-�X�I��E86��eC��K��V����x��MJ���i��o1��0��/R��YX���*�s�\	����u�������!�"-�{�wt� \�H�A��y��!j'<%�H
��"��-m��4�G4~�~������L6pM��g���V���2I��	9�
�����~,���O�7jp�z�5Vrj�������R2(�L>e������a��26sm�������X0�g���m�Q���cz=��o����"����x"�LrfX�x�@�l�K,[>e��$*2\�y7�p����2-�h��e��2���P;]�{qHZ�o����M��C7N����g'/���[S��������G������Yll;�,s#�[1�~��>#����^ph��f�LG��n����r�FBY��5#�(����r;'~��%�����������@����w��������fd]ZV7��lf�^����o6���.�g����v�<"��g"�42����|	A-H�����j���c��}�����P����m��^5�����[�h(|��	{+���������������-o�t�x<�j�F���*[��mS��d���e��M���r�c���P@�b�L
)Yq!����g4�~��)�h3���V��(�������}�S����;L���gS���L��X��"�f(�x��\�1�#����(�F6�:[�
�R���B�E������rZ�l���(i���'����2�����IHO:t�C7��K��	�[���:�4�$0���h�)o�c�6t���	@��A��b�N�'�a����
���(����q7
��-�$	���'�0���K�Z�X�I �	<��Jp�0�Hpa�� ����]���
�#���-���
��U�v�}���R+I��,KaQ�#7	�Hz�W@�
b�
B��0]
3Y
�S0��������>F:��},h����U�_�����b�]82�z)r]c�5������W�/�rP�}v�Bt^k�=g���t�����`���K���A�<��z}��F����U�WN��$�������������U��CC�����N����Tx���i���
���K�����C���:4.��2�J�Y����S���G=�uDl��H�Teo�dk�/u�?��O�d�'yK	�eL���Nr
|���AFQ����?�Ev�<�#���A�CtBp�<]�����w���!������Eg�,�erH���4�*���QRI��s�]LB�{X�S->J�I��7���q�C����~\����@*���wU	Q���
b��RpG�;��?�Q2�
��`�3�2zR8b'
����!=��KS�H�L��z���
f���PS�C������vf��7+1ML�z�b��/�~6t���Nm��B�f�3B���!�,e3el.dk^�R�6��+�)�^Sz���ra�J9�)��o���c���<��Fy�u;�MA�����@N��*�~8T���+RF7����O��M~����������A?�N�2EM3:��s�"�G��"V9E'`�f}9��8v�p�>Q�l��nW�*[{`��cX��������,[�D_�pCLn���H���"��tm�lzTYY���w���?�����������������@����Ka����M���P*�:�Hs�+�a��9!_
����H��[��u|kRX����o�4�d���Fu�����a���E�-����������S��v���5�����l;����PQ�&bC�A��["	�9�S���E"����K.y�b���Z�"��g������+P�]#�nK���Fu�� ��$l�>={v�9��t��}oXw�.
+7M+����re����,���\&����dFq���Nr�Tm��<kU���?*��~����$����T���R���K�� �G�T��x;hk��Tw=��O��O�-���,�h*�u��c��u��A�cNn�0�6�l�+�� >������#��*X��J�?�`F���*�/�������w�R�Il*�;������g_�������������7��a7�V�5}����������SK�bN{�����W���������/����(�A��n�V���(e_Ab>�S��T����l�_�� o�U5�E��*?��_�����sS������f�WKM��?F�����A������/����};�X�����o�u�Rq����wo��t>K��iG�X��m�A5V	H�4���@I�S;x�<<9|����Q}!��������"o?�(,
����2���:��5����y�g�;P
Cg�dY6g44���L��#���HH�Qy(q��h�!�_�;��}0e��������4�M
��~.~����>}��*<�0�DqAy�~�$��J���3��J]b[-��>6>��vT.�_rc5�w4��PZ|�*��Q�j_<
�9�g�����}60FS��t*K�����zB��m+3�(��B�M����n�c�u����A!�Oge�}/=i�dO��{>(����Srb��_��W���f�~�QE��<�����:�������]+����f1{sN���!�2�$� ����s�9O��$x�����}����J�7 �i�>!I���y��)��
�_���,�og��?K���`��|��������Tt�1�R:^���f�"��{q����;��e�N��o�7�H�������&�l����T��fx��I��_�q�X�[��i>���ai�����0�i������yM����	���v�L�0�oK�����9'�������+:�y�����:��Mcj����n�*k�����gxu�+w/�y�So��#����0[,��������z����P.*�H4N��}��3�Q�{bZ
L�
��5��9��y0S*���
���H2�����EJ��
�}����������q���e?����i�B{R�zm6O��j��7^_T">��i��3�oi���Q "xj��v�������.��aj2#����-�K��u�k��oC�j#�[98f/x^����c;q��c7���n��������[�>�q���:�hx;�&���������V�����m�5�����������w4�_������i:�,�-�N/�[E�i���q��	�����������Y��J�i�R�wp7�b��!=��o�b����z�����������$���������p����>$
F��e�=�0�0��^��b<�oS5��t�w0����$��-�j)7�q;c�q�0u#���0��a�����h���������6Wb��Rb����l�mP�_��_�6z�B
�y��\�R5[����8�"�P�0��B*|��$"n_HaqB��Y�]:���������CmF;�ja;��s &.D���d�a�r�-�U���nO�U���
�A�{a_�G�n(r����l ~=da� 'C�!��In�.��q������`3c����EB�
'����8���oR$�����p@�1��C)������a9��MQ�Y��*�I����w�t��.�$�n�7����}'��]�~��M�`��p'�������������j��m���8��{IS������������j��7��^��8����^���7��n�<���q����-��-$�?7����F�m�����yM�Y�9T��7�Y�w�m�E����?�����$����v=��z ��6v`�^n0�@��zB!��Z���-�������^�R�`��#l�������������2�]���Y�T�h+e��B�w��T"<��}���)0p�D��y����7/�;_M��y���g�����p������
���R<��g3�����4�|[��4���B��a����!��,�i&p+�|#E\�P��<_��n�=~�l����)2E�;R�k�������
Ek N�=}��c�z�A=�-I=MS�>�����'��??�=~���g�����L�t��4�t�hZ�X{��	���~v�,��Z��[�~b��E�e:��bEg��#"���!����6��y���.OA�S�hN�I�4������&8���KQ�'�Y��� 9�S��m����/&b�����=lS�-e�C}�p0V~������19x�&~�@JI)z��8:�y���2�<3��y�1|^Q�e4�s��)���b��7pQ��:>�t�j�#��/��^���(�(�tP��uY^���%���]�sLaAMe�������~~,�4����L�I�����B��d
NK���}X���WW�R���
����o�_L������!��\$O�Q���sL��*=���������70�����9��[� �p8�W�*uW>��?�~�'�����������>�,'����3��q���v����)]Q�\���`��Lh�j������_���d�N�V�Rv�a1�nC�����?���$^A#�3�D��J\���
�o�=�e��L/��!>��v[�	����+���%�,`]��p�������Z���:y��$���#����0K���1����"��p���Rbu�����6��Hl�|��Y���pH�	O3Y�Z@��n����k�y�Q
�n;�����z�C�7e��/25�2������f]R��&25"}95f8��RN��[j���0���Eg+����5��[��������A���'�P�e�7�>�.�t������_@���_�����i
�+��H�#��)A�j,V/�x��G�����gol�l�@,�/��{&ov?��7���'�����J�����S|�o8C]����E�g�h��z��0/����v�FAx������q�NM�Xga�;5-/IW�%|����_��*O�+��F���q9�f�T��Q�����t2�yL �1h(?}������W���C
l����]��d1�"�Q�Y����n�Z����K��iZW{�tF���UM�
�����g��l�p������C�z,�==�
�"�TM�k7�������N���O��t�.��.�:�Rv�����"gR\�!�����N�`��?'��!X���<�~��x�������"8Oi�E����s�`T`�u�?������{����gEqh{���(�`2���� +�1)��{��b����.Ali����sW)��89��0^�0B��2�HI��T���e�_��9��(���`T���af6{y>��I��D�^R�
��?[����v7�����w�l���)0K�N5��PCk.d���"��_��?��BW��~]�����m����X��r�n����*-G��Y�\��j�7P�[n9��T��w(���t8#����L�c���`���J5������/MI������e�H�Z����6����~AZ��V:R�vhRL�
��`���v����x�|�� ��~�isst��t�M��{��d��%�Y��m����o�*BG�o�H��GT�,����;x}��f�_����x�q4�
\3��9�.�i.Z��@�H�G�����ZK%���O��V��^��s��@H12P��N�e���IR&�s@��f���.������$�z���]_��V�z����}��-�����h��^=`�B�����R6�f5JGv����_��@~T�W}���E;�.��,-A,�GM�:��l8�(�Y;O����w8�O�L���?������><����N��'v[���������%]�h�o]X�m��b��O�����~lK��e����gS����U��[��r�%vF�4�F�d8���j�W�O��k8����FW���0k�q�����V����{����9X
����� ������������{��w�u�Wh��Y�
Lm4�rJ(8�P!�73�	p���|b���������,S����y�q2������(/3J�M�%n�xi��(����IGM�o�|}���}��j����|�;�����4�c�Mt�%�K#(T�KhK������%����������ws���4.����[��^d
��"�DC/�d�Gd��%3?�xunZ�gUy�3���r�5�A��A�6�t���|�rsn:��n��JX���<	��h
�Q?��U�(fi�y��:?�\�lN`K���\�Na��SuQT�.a;[�����\p&,������;��1��x���9�k�g"��<���F�<���-j��b�>xV���:L�$���B[D~9d�o~	�%k�R�j�h�^@Q��	����8��\�G0�i���y/��@�B�����?F�@G�����l�	���V9��d�#L(��B��'�0!QhiG��K�����D\���%��d����e�������8������!>�w��(��7�w��a����r�	���?�|��|�>sk���O��rH�:>��'��R	U�QKB���\>i��qE�#v�~`���H��(�1����}��V�b�
��M����f�����%[�2e�C��������f����i��������0�+���%���X��iZ����LS���gf��{p����MO��i*XZ�F���������������`n:�n���^.��d���"����.Y�W^��V wk#0�nS���VJ�2@�L�dH��yLw���gK��UG��>+��Jv���=�	��P�|{t(��x�#����:�i�b�[���	������+V��g����]�,�4��Z�����?Xu��3�13O`#t��&���5���&�F
��J>�XU��r|S3���l6��0��EBk�i	*�g+1�(LG��h:5(��X��������g�^
�2P(�����%$|�g��$3��w:�L����^�|Z������47#e	�@a��2�y�n~���h)���	
�rf�h�q�j���[O`�(T���$��V~�0�K����$���������n[ek�R��n_Ut:w��[yv?.9f���{&g��f������T4�YhG�N�4�*���R�CPj>"]���*:N��4�aL������W���w'���73���3��yN���QT���%(>��d��H�
���l��)>������#b����'�k9���&%m������;�qaZGc��3��*���Z��C+EW���Q��R�u�R� ��t8����|<���Oh� 1����:9@��~�f�����> ��<���y�QhMK	_����q��5<�l6�f�	���F<K�/:Nn"��{�;���6�vX�qHW����X��F?�G5��H��[��
v}?�I���V����!^�(��������#�I���0��8�>�w����[�}P�&IQ@1I��E������l>���T�w��������������7���
����g�^l+6�
���6>�2��b�	`�x�(zp�~_`��nI�8e���c��@��� YV0��-rk�m#����&�o�|����)�F��$:�hK5��y�p�$���
�[P��F��IUd�����~<#V��5���$��[�i�@�,lKH���m�[=�T��q:�8����:i=k
)�:S��l������P�ux�z��H��x7���U���eI>+ PD�	H:��t��:��-�
��UE?��!	G�[
n��a
��&UX��P�+Y�N��:�4��a@4���	����7r4;�@r�6vm��}�eo��U?O�cMc�h@4,�g!�0���~c��hK�������)�8���������v����14O��i	&��B����������x����,@���!�H����~���z��h\�}K�0�~>���c����$m��M/]C
.�4P�zk9�U�N(�f`���c��9����)�:G����G���T�w���o��n�T����>m�G������@�F��FZ
��
������!0�J:�}H�Y12Hb���P�-�ZtH4��m��@f	���+�8g;x��jct�`�z���K�Z(��L�e�d���^��2�p
/j�1�W�_�)�^d{i!P�m,o-oT�,,���$����g^���FQ=��6�pZFE���UsN)[�����1�Vh��B�������v�,�^��e���#\�����t��1���#3�c�p&�m�C��Lm�<��E
�o��>N�'���!Z�E"
i#��I1eE�9�'�����%::M���kg����$��[z��;
�����V�O<���������k�n��W�I�[����7��b%o�ry,9����D���7��2,	_E`��
��������q12s�c-����)z8�v��"��@�\&g9�Zb�� 5��qV�~���[�P� ���<�� ��������2�R��c#�����h'�c#�������35r
����V�V;�&����%7[�	�.�lD�u��������n?����h�5M�o�*�s���@��YReq���<���%�>�w�~��}�;*��0�!�L�����-*-���M��Y2�s���z�:(
����h>a��HM,N�S��<�;*ZGh*5��XD�Kt[�6t&���"9�p\g�N�W��u A���/UB�c�i(�>}w�^"��\�A���9����NN�g}w��Je���.��;S ��5�������FjX�?KA��������L�_�.6�a|Z�u1���a�_��������g�A�n�)ac���v��c��w f��Q�����T�^�C���������0��]}J��`s�����g��j�qG����&�|A�@����� =g���K0�v�%�s#�d>��&O���T���qT���M	���1�������vN�`��f	�xjr
�%�j����w������).�d�k�@���6)��d�^��98��{���vvU��p��K�)����<A����B"N&�8aAHf�4U7�Z���8w����z���|����CCW�~��GIw�T��g��nMsV��'I�y�<D��,%��,)�O���JIi�'������$����o[C�L�-L	���W���VI��Z�jz�N��n��e����a��j��)�Z���_����Z�TO���]U
!V�6^�����H%�?�v��v
�E�K}��^h� ��^���������r������D��z�uE�[o3?�9��K=4TD�1Ys��z$rp��
���:C������������:&V�Zb%����.��E^��<�����8�+���W�A*��Z�����6�	J��U.��m��Sq����w�<���/T�0)4���-���8=+���R�p���@h���=zP)v�� 7][q%����+r%a��sx�r���N���m~�~�>@
�����K�q��_I2�J�F��A�fWM�y�j;Om��89��w����{�<�a�e�s��3n0N����A}�����05[���A��5c��Z�g�'��Pj'���(/Ku�� �oP����-�vk�z?�9T�K�&H�:�C�-�jA:-�E�@���A����!9v�l^L�����V���r\Vg)z5�k��7��-y��AQ�'s#�7�aI8���q�"���5:TZH�]�����x����m�~�S��_[F�%�C"�@r�a�j������y2&
���Ba/�7 �/�����2RV���{���\<l���":~F����#���3��]����M���K��2�$�.0V����dsL��c��M��D�����f�B������`�[������Rf���S�C����b��������CN�C�\h�U���G=MVg���"��
5K�8��;`g�d�2�J7�������"��zJD��{X�:L1��9���T�i��m�;QKK{#����k��x� �Ql�-d4��0�Nu0��p���O��{MfK1��K��'XW�J�wa��k�v�<�
��1�~��Z�AZ�O����C�L�3u��J.:xG���xW
W|;&����d��|w&6Vk�� �w7r��q��Pa��7q���'��j����,1���
��9�~�'a�z
!xN�v{����DfV]q��Y���c�4�n��J4��g�|:/�9�-�t�T�M��h�(��l'��������$��I%���ZT��
�������0,�x�����`]�*R�� )�Dw��������8G�	M��{VK�k�i)3k���37Z� q'b�2�����{:�aA�.w�#{^�.b5o7�c��Ep:T{^��F:����z#�J��������/���:y9"iQ�56�)�{3�����]�A8N����;���������c�C";Trl�����%�>��>�uOt������/07�m�v�&x~i���P,k�>A'7�� �����C����C������ff���(=G��$���������I�3�QxS�����\,C���	F�n�)��+b����A�o'������l���
����_m���)���� :��T��1����J�����\r
N�����|���&��T{�(�[]��l�-e:����n����Rf����������Q�%��5�����S�����'svQ�B�nwa��<������e;��s}�z��\��w��'���A!y�[�f�����`u�SU���m�O)U��s��E��R�'p^�+��:���Lz�|&�wo��+��h�]�j���"�VM�B���
��J��Z�$��?��)U�L���;�'����������17ya]��VW6�,�9`D�
9����������Ny�p7��E�W_�?�5�����Bg&t>{��N��(t%U���\#�������p����/Gl�+\nn��@x�
�6Y,���G��Q.�b�35�D(��;�xS����:���4���N���T�*���r��[������*��?$�1H�%JD�:�������_��s�T�p������;��v�}���	9��P�T�2������"
^:U���D]�C����c
)+zl>+3��%m;��������Hn�=&n6,?i(��Q���_�O�8�@\�����bwi� � -����������j�=����A;$��N����>
��;8po���A��G����������^�����;�����[jG�.��
r�V���vD�������q�0}�xo�������O���������VP������9*��^�<�3�|��U��s�����
�����t���	.�tX2EB���7
=>=���=��B�����>��l��$��F����	we��yNgw��;��a����3���������v��/��{D2��ma���&����2��Rs��g;|M����IB��R$����,��<��,+?M�W��96�����
�
y���8��?��� �������5wy�����+�`8������-yvV��}�~��N�����������1����+����[f]��G7XE����%Y��,������5]�j ���?���U
w%�'�49����6�q���g�hB:�[��~���v��n���N��G����r
%�<�����w_�[<���O4�X:��b�v��\1�t4�g0:��7���)A������{��6�p��F�����#�P��������Z��wM*PPJ�����T_���o������>�l
�t��;5�/���[��.�E��x���o���w��s�O}$�����L��{~��=��u/
�PC�����x�vu=7oQ����9zA�8�&�~]k�|\�J$50O	���B������O�[h�V����=��Yzb���W��hD����.��Ym\��Qb���%.�w������������}�NZ�U��F���
��`}�~
�Z<}���P`�M��p�������"�����h��#o����C<�r#�^�^�#T*��6,x�$�>W�����n`����S����;�����R������NJ��gSw�4�M��<�����}��`G����hY��L�^���M8�|����QKt>��
�G�'*P�Dz��i���I����r���j�{8�����>S7�q^���Y�5o�==��f��(�;��Z�o�BV����y��w=��*w�����q3�u�^��Kz�������Xo���u���$
��{�1��.$,�/�%�R����,�6'���\�v����
�,�83���<�Y�w����@n�'���#�����8Ok5���^�����k�EkQ^�y����M�`�W��O�9��1w�CJ�h���DzJ!��/b����9M�u��v���E(����T�{9x8��+������#��051n-y(�RWaPu�OW��6j^HNF��x��$�
�P@6uQ�����?��e��!j3%���"wvD��U?m!���)V�������[����^D�8%���|�89��
�7�C��(�O��e�(����m��J\���e��O��G����uNBA.?j����W���L��w��G���ja��
�#�(��m�g����������#�X�x�����T���"��&a��(�ja��1�B�V�Mz�p/"�U.�g�;�{
O�~qAKo�����o5q��y���S�ma���d��	����_@L��Fw}�&����5���UV�'i�@�Qt�~����{:$T�Z����
�p����B��D��	m�?��M�������U���JE�����]W�.
;�W����+G�,F���L�
�����$�������R���H�%��Q,�%���m���u���G���
�|G��E
nQIF�������e2�Hf�wI�����MOUd�y����Z"
���gB�f���l��O�6�NV�CJO���1M�v�%b�g��*
S��o�\�Q��[*C��x��}^u���n�fo�5�7T�+���dA��n��F��Un�}*�0��"���/%H���EvIp$����)��E��H�}���9]/�h����d���.�t0�#�\(��W�*A�[��9���r�=��a.}�F�un&p�?j�9b��<a����g�n�	�gc������1�1h��H��a�A��.o]�~���]��>1HV�!�N����@g���2�7������������[���R�`}�x��rt���'R������9���k������<y��|�k��5�����=�X������M�RV�hk����q������`����M?�^m>�X@�W#T��N�~:�Q�y���%����Ua��d��&l�>+!1����:F����_�[��e�l���W��N�W:���,����%"�?�h�/���K j�	���*V�c
�%�����7>�q=q�>D��3�[
$Ah�t����X����>�Zi7QH� �l�>%
����<�t����bZ�P!��-�< �'�P-��RR`�S�\GOh�<��(�Z+4��E�����r�E�'�lM�+�hS��X|w���z7~A�lH'�_��7��W�>������5	�X�u`W�WH�9v~RL����#n�!���e)�����9�O?,�N���������&d0���IV����i2�lc�5������K
W�>'���@�N2|=����tr�
!.�0f�vS�]��M��|17'�n�Zh�kU�mg�0�>�qA������R"��Od Q������7\���0���:��1���
@��]�b�>����E�.�(���J5���/,)����y�����C���r%�e��j*�4�W.�q�B��e5Lj���Lc�|�D�
��i�G�<K^a��J{,C�����JI���<��!yX�A�X[�NwdUo3nU�LD�F�&XL^�v9)
��y�WC���Q�pS�H������o���z�/�K�}XZ"U'�bC���2|O�H0�>&8z��������D���i�����MjT���k��W=��B�V���n�9u��\�{�����m�j�c�f_InOwf�qR�Xg���� !�����$(�D��['�����C���d�>)���=Y*y��&���f��x��(���S*p"g���!������E�|�va��;��e��;�����\���v1`S��&�f��oj���BVi
GA�8�b�.U=M��a�B�fK<����������[�R�
���g��t�E�a���2��o�4��.�4���y�I��*��
����bV�I%�)�7_��#u���+���
p�����Uz������nBG��6�j$l���������I�X��8v>����4=kE��w������\}Q��g�.�Z�����x
@���8H^B�B]I�kG���.
o$O[�D���S&5GA{}��}(\�}����i]�a����V����p��X+����,a����~��N������1=������,����
E�y}j+#03����+�R��*(c�xs0D�%�e�����*Z���WQ#�S��������EF��
*�b���	�v=?��9�G���MF�L\(VK�_b��N�����[�-�b|�I?gt�����u�!:h�=HOn�p`I����[x1��?p�=�o����c����MY�3W�7�Zp�HE�iw^&��oE%f%��[F5�v��*��K
BdV$p���MI�"V����T���&�S���N�Y�uCh�
K�U-%��O���3x:�����}����d�n|�� �,n+������4$����p��\�%�'>���kJ�����|Z���4��?�����o���t".�=�U`Sh�/:>�ZJ�%��SJM�L.fuAE��{��X�����.����{�w��#$�P#�l*�7c��h�?��eu��F ��� d=���c~I����	$Z�=V���.(�#�A:T1���} ��lM��Ui�n�����+��\�pCM��[��oq���|%��{�	
e|Y�u�OR����s�<s�B�U�+4������l�~G��"���Z����u�y�;�����_<���7O���%�-�'W�~K��!�
�(�4M���
�v��e����n���IU�b%Q���xt;zNYH@���P�11�U��+�h(���K��{���8�qj��]6�/�H��'����n>(�Q��#Vx�y���]M�kZ�������x'�O��f�n{���/�l�b��Z����������h��x-�)�zu��G:���r��4���kn�@�g��"EH����������I��0}��A���h�;��ts�������<�P����J����5���[n���-����Su�x�����>��E��U��j�CSdu�K3�v��u�J_��<<$�9���K�	6�/�����q�ob���vl����w�_<������o>M��&E����HX@0�p�����8����Vg���8St���H��m��Z�.�R#��dH��rm���/W�A����k����u�_���~T]�_����YI��(&��g/�
��� �����i ��Mh�Q{���=��"������!1v<&8lB[=�Z�?�
��� R�$"�)\��,���S�7��~�mX�G�M?{�Y���
��������������_���15�=���8���DY{����.������&�]�Fq�,���9:���t������������X�6>�y�2���|���X<����c��I�y(��l(���;�	v6��X��:+�a�#�
�/A�UE���L3���O�GY�����g'��f�.:���'��x�������[r]�8l�����1(����t�2�x�����eXH�H%s������J�pci�����<�W��6-�K��g��%�u�8;��"7n��OD��bF�e�u<����x�B�t'� �[b� �v���z��P��D�������e���V-���B;8jK)9��G�w	�I����k)�MJ *Z�#F%:H0:���g��f9�F+#	��$.��Bs�l#y�HA�(�t���[�l���4���Q:��T�����)�i�l5��L���f
4���Qrw���<�q��$���[�����7fS<�s�0��Z���)����B�?t��vd��;2Oo��y��4N�xa��
��9��x�a�����ut�C*/a�XCW����P��8��0,�HSd#��cs{�����l+aR���`����r�M�?7��D�A�I����MC�������I�^t�����������'���(J�BB�]F��tX�
Q�>�h�NN�L���K���*v���L
`�@zG��0����d��9A��
Sw��������Q�f�4-V��1�3��p1���P
��M
�[T���(�&�
�}�h�Q$ja���%������Z"�q��BpVc���-�Q�������>��4M]�Xa+������uB�K�t��G�yT�����0��F�d5K�u����6�d�[VKh�~������d��%6�N����� �W�l���z�*j,-��p���%�:C9�-��\�W��8E�T@u��ac�K��t��]�Kk�l�:43�����?�G�F�����E��"��z}������,�4#�u]E�h�.3=�r�I�pm�i_!��i���P���(��d��H�JJ���Y��������_�7�VH��M}�X{��+ 
���_j3��X
.��D��.�����C���*���\O�]�_F�/w��������
�L��{�	x�0��5��.��r��|R��`	,��8���z� �?��P�H���s]��rc&�C8a�-&����	+o3a��@
�^z~��[N����~���.�|�
O���9����U��7�|���X����L�<�@����<��D�����
1dzZ��Oe�`�_AM�y�Z(���+��@�~���V��C������W(��q�YY��_w$���� ��Y�H�U��
~��������9RH!�v,0���b�a������GnZ�3b���U�QF}~Z��N�l��;9�T�u�y��u�}����.�����Dk9_���Q�r=r���L\�Lu�9H��6��ou��&HI�y�LB0.�;��Mhm��� ���K��E���X/��k���?"����+��M�7��W�.�
����98r�W8�,V6A��b��$�sT�_�M|Jy�4�p�<:`�r���Z�/��������'8�}&�Y��p���x})�����U�����Y	�5�l	�DM���~�5b���S����e�N7�	��������3�*�i��$����y�w@��Q����$��L�i@�;�wq�20H8�S�c�P.�&3�PV��������>X��V_�;�+���Wg�Y����O��~������W���l����9�
�q�<&�)6�4�&��4����}*���6��7w�Mm$��JU������`A��,���������T���=KZeW�R�����zgW2��**iwfzzzfz�{z�wvv���HL�����
K2 dG��p�Ix�#����+t0���z��s�����s�*��m(w�����~c'�,Z8��a#�2��8��y�3�FL�x_t@~�n�yh;=��s��s��u��s�E#��;�H��Z�l��1[_��XE����6���:���B��y(7;)���4�}LJ�����������I��c �6���-�����hi�$�O7/����i����S��������|ZMp ���64��� u�=���&�"}Q�
	@�ge`F	HsK���9�<=�KG%e�^���).����?#A�X����D�l�/�������f�?b���o��n5��w�9m��4���|����fJ��(z������G`S�����o���-����hX�xW9ft�
���Q�xxk#z8+��G�[�{*�)Pg@}�I����el�4��H&w��g�X���$����Vf3������P-��U&a{�}Pc�S�QP���
Gk����\���BF��Lq|���N���}�MA���ix,P�>����'�!x�N��8*Y�O�KmN�mH����n=SClx��
L��-��S<2j
Iz V6��Q�aq�]���XhI��-|T�d1����g�!-R8�d/$��0�~��N� �TA�?Sm�zp�i�W��l^��RjA�Le���ST����M�v�	
E�F��M���^�������
��}�o�����-��w����!q��4d���W�gj���#�k|��X���%�_�9w>�������O`1W3�� �B��/A�C�QSGj���R��?N��2��(�:
��;����l���9|#!A�����q��������!�W�s	V\%��������ZZ��_�cX�8��L��u����HG�S�@�E�<n6C�c����hx��M$p5����l����t�(g�|�FR�qp��������r�M`�f��`]�O�R3��l:�qm}�	�JJ�F�SB�SF=K�*�~%�pxv��a>�������.��r�#A�?%ww	�yH�EM2>�W���[8+�ZZ�kivFf��������)]��e����|d�f��14����3��1��g���E@"�:o���
Q���f��2j
t2�w�|�u�tN'd���"Yp� #'M�X�>��?���Ib-�<E������?7Y��0"�me<����H�������b������]�R����4�0|A�W����"?�e�]BGC�n�����(?�O��id�@� ��KO0\����A,@l��_N�@h��.>z!���`���<�b���i�&����Hk�N�Gb����<�n6��m���\]��%3������7�����t���MYu����'V���Y�L��~��\���(��{�s}��'��kd���u�wV0��`��1�����~�//_��OoF���nSO1��c<h�l����X��6�La���z�{�/{7\:(�$��8�����W��}��)Y��|{.������w�G���%<�����UXA��A�������
2���UR����
�����e#j����$�i���R�����>E���x������0O3u���yp"
N�����-�)�J�1=6"���-�[@��������!��c�))�v,���6]@k�'��K�Q�1�1�`����I�A7��wZ��W�=Y	�H�w�lh
���/
�I�7��K#7o4�Q�����g�9�r��
������n��J0^�i�E@�;
�g���&�����������z�m������!Rw���CiW�Hi�}(H��~WX�G�r����$G����N����A!ju������F����#xm�e�8�$�(ky��uzw�!1�c3b1���g�����)���X��Q�#��:�������I��r�n&x4p[#�g���D^_��	DAt�$C����EF����X��km����%t5	�OE������/�X\�w9���	��[7F)���p7�W�y��K��l/!O�����t�-����r��������h�����DH�B������=6�hX�j��z�
����mw��d�e`�uVm���A�����������&�Z|B
MIt���8��F����B�����'#jT������*��M!�4�Y��w���������,��3H�X-+�3b�e����O���>��d����.��R
s'!��_�a������aI�U9��p27���4���q��Kn��r��9}6f]��g��������b9������#@U�l�������)&��As�u�p*��vwM���z++n��6���$�����1u�4�����������cxs�s�G�$:���SV�*TH�-�!t�����6�"��('65P���l�=�����tQ�f%�X�PA!`2U��J{C��1fX����d���gG���*�N�7�sD�"tS���.ei��������pP�������1�l�0kes��Q��:g�$��5��M�Y��j�Z��&!��<��Z�d����>
M�J�����]�2����|����8}�����oZ ��#���$|�!���{��TJ��"����h9�� ����Fdfc���T;`q_����1j
���+�ax)z�"��u��J�Sy���d��TX.jz&3������ew��3�����)��ey�=&cV�#����FM��O��������!�� �����8���<�/
�_ ���Y��8`����&�%_$x�U
��8aYX�/��n	����Q�]
����{L����^�"��R�wG�lU���j�
��+������h#!�Dfm���n4k���������c������5v:{X�u�Y,�X���%m�8
 �=��a�d9&�/4SAi��WB1���,���lE.J�Uh��&����*���A��*j��6�3��X@7�\
uY`	
/�8n7�~�����%�P��R�~�����.��u��j��c~[[r�	O`���S�X`n��6�!��l4Z�S����zP���kx<�q���r���#�	?�F�������B��?@�eA	4�`�1&nW����L,�-f�� �r��Q����E^��UoA���o�c"W������/nV@(��pb��&��\!>��
)��	��������I��@,����3s�����))�6`^�3�����H�>k������fh"�$F$�W�����v����v�f���~m*3h���e����K6�:=�_��:��w�sm��P�1��ae�j!Z���)G�O&�o�����d8�?�$����/��A���[<�����2N~�:��a�_����}��I�S0�~�;h|�u$�/�`�����;>��Hm��By-_�OjscO]���n?W��Q��h\B��i�J`�� �?g�@u��Q[Cl��^@������*������������0nM N��G;���y��o����X�C@�R���e�q6����4- �:0� �-�lD��"Hw���,���"/��=�"�����R��h���hp�d�x���JqLGt��3]�=���y�#����v"����j ���xp�U��.vL9��jNaK��_|$��t�����v+#��QLnc�7���v� %y?��)��k(��?�;��M�)��:��dW��LT�= ��lX$L\O]!��a9��@�s�X��jD�WsR������MCp+���L���|��*te>���|�+��X��A��/������%F����=�_([����*9����Ss���$'��;G���������aLN�����������3�H�E��9���aHU���������4Q�Nm�E��w��9F�9!��&���|F��3Ul��^��yB5\'�.���,���<�,���.���s@��:���t���������L�h��~���I��� �����"w�A�����\�����\�B��u���,��zV���-X�PP&dS!�F�4��O�����Q�@�'��D��z��4�H�G{/V3��x���yc��HZ<fs�YN����A�'1$��� ��a>�R������>�a8Z.���t���������6���4�������`�S���$sv��Y���w�_�X���
�c#V�?����nn{�X���?�7?Al��U�u��-��M����Y�����*|7�)<)�t
f���\�F�@��1���
�8�[F������ ���zp8*���7���H�]wS�4��<_SO��Ve�!�^�Bs[�C�����b��9�t$)7`���+�g���>�L����>�|iT��[�\��"��t.���'`xg����
�/��F���7���UN�]�|��2IuLY��`eX��,�pb /�]!c#
,o��"O����m���	�la��� �������h�D�;��FA���@3Y�E����J�}!�@���\k�����U���[W�{���-��\�{�1��w��0�Qx�����rrC����f�RNy��/���k��$���b{�o�n��S�u��a�G��������T�����]��u�#2��v[!����a7�>���Yc�Fo�T�<��=���aeJ���_;8j*�������(��������I���-o���P�]�4�4|�\����-�4P�
��%������90��X_K��h�]���B���cW�iGBi�qq�)JI�rE��0���U��^�{ ����_��
��!�����xQ^
�de��@��
.e�D &��������{�D|�m�U���q5Kp,G4��y����36�n���EW)p�����|�����oR��!�4��k�������(6"&�M�R�P��H�i�(U�V�<��M���������Oz������c'
#14Gurjeet Singh
singh.gurjeet@gmail.com
In reply to: Bruce Momjian (#8)
1 attachment(s)
Re: [PATCHES] [HACKERS] [Fwd: Index Advisor]

It seems the size restriction has blocked my previous attempt. Please find
the first patch attached, and the second one will be in the next mail.

Best Regards,

--
gurjeet[.singh]@EnterpriseDB.com
singh.gurjeet@{ gmail | hotmail | yahoo }.com

On 1/13/07, Gurjeet Singh <singh.gurjeet@gmail.com> wrote:
On 1/9/07, Gurjeet Singh < singh.gurjeet@gmail.com> wrote:

Now that there's just one call to the Index Adviser (from planner()) we
can now move forward in making it a plugin.

Hi All,

Please find attached two patches:

1) pg_post_planner_plugin-REL8_2_STABLE-v1.patch.gz
2) pg_index_adviser-REL8_2_STABLE-v26.patch.gz

Patch 1 introduces the infrastructure to call plugins from the tail-end of
the planner() function. The planner looks for a list of PPPFunctions
(PostPlannerPluginFunctions) in a rendezvous variable, and then calls the
'driver' callback into the plugin. This patch also adds a new function in
explain.c that can be used to generate a string similar to the output of the
EXPLAIN command. It also adds a harmless DLLIMPORT to some global variables
that were needed by the Index Adviser Plugin.

Patch 2 is the plugin version of the Index Adviser and the advise tool. It
creates two folders in the contrib module: pg_index_adviser and
pg_advise_index. The pg_index_adviser folder contains the updated README.
Both the folders contain their respective updated sample_*.[sql|txt] files.

Theres one point that needs attention in the patch 1. The code enclosed in
GLOBAL_CAND_LIST is a hack, which I couldn't get rid of. In plancat.c we
have two options to estimate the number of pages that would be occupied by a
virtual index:

i) Make a call back into the plugin to get the estimation. The code enabled
by GLOBAL_CAND_LIST implements this.

ii) We can allow the plugin to update the pg_class.relpages entry for each
virtual index, and the planner will pickup the values from there. The code
disabled by GLOBAL_CAND_LIST implements this.

Option (ii) would be ideal but the core members can be a better judge of
this. Is there any other way of doing this?

Best regards,

--
gurjeet[.singh]@EnterpriseDB.com
singh.gurjeet@{ gmail | hotmail | yahoo }.com

Attachments:

pg_post_planner_plugin-REL8_2_STABLE-v1.patch.gzapplication/x-gzip; name=pg_post_planner_plugin-REL8_2_STABLE-v1.patch.gzDownload
#15Gurjeet Singh
singh.gurjeet@gmail.com
In reply to: Bruce Momjian (#8)
1 attachment(s)
Re: [PATCHES] [HACKERS] [Fwd: Index Advisor]

Hi Bruce,

I have not been able to send this file across since the last two days.
In the past I have been able to send 31KB attachments to patches, but I
donno why it's not getting through this time. I have tried different levels
of compression in different formats, and still it won't let the mail
through.

If it doesn't get through to the list even this time, can you please do
the needful and get it posted on the patches.

Best regards,

--
gurjeet[.singh]@EnterpriseDB.com
singh.gurjeet@{ gmail | hotmail | yahoo }.com

************************************************************

This is the second installment of the Index Adviser patch. It contains the
item number (2) mentioned below.

On 1/13/07, Gurjeet Singh < singh.gurjeet@gmail.com> wrote:

Hi All,

Please find attached two patches:

1) pg_post_planner_plugin-REL8_2_STABLE-v1.patch.gz
2) pg_index_adviser-REL8_2_STABLE-v26.patch.gz

--
gurjeet[.singh]@EnterpriseDB.com
singh.gurjeet@{ gmail | hotmail | yahoo }.com

Attachments:

pg_index_adviser-REL8_2_STABLE-v26.7zapplication/octet-stream; name=pg_index_adviser-REL8_2_STABLE-v26.7zDownload
7z��'���J�a���qI'�����:T�t19CP5w,���~��?�����2��;
����r5E�1�
��|Zh�6+K9�����(��'��KH����+����"Sz��	[����.�w"���������Sh�G�=����>���?��p2��#R�8��t����
���kqV�������2<������?�����s.���u��O(��@�%R+�������{@�:�%����_��S�i��jG�:�.&�������(�S���IQ�E����	���Ub>4����Y�:d��+����������4:���3�qv��m9'�+����8�����c�����"]=X�{����<5C*$������y���F���C �FcXF��J�X�h����d�E>�W���]�^�K�9��gtK��K�k>7����W���5g��p�+�=9~��������g^�M[������`������+���]$nY�a��#|.�\4
Y�`��3�O�}Y�T+�����'��fT� ���r�MNKx0�HW�z���V�>3f����"��^1W����!���]���<�_$aw�h��c�����u��[p��,2�6}�0P��g������Q��L�.`���n���0}P�.o��X���,�]�u����8��e�A�%�v�6�.\��,td�Gk����]n��i2�����1	���������$6?Q����0�D*��#� �$�?4��;
'�]���A�o�&�:]�:�������<�K�������=��z%w����<���v!�A��se��x�����\HC����C��yv����m4i��r�{KB�
��,�����y%}����z�VL�Q�6A�N��X����_�����e��`&��_-���I������a$C�6;N9;*=]�/X���t/����@
(;��|���^�>���5~���r �O( �0�
4�c��7J[aS
Z��Rd����y�s`t��%I���%�V"������2u��� ;���`�.����<�Oi����� ��c�}�U\�X�h�����W���e<��
��~��^��/����O��O|�s'�M�������!L*�R%W ������T�d��
m�#n�4��I��l�9���H���Ol���,IB*sj�����8����Z�Y���l�>p�k��o�x}<pdeE���(�&<)�����q��C���3�����.g.�
���Xy��"��N��t��b����������������@��8������KQ��G-�Lq��N��V�&pDx������TjJ�x�'����0M���
	4�8]!=PX���}f��%K R�Kl����fe;�S?	���D�	����8p����)B"Yt.�vy���rJq���t
m���l��l�d,O�F�eT��&[��ag+��:�6C����z����4"����'PX"�q>f'�k��c'�yy�FY���P ����o!�-�D����S��m���Qn�t9(5^��Qf7�9LS���>V������A���tb�w������W}��m�'����[�z7��O61���&���UEj����@o��~�h��q�K���	����@/	�-;�[D����{���2��93L�^�=&[7Y�V=!��U��^zt��8G#O��������VA�L����W�WX��	�-��#�v�&�������cE����hw�B��������_�G���U?��'�g�J4��Zs�f�o��>3\Be4��MI
���� B��j9�����s��������L��yDpg���;0+L��L�zY����fH���.�r�cp����#����G�^��w�
�Wj��'�D�X6�����������'=s}AtGT���GS��6���,�c�O������1i�a��u8��~Y'�B�!�C$�8�`N�C
�~�#�i�{*��t#���?��a7(m>��4uu����r�L�XU�$�J;w@��f�@�<��c|V�S�Q(����HD�����v�H{�U���������
������&
�k���/����n��Q��Dg�w53���Ls��TcV��
��a:0(�[�+b�,�
Q�t&���RA��m�V�Q�g�Og��R*N/�-l[��e]|�lg����-��j���:$���x*7`�_�����_�
������N@Rb�h{����J�)������H��il��'W�F��%t��g�`?+�!nG!�,e[j��K��x��`�	k�S�����-_q���l���vg��Q�  U
�L�Cdj�}�����'
��|�Z����LO���K�_o/����6{��R��d��/fc�P:i�RO���_�����k�Yel�n.�d�k�'��:�3.b�`��+?X�����N�K2:pB����8�o�}����*���f !:~���gLV��r_b0)vG+�?��(��V�B�G
P�%=�	~�z�[C������{���8����,:LC�U�q�$�����Rs���+���rY�X��)H+��?���mO�{7Z���}��u �e$��3�7<������p?)����j�|���N�v�����a����.�h�C�b�ueW�����������#<Ox�9���,�8�
xhvb�4��S:��h����#����%��H��-}KF�u[1F�g�k*o��U]��J�6S���������r�d=���t�
�Q�X h;�����4"u�F�JB���7p������s�{�Z������#��XI�X�����:�J�/'2ri�j)"C����g����Y�|�c	�2=���@8�����oA���6`��g����^#�W��'�+l�p��K��uVJ��p��)I�9#9R��t�7R�2���[�kOH="i�f���������I��hE������U+�Q��8:p���+akR`���'Vm/��������,��i�W��Xt1���Z�4�D������Y���p�8�0�I\e�_>\!I�o� �#5�5��$��@I�z�o,\E�Y}�M�UyS��L���/��H��C2
K������
�S�TIg>�:��t�����.��<R��(8ni�z����na��b�E�����X��&�*��a;7;��y_��������W>a�v@��#��-nH�������Als{����m��F�����?'��r��Dm�������4g^3�;B���9%��i��R�lf0/ge>��d�e�8���{�q�o��.�k�9U����dN?^�	;O�]�������P���}vE��:b�P\l�������hD��������AM�Zw��S�FZ�||)��>�8i�YH�	��dK5�M�o��T��������$���&�+ms�'`����7���o������Lr�wms�����d����[�����:�f����p&����f��n(P�~�������ucJ�1c(�6���Be������������:����e���t���v)��:mx�
��������X!#����5WG�F���v�DT�TQf|�"����g����W�t1�?�>�Ek��/�su�(����;�H������r�a��<^��'G��jc��� [���@�^AZ��Z?���MC�l����a�E���]�$�$�'H��U��10��$�����LJ��s���������U��kH�!
�k1��#Z:k����Yl�<)���Tg�K7O?����D��F7�c?v�F�Kh�?�����pq�3iq��4�%T'�U�(Cg�F�&Rz���5��;�~����XP������K��`q~
]��Cj��O>m��L����JI{2*I����g��R�3�\���Z�4�����<BVOly��������������,e���NC�c��-�A+&�S	��
�+�Ef��-K�(/������mJ�]q�er�����
�x]��p}Ti�s�k�;k���<~���o�a�'b�3�+STd�*�5��6�-^m��
K���!c��d�@����W�q�_�����1��3V(��.t���������;g	R��mHj9����
����T@���V���dEM����VL��^�]�} F�7}�8����9_����"y��6'#$Srf�V��/E	����a
A��}���N��8����o������'���:��<n���$	�,1����d�����kR�Q�'E�e�;���%����zr����Un=���LE���#{@����b@�s��,���/�����#x�}����df�yg��8f��[�jk�+**!����� MW-t�j��2��hmS�yY���T�e�sn�������{���._|�-�4���$V�A&A[����'�������G���n�Y�]@L�#���No#Xv�HR���J�k/��,����������(��U���E�a�LP4������4���|*�<�S�,�mKT����0�K�C9W��>���-�*�(��\\/�\���i���%�B�l��>y��4���jd�K���Jy{!�����77�O����������0�A��&j�I��J	��op��I��@Wh���R/�p�54}'�s�/~8ym���8�.Y�:+fu�\���e
��J{5�6>�ko5���4��[���i����
���
�3�C�F�9�u�.C"�UK�%`+#V
�M�[ \���I�`^
AhVT2z4��
�f��w���	7��~R�hZ4�U2� �=T�9��5��r]����5�Q6W[x
�#�Q�`�-������w�B�+6J�����@L������_��H����(ez��K�dp\�,�������(���U
�33�R��7;N�z�f�v���U�����!4hm���{���	ZS��"f���@�(�+�������6����8a��MD�k�c��v?�����5#��������S��h���R7i�|�c@/]n["�AY�6��~�
�&E�Zqq���JQ���Z���G����1Hg�I���r����?T���Zg��t5����-���'7�"o��k`��)�����a�'���D��(Fw�3������'�,��~��N���.l�rn�>[V_�����WB��v������b�X��d�LE�����~r��ND6"���3j}��������UZr'5q��8N�����bZ��9'�P��b��n����=�tX,�<��RJ9��Z������K��|]K'df(��Xl�v���������4�M\��?��'VE~��;L�niKt�Cn$�^/cU|l�����-Esi���T�\��C��-j���w6!D�*���7)���I���V��a��kE_J6m�	��h���k�^~�o�LU����H������-��b�G�?����O��~���^H(��Z�<2�{��7�����^�p��>��FK�q��-D�����>�Q��<7��GY���+��@w�y�%��������Te������;��2"���j}ml��	i�\�#�?�H��$�t�@C�����A+~�W��L�g}��(�@@j�)����������5����IH�����;�0����2z������v(�Q���"Z*�����g�&���z���j�[�U0��B3�v/K<h;Q��y�Vp@�O�&M|5���(��:�v�?���dX]@�Y���5��Epie;����.�x����S�X��\G����C��������<�D�������;��u�3=$w��q�������q���;�3���%����=J~@�WJb�)�?���~U�Y�x)��d|��+���J�
f�~PH�a���'�E]�UhZ����	����������	$@�3��2��R���N:'�*�[	.E
���{������z{��%!�k���=�BO���O_��:��X� L�DC�������^��F;��Va�����j\��|������vY.
�;����`)by��5d���b��5�7�����h�v�->�^Z�}@l)��j Tj-O�7�������w��cI*	}����;��t2�@��5D�d���ju�-qe��{�fh�(`�����Ei\���C�������� ���H���Z�Z5�!+�G��L�!��X��Z����h?HI��jx����#�Zk��$V�4N_s����00ZJzC�����y^�T*�Y#�����D� ����k;Z�y�,W/vu��9���o
U;�+�A	��������W�\.l���=��
?��t�R(�6�i���[?Dcq�����u���QLLRbYN �9�Sn�(M�����|���#�tv/�Ns9���8��i@bC�Cx��b���8O�=��,c���M�f #
������@l=�x����� �"��6�@���rC��M�>����s��o�HR��o�<]=���CV"���q������E�L�J,
��L���A�G!��e��g89{�������9�G��&U�X�2Za	��[�_,rwQCZ�"b�]/A��P���"Z��D�,�Y��\��$�@����o�f�������k�.zR�;Q��U�qN�j�����c�
����$Q����0X=W�sn0�S��[};��?���������l�0d&�D`��Ki�{����cil��u�����)	��%go�{*;��<��q����;W����Q�P� �_���|���|��;��#���niX`SxL�(��,C�	7W\��<���4�%��sZ1(z��������JO���p�^0���������nt�9��.���������/2x���$�j���3vh�V�6C3Qh���4i���M,�Kg�����1�����B���t��bo-y����JO�ZC&��j�|�����
"�V����I�����u+�[���`��~�
s����= ���`��a�o��tG�F����~���g��	<�G�6g��6Z���<��
���S�u������*�{to�����g���i��%b����������G6d	^�b�`}@��*���I(L�b�i�P�&;����)��S�\���X�V�����]�I��3�^"~��Y`��K������tH�{����^i{������9�:k��	���.�^���&8M�+��H�I�����n�������@���j,+���a���}��Ul���������L$q��	��!�i�a��$���E�=��m
�q��<6�#��������f����q���t>i���D������ wv��H��]�L�h�}���M���U������__t��g{�fx��>F=���?���^�+ho$q@���=G��:Mt�Wu����>�����!�K�>?��W4�$1��V�DBr���y���(�M:Y�=J������|�3���`v�A��2�- �|%E����L��"m���b���{�*0EM�XcB���#����-k����V��~4��^^m��f�k
��[���d���K�1U��x�~�~QE��`&��z�A��	��!����~�U �,B�����V!�Y0�'	��/q�'�B6x����%��o���/��5�P�!>�24l�F�K�U��#�����TG
���M��������zogCm���m#u���u|��h���������w�S�F���a�(J)�
�9�4]�����y)���v�d.Z��BEl6L��{��d���4VNaq46���m~�<�/�2&����3S!�-@s��^���nPe|T�y���O�a�@�������D�5>��� �W�?���DU�+�j4�TL�%p�8V��m����e���y�*��]E)D�X����A��8����_������V��8��������<�Z!��_9�A��|�.z����`
��_�y���*��;���� ����y�m�?������{!�WNR�S�����Ao(��$���wGE c��5�����qS�����q+t��^S����"_��;�����'����<H��U�Zl�����6X���o%�mB�W'��=\"t�n��N@GQ�4h�X��{V�a�M��
���?�Q�u��v�cxS��
��r����aX����������'��Y��5�^	��
���`L'�����z�=��.�:%�(5�����&��0���G�������(�sk=��;��*>���E�������9���L������������P*�#�/��Z<��n26�q.��8H��
_���L��������-M�U���������US���l��d��:���V$�=�����#23��v�j�������+�L��a��������Pi����"l��;5P~�.��`{8
�<�U���"��K(�J�M�B���{��-c���p��3� 00��~�Z�������=I�	0��5�r��,�[�9v�Z��J,�L\�������A5`�F��ST�%0�,�� @����C�z��Ix��%���%\�6`�f��e����L�;�q�^�Cl�o���&�M����(��4��<��T��WfR���F�i!�;|t��mo�:m���z�����4&��,�����4�:U���z�~d�K�`�-��$M��vp�:������e�1t�E�k��Z�vh�����v�T�N�0���E�{zX�� �`���T��us�[�H���ci�=U�|�#Ilqz�W��
��`c����� �z�+(���P�$,.���r��%E�,��W�A>��_O�t$�yj�'|���<�c�!)�����Y������s�c*)G��}����"���V-���������4�U�C�F������G|�u@R D�T�@�S�Q��:�H]n<�!	�9�a������:���g����U��������q��Gg��D�_t\y������7�.�sO����|�,��%����xu��LV���������YV
r���a�&@��+`V�:�6>�����A�x}Oz���G��{���o�&�������>��|m*�x�:?:��RB!�<^��hHh3~~�f1�)�b�MT��f>W���L	�w08�(�+��F��:��f���3f"L�sv����3w���w^o�����o���idr�lt�-�|zm����i#��$��Xi*�����V���!������7�������q[�^[�����-���gN����Ev M�;��;�!���	�N�#i���+�����*7*3 ijz  U�P3���j��)�|�Ss��I�������(�b��BU���ns�:l~VVo�,�����H�
�?]#�h@9�De�Xv�\T����)�6�s�U�rm�\{��{s������>S�����g�T�]�'�$-��ML�������cis����:�4(,r��gE�����9R��3����f�xI9�<�Q:|��<�^��7�H�8��(��$��)���j�n��x����>'��������&��x;���G
T��L%�j���JW�2�{��;���<�
������Pe{�;?F������%��7RN�X�&c(��R�?J����e��:�����X����Zs��}���,G�7�(I�;����6Bd����5���>6�������P�'����#�����hK������(���i�YU4Yj����l����L�-� E=Cx-]���X
�;��VIN��e�0��/KS�c���m�eL.����N�����L�'�$������YF`J���#��h�h��QP��GX���D��nl����J����a��,d{�� ���������a��^hM��y��#a�5����7@p���U�m�N�O�*�^>j)	{	�[p� z<�2�Df��c���{$��J�ls��(����%9��T����Y�����J�������/�J"�J4P��^���^/e��ct��q�@3��������?������z�*2Q�
�����%�p������3Tn�Ng`�9�GT%;��Y.����<�P3�$�O���i�}M�'}�+*�1D���]}V`}�C��&q�@E;�0":���e-97�1j>�	{��GXc����.�t���pYMb/�� C����>>�$���w�]�!�v�h+u=���6D-��
���E]qv�1;/��\���B#��M�G^�r�^4*E-N���P�j.<�j�<����>o�O�A��t��s� 5��Gfn������8�c*���&�%!��?�n��B\d���Y^�`�sHdl@�7M�F����P3s�X�Y��P���?0�E[V������W�!��'��qaT�S�;u�4\������H
m�~@U�80:�C�%I�������i��/���R~�>R�R��S�
���K�c��(k���C.�e��J��`'Z4�w�����
���J��[�m�32����mQ#�|�q��>E9���6TB�j#B<i\��6�;:���_>�z8A��`�k�k�7)�+Y���E�)���&��
��B{)��
��)8�et�[��>�$=��]�/�/o�Y�S .�>�����h��Y.q�R��$��}�<.t��(	�hk1�x���J}�,5,��������F�$H��x�\�I������V���XC-88}Loi^���D��O��)���&�(N>gS�%���Nh�{`�T���,7���#NX�E{X��^J�-���~`��`*��a~���NGs��E���^��!���j\px�[d�1�hh�.�p����_~�v������&��|R��+�$�v���K������*����&[����8��������S,@nHC�,�NS8�[l����w+Xm��\g�s�l=������>��n�'&��3���t�'I�w�AO�vD[�e X���Ds�������w�Q��C"���e����~
i�]P0��ea���������^�b;���<����=��;	#\!^�C���M�!���.�K��5���~����O����������b�P�z�T�hy��_��*y�8^(i��� ��D��f����Y���95�b��2���IoO�?F*�����xr|C��h������.�2+�
����I�E�%��,����Jd�"n�V)M/��nC��V�n�$'t�w�]�������m���b�=�c�?ce�Ne��P
��ME��`��T�Px��P��"�����N��D5N��T_JbD���9����PO~�������^Av�������B��tS�P�o����
��|yx�P1?9�;<Uj��s�������S
k���JE���f��:.�����\��nZ����\>��]��c���J����N���`������-��O���71��l�>)[����P�=�������]�~����'QVu�m�����,����?U��%D�����M)�����U�n�%}���.�AS'��������C�rs�x�Fa������3�X�������)������z��w��C�k,��;��mlN��a�����@����'+���:z:����v�O��������Bk�|�l��d�3����$HY�����R���.����K���N���[��P�"�D�{�9�p5�l��@G6T��(���^�80������-d�+�
�������V�t�����#bs�LXyP��*�g���tfa����I�CGaU#@F�����&�CO�����������`��_8�|�i��,�p���L�P�+����64*��,�
�T��m�G���Qx�2QUH�� �-���'�I��u�,7�SB��S4��T�������6�M�+��L��u�F���nhe��A�O�������z��yvYU,���V�wqy�@D�"��>��`��(1	��aC�?���"3
}^���m�>��"�?�v��~�97"�1�������
Z���B�B'�m2�g���'�]3,w�~�?}%+B���H/�������9��r���r�]��:�z,\l��
pL��MB�5r�MK��q��MMB+-0c@]W�aO5�z]��tz���`�g��(�����$�0sZS���������t���b��H�Ov��l�m��/�B���*
����B��DA��8���V���$:���w}w^������3��=3E(�8�'M��8�m�|?&����h:�5����,YK\gB|�����y1w�`)D#�C`��0J��jT��GHd���������a#Y�6%��c�P��p �ss
G_CEdO*�r�iF�����#���I�����
��b�*����_?�r��L,����#R`2�wfw0,�OO���W]�u�����'�"��!��='	�WRd�I8��#��5J�vj2t>�FDo+��;�����+Z�T��'�������N��(��uhV����'�7��rHV
���WD��<�3����g@�A�H�lDK�����V������s\�b1C��J��p�<O �B�kl{��6�h-W��1(R���MY�����f���������R����O��K~6@7�jl2�g�>��D���2������+���"u?K�(�g��EgG�{]s;�8?���k�j���\�K����k�T:V����$�%~���������l �H�!\���t'�l�����(Lt��ko���=""ZoS��z�Q����`����d�lI>�W��l���U4��y#�WVV>Hr�� |ct��������� �#�	&�/�{DPcTy��?���"f����f��^�����5MX�L�G����u���C�|�s,�6}q�	���+mr������u�c6v1��Nc(��^0��]��:�x��_���v�P8	3�����G�:k��/g��Z�]ma�=(@���;�P0�.�OgH���OGh6�+�]��H�<Wy;�jW��K�<�3E����W��o�
f�����v��D����Z����{��HL��#>�z
Gn��&*�wi��3���'T�B��n#N��������Z���T;�?�t�:�HL���|6K�h������Sp��n�.n�{���Ee�L��]#H�(�E0��
�j����q� V��o2��LEH�d������a`�s�Ms�]��L0���V`���(��c�K�M����"<���c��0���c�!�B	����d���c�5�,%�
JWc�S���R���������������BdE8n��O���n�+@ ���7�cV������	s�z����8���!L"�{���� �/�s%v]V1>�Z��n�O�F;�����F�[w��Ky���J���U)�:p�!�1�D*�E$+STL�_y�Y���}N�j/*X�M�)@B��H���"�
���g�C2����+1��VU8��U���8t��k}	�K��:������nf�RH"a`���[��E�?H���,
�Z���P=�����`8��	g��	�A�N?�����T�i0IT\T�*Ae�tY�T��17��l]��?��H�������T���&~P.�y�	��Q��wK8���0�Qc����;���..1uD�
�(���Yb��
�c������'|�q�&W��?y��M1���N��p��	��T�H�5����1�;;���|�]���}��^�C��Z+��h��^HDB9�r�M&���EU����pE������W}u��#��*$��l�����w��u�n�hw\��np^N���	x7K$���)�;G�;}���)��)����������/1��^k����j.���-}"%�p����H#������Z/U��8��?���o��7o2#z�N�0���A�����8	"z9���p��;|�-Z�����)�G�P3�0c)�����~��T�#LEQ������8�xnMDg+3��)�n��qc�a���lZ�-��[�~���A���	��
��BN�0�:��8�g��}
�R��Q�"nW5]�*�U��o��\��;1�M=��1|%���KO��������@�afG���3��&*��9|�X^7����������Xq�i�v�'��PaX�1�����O:�A�4�}�n���'����$�����Of�,iv	z�I�V�P�������:{i�R�;nh����V��L����.��7�V��w>,����"9>
u
��r��:5G:{��x�,k�:�������`Z^J�o�#�;�`�*,vs\6�3$�������;�=�����^�e��w�8e�$S�5$�Id,�^�ZB�Z��S�������F����W��������@{'�����z;+�P�����	���2w�LIo1�f!FU?6����bK�}E�3�x���j�$��%��E@Hr19�C[
[CD��?SCRV����{p �����vK�C|�V�{��;��������K�Tl�jC��L�o��J��+���B^�]F-8@!������93t������`!��8���>v3��&����9����B�DF#���uC�w�J�6Y�:���Zp��G<���G�����?3�	�k����0T�~��9j�A)#5g&J�R�����j��9����z�M�M����U����r/�H�<
��IJ�;�B��]�3���������W������/y]���](y��(\#����Y>W	m�����;A����0�����s�{�$O���
�_�������E5v��@Z�e*����b����1q�1�"\���
�_���e����fy'`�^
?�x���^��o8H���;��YQ�z��4"��0�p�K������r�,^�X������J��� 1���jS/v�=���1,��1`�*�/�cjbBwT�y�o������]Lp�,�3t����p���/b)<��mP�[�J��O�-����	�Kh���p3�Q��U����U��?R1�s$����R��!��]�
$f~���3t��+	
�y�
<�A�JN��"�s������g�k�W��LcgBW�`e"K��\������@�U:c�d/ur�u�o�R��z����%�=����u����%Hx�t�u��[��O'��G��&?!?�EP�D*���:%1���A�_Xs��G~V���5�M��8{��w;2��oV�u0�����w�!B�i����
�g�4�yv�[��?�HB��-�Q�0_�h$�1�#T/I��^Vd��e���m�Q���8HX�N4Y��4I9b�9d���@�~Dl��l�l�<��B#IB��a�L�RuN��=V~�7	�v�m����6��c�sS�L��~{e~)�|�� �F��.�����k��v1�[�#�V�i3:������D�@��s�L�s+
�O��:�'���}��W�������c��'�u�&>�K�����?oa?[!�-��@���f-KMt37���[,��n��2��k�i���q6C����a���Cp\���4�s�l���=��>�1�&MmNS��V'E�7�^�����|�q�x�e��=jy��;�.��d���7S>jF�T�;��b4m�^?��t�:���5��\�5Dc�9kq��L�����7�D���1�����O����CO�k��Am!�S�)h�B���[Wp��k�����Erx=]��w5e��PB�Cr�Rb
c�G���h_�kl�'Le�-&!
�<�&�*�"[j��Kd�e?#������S3��?�R��A3���t����������9�j�N��{a'���6����q����?�-�[1�V�i��^�A�:����l�X0�n'�uh��2��n�p�)Y�~'��g�?���R
������y�����SX��7�aVi�x�����U�bv���^U���ZX\�K�Y����������]�����p�i��
f=�8"J�
�N.��3������"�xJ	&!)5u_�X	��~H��]������9�G�3$���;z�<������dr�A�Z7m��"���7J$Q��Z/)��[�7�wP
X��s��9rB�P;�3�����<
UGUW!Kg[��}����1�k��z��Y�LBi�����>��%0�s�C��j�oW>�Xu�nS�Z�.xk���r�eO%����J�U�����n\�����w��P������
/���o�P�.����]|��P;okT�N�2����1����0b����%h���Y
T������.W��m�f�<�t������'�9X��H�>2�^��	E���O1^
�K��)�t|������s�gqa�����w��UL�����=���>��^�fmh�|�:q�����2����
��Q�-�^��k5�?���t>�.n
�z1V�51���;<��k�0_�m ^�7j�1��c�#v�5H���WeL�YE�����p�rAf���������d�)������!3��{Z3�2'���c�:-�Q)�
dfpy�����X�j+�q:w�8�?�jV��xn�0���pn0	9K�������-MI(��I�O2t��Y�?��mI+6v��f����/$YC6\�k|+����p G�=Lx�oX��D^3���#����P��
4vDf�ot����?=c��.���nA��<M����/Ei�u�<��O_m����u{�o��	;��3�BSda��~Bm�I(/�*!�X�5kV��.����6��FOb�F�,�m��s ����~$�N<w(�q_)DR}�����������������r
�WW�]W�:��c�c���FGx��x"��E_a�,G�����O��l��D������H�Q>�1[A�j�
<WcA�l���&@��CA-�KO ��T_r�R��6��[ae�bv����h�T@��l�RK����S��������9����V��I3u������^w��rU���#�i�d���XY�$aE����V��`�� u��jc����\�x�.��E���v���~>�4�J��/�x������<������Z�h{��s<�K�[���bv}���	[��,mc<%��/i�-�R`*q3�E�z�5����]���}�Q��1��>X%]�8w<��$O���1�%������f(����Uh�{��#�;U�?5Z(P�.�*Y^�ci�YS��b�R_N��@�	��R�{���-{�n)�)p�Q�5���X�T�ndl���3F�;3%A�.5\z,��c��*����Ngh�i���}X5�u��i��:P�D�Q14�C��������2}���[�����:���uDV�(�D��:�SN5���[y�j����M�0�9TGo.���G���n5���E�9i�Bo�!�
� �a��1�CK��$�%��9�8����8�!�K���c-�5O�{�Us�*5����*����P~�L
�Z�;'$���<������ESI�$�����������-��~��D.��)S�J�c ~��3�����k�A#<e��H��V@5�4�a�����x��@��I���=D�7j����8�t����1�����[���7��[}��Z6zI�2q�`cy���J�[�d7D�$"	����H�3�U��6W9[H�4'��Q}�I�H7W��`s�Q�i+��#ue����t���dx��Pd���%�����:��m�
k���m��8���y�4�u��j�e~	�5���&q%4��"Py%����?�[�O5{R�8��L7t�����0�U�MQ{�t���8Qk�Pm`���m7{c��a�7-V��b���u2�[�#��.�I*^F��c��?X���+����� l��@-!I��ea��pQ�H��3^a�u;�e\;���@���v��5��G|Y�V���5s�-������f�����n��
S����{\�n"���LP!���AL:�w-�,*�e����CYN\�����r�3���(F��5����d��L��wz����T_��NY
������#��
g**|SE,�
9v������T��;����w?���X�A����G>��4�q9��+D����s �{@K����`�T7�b��t����unv�@L���>��U�1B"�9V0�]�A�}8����%_�^}���t�x1����C��h�U���*k�+|%Z7T��e�~���'�'Ik�@��i��
��58'������9b0z������m�n�����:b�,�?��2n/��?f9�g����T��N��.Q	�\n��7W@zL�K{����bl�lhX�-
�����7���Q�$���ag����q�*p~��r��v��OM%C����Uh������A�H�q�5����3\j�
8��9^?%08�b��e^;���2�1�n���@W=*������m��N�N�Lm�7����0P;b���I�#"��-0�����c�+R��{�H�Rl5h�d*����)+/�	��`���\�Rvm|�n{g_��_� ��B��#����v]��'}�a$�Z���u�e�Zt4���Q������qt��e�+mC�+�x v��2m1��J"i---������E�}��U�_���=�$������En�qp��6l��&�O`�&����������Ig������k�i������9D�lu�_@'�g�*�;���4�g�m.M���PuN�ck{�� 5P��a�lF^##�4]�nM+<H��#6K��Ix	�����=��6�
�J����-
������
��I��/)N~�����Y����(�;�>����e��4�
�?��Hr��	�M�mR����0���+A4��o C!j�	��{�&ak#S���O=��1����h��	2�3L=y�S�U� GG�t%
g��ZQ|�Q�{!+�^�p������Y
B�����3�q�x�m+���]L���������_�Q_�I�4Z� �%[��SDS��]�|����[��P��377����8r��~��l�8����q5_��&O�[�eA�f9�����A
��|�]��su�B�c(<������ ����=s�1N�Db��5�����e/����;T��h��b��$1�y�<�����-�����m�Z���\����{
�����|������o:�f�@���;�Qy�dw��&����)��t
��)z
L
�F-O8X����2Ej��L���*�����c��DEGq���7�_��z�T@��<����o����3	d�4A�Ar&���i>o��E�2s
M*�o����=?�����eJ�3u����Z���fzI��T#�b��`}"*��#��d��?c_�F	�(+y�:�3�����r�e�-��������h�����"�8��2��H�v��X�4�$�N��6���X��d���2)]�/��>u�������������s���d��O8-�����
�]�w(&�iA
���<@��AT
6��v�IlP_K�����v^���;����FM�f��fX���*�����#%�i�A�A`\�����
�f�'����p^2P�^c^��#�m	��v+�������|������0����|�i�dB��%����E��'1�F�y8w����.m�y4�����T���-L�+O{��.�61�~���vs��9��P����
.�V8mG[����cQ�%�=Q	j�!�Gc��m����k�����i�=u#����h9&��	JoYJ�:��A����&�k�[��u����������7�t��j&��P-�gx��u|�FX�e���-�,��hh��&JT�������J����L�pRB~$���D��:������Z�G������I#��E�I2 ���j�ty���*J���x�]�yh�"������A������=����s�����|�!�������K�������w;�[�%�h��~��e $��+�MjN��Vh"Tk�	������pB�3`O-BWE�>3[g����9������O��n��r%4�`�;�-R��_�PU�VC[�r����s_1hp`�:�n���1����z��)���/��3r.�G���������6�?�%!C/�]�
��!b<�S�G��@�`~�q�(��j��bV�'s0
BXU�"O���L���J4����p�)K����X���d���g@f�F\E|�C�E7i�I*��d��dt���0�Y�&~�
���M�6����@���gAJz���x���3�'�{_��1�?)f���)��w�/��0-����,���;#!�t��ux�<���m�V	��K�����E}�	f`J�6g)���C7����rg��
��Z��)OI��R�q	�+�t���b�;w+k�T�mVO��z�KF���N)�-�Q���Y$����b������T;���s���R�T��_�����a�;h�?��,�
����MR��c�8Z��d��.��#�3�����h����������Z^�,l�����l�����_��-S

��������HBZ�%d�.�(P����z�fN�y R���J.������i�����pBN�ON'j54X��B�fK\�[��s�OfG���H��.fbO���
R�\��	���D[�����>2���|�S�����E-�n�1����z�-��y��U��R��QmV�������jK�3� ����yrJ��d�����`�v���`�'$����&���UEX23~�-�� ����:p{�P������4���X�h���cwfWn����d�vl��!�11�,�-�(����F0�����0&g5�d�2V=�D���T�@AWR#��$�[a���O�&�k\�o�Kn��g=M��LU�c'�� ����4�#�wV(��xQ ��\��<�0v����qbb��T���������)f/U1�h-E���Q7��E�)�y�[Eq>�[@��#C�nR;�	��E�����1���0���@t���X@�����'�T������������ER�K����"C]f����h��k���Btr�{%�P�����\�]���'�������N���7+�}v�b��7�10 8.��������Ve�Q�!M���(\���������mq��'�*I��mQ��kZ(-�{�s���T�3~�`o!=�j�pa��F��Q���lu����6�����W
�h* ���$?B��3]��F�@�3]"�5u�Ii+i�(�����m�W��F�B���$?(����W�W$����b���A���>�Q���
i��N�?^�?�-�b���[a�DP����t�K;��}��LS���Iu��jp	YI�H���]��^o1��\���7H�K���W��������������W]9���" z�~|�[Pp�
�
l����[\��D����c��5B��m�<{x*�|lu���a�&=�5�4p@��t����t%���$��c>��H,C�1
y`�p:���j)`������.BFN���[���& �#�(5A���o�����kK���8)�@�I���� �~]Jk��F�|kd%���n��x�����-t�
|�e����+�����^i��]���)������G�|�\���$!�\;a�|��v� �0l``���f����������',�?R��{8k�nH�M������O$�t��������!X�t�h����g��:[H���>x�V��s�d��� �4�
#���SM�8��}��1P!7pXJ�8y|�2S�s��������/�[��b�U�8�DaB�Uv�`�EW�i}��)�����2�u��A~"��{���eB�Bp�:��u������
��~�v�,j+�C{��&�t�I��?
U^��\=�g|����:>��kMV��?��������
������}�]�Yi@����5�0�����	��j'(���y���E������Q5�A��c�7�o��/����u��X���a�
���_Vou�������n�j�g%�d������M�/�1����A���i�"����d�W1q���Hd�9nm�3�2��Ys0��.~�����o�6���"]�X�R�+�{\PU�u���r�.��^+o����E NBz�����RI�����Q��;��W�!���,���T��"O�m�V�w�y����Hn"jC�aL^|u�K�}/c�Adr�06L��8N��k��%�<$H��1y+���)&�q ����	zc=���U�(�XT�H�uT?���I��"�����K��N�RT�hT���Z�h��Yw���i�����e7�na=F������f;�'��Q�a����B���r�
:�xT�2�4�93��4I!�5�{��+w�SK[]��h�4b;���vs�����{}t���:��f�"���T�C�#��P�&_�3��H�)"T_�Q��+�hy0��T�^����h��`��$L�h�60dM�&��/�9O8$� xv�VQ����6��&����4
G�-��BsI�j�m	��_�I�$UiO��-N�o�p�?����D���������bh��0��@F/r�j�Fj!�����������L��;-���u^�����mR�����a���s��V�����:���QT.��d����t��m�$��U ��UC�8`�6��\�O��\3���g����^�.������
������o���x����!E�����MS��K����!��d7���4����������R�(���@E�P��%���|�M���|����j���.2�����^5�:y�$?E���c0.�*������Nb��r��iT��n���K�K�0�)��(�i�~�@4Q�F�����t���
8� H[��K��EGo��<�����Z�S���B�vd���y�������K�T0tG``]�xQ�������}���L��v�����9_��������J�Lk�&Co&��4�9s���	�����������\�bL��9/�4J?��k�F���2G�<e.��Wj2�����}�;�L��	�|1���@�����-�����}��RKR���
���5�Gy;a\s��UWC h���lA�f��J?��q��?5�X���Z�����fR�?�������xPJ�L�l����K���V����I��8��[1��S�3����V��b)���������e�'�|�K	�8���*����%�	T�a:x+2���;�V0����`@4�:���{;Li��o@vz��������T���7�i5`�C��5��pau���>h[$��_��P}2���fT��}n^�h�7��}�c�R�H�o<�v
A����1{�f����7����q��~��`�6�l"�]��x��*9C8�����X���B�p��,�GOw
j�Z�A�+�^�T,�fwu��,�]3�0m���
�4]Ew���f"�s�'X��O�g�M��-����e��/��������	a�zA���c*�5�+�����8��qva�yu�,_*:A�C	�������>��Lf����������?U�7�{6���Q�u$K��j%��/]���W���b�'{��iU���j�C��H�������@�1�
�L���w�:����da����8�6�O��������X���J��r.����Cp?dX?DH)���S~�!sp?�#��G�OQ���*���-J)�J�Yt<
�pl^������W��������M�|����K��*.��\	�T������c�$;���m���D�J1_VAZjty���M\��68�����`�Ch�_�Y���������[�/D_<�/����0�b@`Hl��A#�����<���.e`��nng��_z�O�S%�����5�bO4�I�u�bQ���b�a���H���>8s��������O��f����]^;-~�]:Ml,�L��.�
e�~,|�l��A�6ZJ@=<��xt<g$�5s�������\�q�}����He��d�5|c)4L�����(��������5�������~��YJ���m�g)��^rCw
�P��A�JP������,�����o���
U�T������?S)�����A��j�]���n1����x��������d&l?����@m���@�K�&A4���*�����S�� h��'Ne��wmL���%�������0��Kbk�{���M���h4��)��<����oZb���7�;V�"l��F3/��,�-�U���9u�aY2�heU��T���d�������+(�6:��/����P�}7���El���|�i.��������FCq�*|�af���	�����9)�7�3���PT:��;PmQQ�p��YEk
�+k��H�N����wU��iW�r�dU������������'�l�Ha�&3��\�?����W�>�:I�`���Fq'�.�zr�=��HM������n��f���k��h�WD���|`�,��j;��a	��#9�>��=wJ��jZ��3r��C.������L���./��E�g�|xH��E�Z�J��G�����?��]���|bn����s�L�F�);� �~�Y���v*|��������u�\���������^�G��T2����:�n���g]��|
i�������H���@��� ����8/�w��	��a# ��
\��ESpg_index_adviser-REL8_2_STABLE-v26.patch
=���6� 
#16Andrew Dunstan
andrew@dunslane.net
In reply to: Gurjeet Singh (#15)
Re: [PATCHES] [HACKERS] [Fwd: Index Advisor]

Gurjeet Singh wrote:

Please find attached two patches:

1) pg_post_planner_plugin-REL8_2_STABLE-v1.patch.gz
2) pg_index_adviser-REL8_2_STABLE-v26.patch.gz

Why are these patches against 8.2 rather than CVS HEAD? Is this not a
new feature? We never backport new features to the stable branches -
that's what makes them stable ;-)

cheers

andrew

#17Gurjeet Singh
singh.gurjeet@gmail.com
In reply to: Andrew Dunstan (#16)
Re: [PATCHES] [HACKERS] [Fwd: Index Advisor]

Please find attached two patches:

1) pg_post_planner_plugin-REL8_2_STABLE-v1.patch.gz
2) pg_index_adviser-REL8_2_STABLE-v26.patch.gz

Why are these patches against 8.2 rather than CVS HEAD? Is this not a
new feature? We never backport new features to the stable branches -
that's what makes them stable ;-)

Good point... I always worked only on a tag or a branch, knowing that it is
in some stable state, and won't have to be bothered by critical (and
sometimes un-compilable) changes to the source tree.

These patches *should* apply cleanly to the head too, since the first one
touches the code in very stable places and the second one contains only new
files. I'll port these patches to the head and get back to the list.

Thanks,

--
gurjeet[.singh]@EnterpriseDB.com
singh.gurjeet@{ gmail | hotmail | yahoo }.com

#18Gurjeet Singh
singh.gurjeet@gmail.com
In reply to: Andrew Dunstan (#16)
2 attachment(s)
Re: [PATCHES] [HACKERS] [Fwd: Index Advisor]

On 1/15/07, Andrew Dunstan <andrew@dunslane.net> wrote:

Gurjeet Singh wrote:

1) pg_post_planner_plugin-REL8_2_STABLE-v1.patch.gz
2) pg_index_adviser-REL8_2_STABLE-v26.patch.gz

Why are these patches against 8.2 rather than CVS HEAD? Is this not a
new feature? We never backport new features to the stable branches -
that's what makes them stable ;-)

Please find attached the patches ported to HEAD as of now. The patch to the
contrib modules is the same as before; the version number has been kept but
branch designator has been changed.

1) pg_post_planner_plugin-HEAD_20070116-v2.patch.gz
2) pg_index_adviser-HEAD_20070116-v26.7z

Best regards,

--
gurjeet[.singh]@EnterpriseDB.com
singh.gurjeet@{ gmail | hotmail | yahoo }.com

Attachments:

pg_post_planner_plugin-HEAD_20070116-v2.patch.gzapplication/x-gzip; name=pg_post_planner_plugin-HEAD_20070116-v2.patch.gzDownload
pg_index_adviser-HEAD_20070116-v26.7zapplication/octet-stream; name=pg_index_adviser-HEAD_20070116-v26.7zDownload
7z��'Dc���a��[�I'�����:T�t19CP5w,���~��?�����2��;
����r5E�1�
��|Zh�6+K9�����(��'��KH����+����"Sz��	[����.�w"���������Sh�G�=����>���?��p2��#R�8��t����
���kqV�������2<������?�����s.���u��O(��@�%R+�������{@�:�%����_��S�i��jG�:�.&�������(�S���IQ�E����	���Ub>4����Y�:d��+����������4:���3�qv��m9'�+����8�����c�����"]=X�{����<5C*$������y���F���C �FcXF��J�X�h����d�E>�W���]�^�K�9��gtK��K�k>7����W���5g��p�+�=9~��������g^�M[������`������+���]$nY�a��#|.�\4
Y�`��3�O�}Y�T+�����'��fT� ���r�MNKx0�HW�z���V�>3f����"��^1W����!���]���<�_$aw�h��c�����u��[p��,2�6}�0P��g������Q��L�.`���n���0}P�.o��X���,�]�u����8��e�A�%�v�6�.\��,td�Gk����]n��i2�����1	���������$6?Q����0�D*��#� �$�?4��;
'�]���A�o�&�:]�:�������<�K�������=��z%w����<���v!�A��se��x�����\HC����C��yv����m4i��r�{KB�
��,�����y%}����z�VL�Q�6A�N��X����_�����e��`&��_-���I������a$C�6;N9;*=]�/X���t/����@
(;��|���^�>���5~���r �O( �0�
4�c��7J[aS
Z��Rd����y�s`t��%I���%�V"������2u��� ;���`�.����<�Oi����� ��c�}�U\�X�h�����W���e<��
��~��^��/����O��O|�s'�M�������!L*�R%W ������T�d��
m�#n�4��I��l�9���H���Ol���,IB*sj�����8����Z�Y���l�>p�k��o�x}<pdeE���(�&<)�����q��C���3�����.g.�
���Xy��"��N��t��b����������������@��8������KQ��G-�Lq��N��V�&pDx������TjJ�x�'����0M���
	4�8]!=PX���}f��%K R�Kl����fe;�S?	���D�	����8p����)B"Yt.�vy���rJq���t
m���l��l�d,O�F�eT��&[��ag+��:�6C����z����4"����'PX"�q>f'�k��c'�yy�FY���P ����o!�-�D����S��m���Qn�t9(5^��Qf7�9LS���>V������A���tb�w������W}��m�'����[�z7��O61���&���UEj����@o��~�h��q�K���	����@/	�-;�[D����{���2��93L�^�=&[7Y�V=!��U��^zt��8G#O��������VA�L����W�WX��	�-��#�v�&�������cE����hw�B��������_�G���U?��'�g�J4��Zs�f�o��>3\Be4��MI
���� B��j9�����s��������L��yDpg���;0+L��L�zY����fH���.�r�cp����#����G�^��w�
�Wj��'�D�X6�����������'=s}AtGT���GS��6���,�c�O������1i�a��u8��~Y'�B�!�C$�8�`N�C
�~�#�i�{*��t#���?��a7(m>��4uu����r�L�XU�$�J;w@��f�@�<��c|V�S�Q(����HD�����v�H{�U���������
������&
�k���/����n��Q��Dg�w53���Ls��TcV��
��a:0(�[�+b�,�
Q�t&���RA��m�V�Q�g�Og��R*N/�-l[��e]|�lg����-��j���:$���x*7`�_�����_�
������N@Rb�h{����J�)������H��il��'W�F��%t��g�`?+�!nG!�,e[j��K��x��`�	k�S�����-_q���l���vg��Q�  U
�L�Cdj�}�����'
��|�Z����LO���K�_o/����6{��R��d��/fc�P:i�RO���_�����k�Yel�n.�d�k�'��:�3.b�`��+?X�����N�K2:pB����8�o�}����*���f !:~���gLV��r_b0)vG+�?��(��V�B�G
P�%=�	~�z�[C������{���8����,:LC�U�q�$�����Rs���+���rY�X��)H+��?���mO�{7Z���}��u �e$��3�7<������p?)����j�|���N�v�����a����.�h�C�b�ueW�����������#<Ox�9���,�8�
xhvb�4��S:��h����#����%��H��-}KF�u[1F�g�k*o��U]��J�6S���������r�d=���t�
�Q�X h;�����4"u�F�JB���7p������s�{�Z������#��XI�X�����:�J�/'2ri�j)"C����g����Y�|�c	�2=���@8�����oA���6`��g����^#�W��'�+l�p��K��uVJ��p��)I�9#9R��t�7R�2���[�kOH="i�f���������I��hE������U+�Q��8:p���+akR`���'Vm/��������,��i�W��Xt1���Z�4�D������Y���p�8�0�I\e�_>\!I�o� �#5�5��$��@I�z�o,\E�Y}�M�UyS��L���/��H��C2
K������
�S�TIg>�:��t�����.��<R��(8ni�z����na��b�E�����X��&�*��a;7;��y_��������W>a�v@��#��-nH�������Als{����m��F�����?'��r��Dm�������4g^3�;B���9%��i��R�lf0/ge>��d�e�8���{�q�o��.�k�9U����dN?^�	;O�]�������P���}vE��:b�P\l�������hD��������AM�Zw��S�FZ�||)��>�8i�YH�	��dK5�M�o��T��������$���&�+ms�'`����7���o������Lr�wms�����d����[�����:�f����p&����f��n(P�~�������ucJ�1c(�6���Be������������:����e���t���v)��:mx�
��������X!#����5WG�F���v�DT�TQf|�"����g����W�t1�?�>�Ek��/�su�(����;�H������r�a��<^��'G��jc��� [���@�^AZ��Z?���MC�l����a�E���]�$�$�'H��U��10��$�����LJ��s���������U��kH�!
�k1��#Z:k����Yl�<)���Tg�K7O?����D��F7�c?v�F�Kh�?�����pq�3iq��4�%T'�U�(Cg�F�&Rz���5��;�~����XP������K��`q~
]��Cj��O>m��L����JI{2*I����g��R�3�\���Z�4�����<BVOly��������������,e���NC�c��-�A+&�S	��
�+�Ef��-K�(/������mJ�]q�er�����
�x]��p}Ti�s�k�;k���<~���o�a�'b�3�+STd�*�5��6�-^m��
K���!c��d�@����W�q�_�����1��3V(��.t���������;g	R��mHj9����
����T@���V���dEM����VL��^�]�} F�7}�8����9_����"y��6'#$Srf�V��/E	����a
A��}���N��8����o������'���:��<n���$	�,1����d�����kR�Q�'E�e�;���%����zr����Un=���LE���#{@����b@�s��,���/�����#x�}����df�yg��8f��[�jk�+**!����� MW-t�j��2��hmS�yY���T�e�sn�������{���._|�-�4���$V�A&A[����'�������G���n�Y�]@L�#���No#Xv�HR���J�k/��,����������(��U���E�a�LP4������4���|*�<�S�,�mKT����0�K�C9W��>���-�*�(��\\/�\���i���%�B�l��>y��4���jd�K���Jy{!�����77�O����������0�A��&j�I��J	��op��I��@Wh���R/�p�54}'�s�/~8ym���8�.Y�:+fu�\���e
��J{5�6>�ko5���4��[���i����
���
�3�C�F�9�u�.C"�UK�%`+#V
�M�[ \���I�`^
AhVT2z4��
�f��w���	7��~R�hZ4�U2� �=T�9��5��r]����5�Q6W[x
�#�Q�`�-������w�B�+6J�����@L������_��H����(ez��K�dp\�,�������(���U
�33�R��7;N�z�f�v���U�����!4hm���{���	ZS��"f���@�(�+�������6����8a��MD�k�c��v?�����5#��������S��h���R7i�|�c@/]n["�AY�6��~�
�&E�Zqq���JQ���Z���G����1Hg�I���r����?T���Zg��t5����-���'7�"o��k`��)�����a�'���D��(Fw�3������'�,��~��N���.l�rn�>[V_�����WB��v������b�X��d�LE�����~r��ND6"���3j}��������UZr'5q��8N�����bZ��9'�P��b��n����=�tX,�<��RJ9��Z������K��|]K'df(��Xl�v���������4�M\��?��'VE~��;L�niKt�Cn$�^/cU|l�����-Esi���T�\��C��-j���w6!D�*���7)���I���V��a��kE_J6m�	��h���k�^~�o�LU����H������-��b�G�?����O��~���^H(��Z�<2�{��7�����^�p��>��FK�q��-D�����>�Q��<7��GY���+��@w�y�%��������Te������;��2"���j}ml��	i�\�#�?�H��$�t�@C�����A+~�W��L�g}��(�@@j�)����������5����IH�����;�0����2z������v(�Q���"Z*�����g�&���z���j�[�U0��B3�v/K<h;Q��y�Vp@�O�&M|5���(��:�v�?���dX]@�Y���5��Epie;����.�x����S�X��\G����C��������<�D�������;��u�3=$w��q�������q���;�3���%����=J~@�WJb�)�?���~U�Y�x)��d|��+���J�
f�~PH�a���'�E]�UhZ����	����������	$@�3��2��R���N:'�*�[	.E
���{������z{��%!�k���=�BO���O_��:��X� L�DC�������^��F;��Va�����j\��|������vY.
�;����`)by��5d���b��5�7�����h�v�->�^Z�}@l)��j Tj-O�7�������w��cI*	}����;��t2�@��5D�d���ju�-qe��{�fh�(`�����Ei\���C�������� ���H���Z�Z5�!+�G��L�!��X��Z����h?HI��jx����#�Zk��$V�4N_s����00ZJzC�����y^�T*�Y#�����D� ����k;Z�y�,W/vu��9���o
U;�+�A	��������W�\.l���=��
?��t�R(�6�i���[?Dcq�����u���QLLRbYN �9�Sn�(M�����|���#�tv/�Ns9���8��i@bC�Cx��b���8O�=��,c���M�f #
������@l=�x����� �"��6�@���rC��M�>����s��o�HR��o�<]=���CV"���q������E�L�J,
��L���A�G!��e��g89{�������9�G��&U�X�2Za	��[�_,rwQCZ�"b�]/A��P���"Z��D�,�Y��\��$�@����o�f�������k�.zR�;Q��U�qN�j�����c�
����$Q����0X=W�sn0�S��[};��?���������l�0d&�D`��Ki�{����cil��u�����)	��%go�{*;��<��q����;W����Q�P� �_���|���|��;��#���niX`SxL�(��,C�	7W\��<���4�%��sZ1(z��������JO���p�^0���������nt�9��.���������/2x���$�j���3vh�V�6C3Qh���4i���M,�Kg�����1�����B���t��bo-y����JO�ZC&��j�|�����
"�V����I�����u+�[���`��~�
s����= ���`��a�o��tG�F����~���g��	<�G�6g��6Z���<��
���S�u������*�{to�����g���i��%b����������G6d	^�b�`}@��*���I(L�b�i�P�&;����)��S�\���X�V�����]�I��3�^"~��Y`��K������tH�{����^i{������9�:k��	���.�^���&8M�+��H�I�����n�������@���j,+���a���}��Ul���������L$q��	��!�i�a��$���E�=��m
�q��<6�#��������f����q���t>i���D������ wv��H��]�L�h�}���M���U������__t��g{�fx��>F=���?���^�+ho$q@���=G��:Mt�Wu����>�����!�K�>?��W4�$1��V�DBr���y���(�M:Y�=J������|�3���`v�A��2�- �|%E����L��"m���b���{�*0EM�XcB���#����-k����V��~4��^^m��f�k
��[���d���K�1U��x�~�~QE��`&��z�A��	��!����~�U �,B�����V!�Y0�'	��/q�'�B6x����%��o���/��5�P�!>�24l�F�K�U��#�����TG
���M��������zogCm���m#u���u|��h���������w�S�F���a�(J)�
�9�4]�����y)���v�d.Z��BEl6L��{��d���4VNaq46���m~�<�/�2&����3S!�-@s��^���nPe|T�y���O�a�@�������D�5>��� �W�?���DU�+�j4�TL�%p�8V��m����e���y�*��]E)D�X����A��8����_������V��8��������<�Z!��_9�A��|�.z����`
��_�y���*��;���� ����y�m�?������{!�WNR�S�����Ao(��$���wGE c��5�����qS�����q+t��^S����"_��;�����'����<H��U�Zl�����6X���o%�mB�W'��=\"t�n��N@GQ�4h�X��{V�a�M��
���?�Q�u��v�cxS��
��r����aX����������'��Y��5�^	��
���`L'�����z�=��.�:%�(5�����&��0���G�������(�sk=��;��*>���E�������9���L������������P*�#�/��Z<��n26�q.��8H��
_���L��������-M�U���������US���l��d��:���V$�=�����#23��v�j�������+�L��a��������Pi����"l��;5P~�.��`{8
�<�U���"��K(�J�M�B���{��-c���p��3� 00��~�Z�������=I�	0��5�r��,�[�9v�Z��J,�L\�������A5`�F��ST�%0�,�� @����C�z��Ix��%���%\�6`�f��e����L�;�q�^�Cl�o���&�M����(��4��<��T��WfR���F�i!�;|t��mo�:m���z�����4&��,�����4�:U���z�~d�K�`�-��$M��vp�:������e�1t�E�k��Z�vh�����v�T�N�0���E�{zX�� �`���T��us�[�H���ci�=U�|�#Ilqz�W��
��`c����� �z�+(���P�$,.���r��%E�,��W�A>��_O�t$�yj�'|���<�c�!)�����Y������s�c*)G��}����"���V-���������4�U�C�F������G|�u@R D�T�@�S�Q��:�H]n<�!	�9�a������:���g����U��������q��Gg��D�_t\y������7�.�sO����|�,��%����xu��LV���������YV
r���a�&@��+`V�:�6>�����A�x}Oz���G��{���o�&�������>��|m*�x�:?:��RB!�<^��hHh3~~�f1�)�b�MT��f>W���L	�w08�(�+��F��:��f���3f"L�sv����3w���w^o�����o���idr�lt�-�|zm����i#��$��Xi*�����V���!������7�������q[�^[�����-���gN����Ev M�;��;�!���	�N�#i���+�����*7*3 ijz  U�P3���j��)�|�Ss��I�������(�b��BU���ns�:l~VVo�,�����H�
�?]#�h@9�De�Xv�\T����)�6�s�U�rm�\{��{s������>S�����g�T�]�'�$-��ML�������cis����:�4(,r��gE�����9R��3����f�xI9�<�Q:|��<�^��7�H�8��(��$��)���j�n��x����>'��������&��x;���G
T��L%�j���JW�2�{��;���<�
������Pe{�;?F������%��7RN�X�&c(��R�?J����e��:�����X����Zs��}���,G�7�(I�;����6Bd����5���>6�������P�'����#�����hK������(���i�YU4Yj����l����L�-� E=Cx-]���X
�;��VIN��e�0��/KS�c���m�eL.����N�����L�'�$������YF`J���#��h�h��QP��GX���D��nl����J����a��,d{�� ���������a��^hM��y��#a�5����7@p���U�m�N�O�*�^>j)	{	�[p� z<�2�Df��c���{$��J�ls��(����%9��T����Y�����J�������/�J"�J4P��^���^/e��ct��q�@3��������?������z�*2Q�
�����%�p������3Tn�Ng`�9�GT%;��Y.����<�P3�$�O���i�}M�'}�+*�1D���]}V`}�C��&q�@E;�0":���e-97�1j>�	{��GXc����.�t���pYMb/�� C����>>�$���w�]�!�v�h+u=���6D-��
���E]qv�1;/��\���B#��M�G^�r�^4*E-N���P�j.<�j�<����>o�O�A��t��s� 5��Gfn������8�c*���&�%!��?�n��B\d���Y^�`�sHdl@�7M�F����P3s�X�Y��P���?0�E[V������W�!��'��qaT�S�;u�4\������H
m�~@U�80:�C�%I�������i��/���R~�>R�R��S�
���K�c��(k���C.�e��J��`'Z4�w�����
���J��[�m�32����mQ#�|�q��>E9���6TB�j#B<i\��6�;:���_>�z8A��`�k�k�7)�+Y���E�)���&��
��B{)��
��)8�et�[��>�$=��]�/�/o�Y�S .�>�����h��Y.q�R��$��}�<.t��(	�hk1�x���J}�,5,��������F�$H��x�\�I������V���XC-88}Loi^���D��O��)���&�(N>gS�%���Nh�{`�T���,7���#NX�E{X��^J�-���~`��`*��a~���NGs��E���^��!���j\px�[d�1�hh�.�p����_~�v������&��|R��+�$�v���K������*����&[����8��������S,@nHC�,�NS8�[l����w+Xm��\g�s�l=������>��n�'&��3���t�'I�w�AO�vD[�e X���Ds�������w�Q��C"���e����~
i�]P0��ea���������^�b;���<����=��;	#\!^�C���M�!���.�K��5���~����O����������b�P�z�T�hy��_��*y�8^(i��� ��D��f����Y���95�b��2���IoO�?F*�����xr|C��h������.�2+�
����I�E�%��,����Jd�"n�V)M/��nC��V�n�$'t�w�]�������m���b�=�c�?ce�Ne��P
��ME��`��T�Px��P��"�����N��D5N��T_JbD���9����PO~�������^Av�������B��tS�P�o����
��|yx�P1?9�;<Uj��s�������S
k���JE���f��:.�����\��nZ����\>��]��c���J����N���`������-��O���71��l�>)[����P�=�������]�~����'QVu�m�����,����?U��%D�����M)�����U�n�%}���.�AS'��������C�rs�x�Fa������3�X�������)������z��w��C�k,��;��mlN��a�����@����'+���:z:����v�O��������Bk�|�l��d�3����$HY�����R���.����K���N���[��P�"�D�{�9�p5�l��@G6T��(���^�80������-d�+�
�������V�t�����#bs�LXyP��*�g���tfa����I�CGaU#@F�����&�CO�����������`��_8�|�i��,�p���L�P�+����64*��,�
�T��m�G���Qx�2QUH�� �-���'�I��u�,7�SB��S4��T�������6�M�+��L��u�F���nhe��A�O�������z��yvYU,���V�wqy�@D�"��>��`��(1	��aC�?���"3
}^���m�>��"�?�v��~�97"�1�������
Z���B�B'�m2�g���'�]3,w�~�?}%+B���H/�������9��r���r�]��:�z,\l��
pL��MB�5r�MK��q��MMB+-0c@]W�aO5�z]��tz���`�g��(�����$�0sZS���������t���b��H�Ov��l�m��/�B���*
����B��DA��8���V���$:���w}w^������3��=3E(�8�'M��8�m�|?&����h:�5����,YK\gB|�����y1w�`)D#�C`��0J��jT��GHd���������a#Y�6%��c�P��p �ss
G_CEdO*�r�iF�����#���I�����
��b�*����_?�r��L,����#R`2�wfw0,�OO���W]�u�����'�"��!��='	�WRd�I8��#��5J�vj2t>�FDo+��;�����+Z�T��'�������N��(��uhV����'�7��rHV
���WD��<�3����g@�A�H�lDK�����V������s\�b1C��J��p�<O �B�kl{��6�h-W��1(R���MY�����f���������R����O��K~6@7�jl2�g�>��D���2������+���"u?K�(�g��EgG�{]s;�8?���k�j���\�K����k�T:V����$�%~���������l �H�!\���t'�l�����(Lt��ko���=""ZoS��z�Q����`����d�lI>�W��l���U4��y#�WVV>Hr�� |ct��������� �#�	&�/�{DPcTy��?���"f����f��^�����5MX�L�G����u���C�|�s,�6}q�	���+mr������u�c6v1��Nc(��^0��]��:�x��_���v�P8	3�����G�:k��/g��Z�]ma�=(@���;�P0�.�OgH���OGh6�+�]��H�<Wy;�jW��K�<�3E����W��o�
f�����v��D����Z����{��HL��#>�z
Gn��&*�wi��3���'T�B��n#N��������Z���T;�?�t�:�HL���|6K�h������Sp��n�.n�{���Ee�L��]#H�(�E0��
�j����q� V��o2��LEH�d������a`�s�Ms�]��L0���V`���(��c�K�M����"<���c��0���c�!�B	����d���c�5�,%�
JWc�S���R���������������BdE8n��O���n�+@ ���7�cV������	s�z����8���!L"�{���� �/�s%v]V1>�Z��n�O�F;�����F�[w��Ky���J���U)�:p�!�1�D*�E$+STL�_y�Y���}N�j/*X�M�)@B��H���"�
���g�C2����+1��VU8��U���8t��k}	�K��:������nf�RH"a`���[��E�?H���,
�Z���P=�����`8��	g��	�A�N?�����T�i0IT\T�*Ae�tY�T��17��l]��?��H�������T���&~P.�y�	��Q��wK8���0�Qc����;���..1uD�
�(���Yb��
�c������'|�q�&W��?y��M1���N��p��	��T�H�5����1�;;���|�]���}��^�C��Z+��h��^HDB9�r�M&���EU����pE������W}u��#��*$��l�����w��u�n�hw\��np^N���	x7K$���)�;G�;}���)��)����������/1��^k����j.���-}"%�p����H#������Z/U��8��?���o��7o2#z�N�0���A�����8	"z9���p��;|�-Z�����)�G�P3�0c)�����~��T�#LEQ������8�xnMDg+3��)�n��qc�a���lZ�-��[�~���A���	��
��BN�0�:��8�g��}
�R��Q�"nW5]�*�U��o��\��;1�M=��1|%���KO��������@�afG���3��&*��9|�X^7����������Xq�i�v�'��PaX�1�����O:�A�4�}�n���'����$�����Of�,iv	z�I�V�P�������:{i�R�;nh����V��L����.��7�V��w>,����"9>
u
��r��:5G:{��x�,k�:�������`Z^J�o�#�;�`�*,vs\6�3$�������;�=�����^�e��w�8e�$S�5$�Id,�^�ZB�Z��S�������F����W��������@{'�����z;+�P�����	���2w�LIo1�f!FU?6����bK�}E�3�x���j�$��%��E@Hr19�C[
[CD��?SCRV����{p �����vK�C|�V�{��;��������K�Tl�jC��L�o��J��+���B^�]F-8@!������93t������`!��8���>v3��&����9����B�DF#���uC�w�J�6Y�:���Zp��G<���G�����?3�	�k����0T�~��9j�A)#5g&J�R�����j��9����z�M�M����U����r/�H�<
��IJ�;�B��]�3���������W������/y]���](y��(\#����Y>W	m�����;A����0�����s�{�$O���
�_�������E5v��@Z�e*����b����1q�1�"\���
�_���e����fy'`�^
?�x���^��o8H���;��YQ�z��4"��0�p�K������r�,^�X������J��� 1���jS/v�=���1,��1`�*�/�cjbBwT�y�o������]Lp�,�3t����p���/b)<��mP�[�J��O�-����	�Kh���p3�Q��U����U��?R1�s$����R��!��]�
$f~���3t��+	
�y�
<�A�JN��"�s������g�k�W��LcgBW�`e"K��\������@�U:c�d/ur�u�o�R��z����%�=����u����%Hx�t�u��[��O'��G��&?!?�EP�D*���:%1���A�_Xs��G~V���5�M��8{��w;2��oV�u0�����w�!B�i����
�g�4�yv�[��?�HB��-�Q�0_�h$�1�#T/I��^Vd��e���m�Q���8HX�N4Y��4I9b�9d���@�~Dl��l�l�<��B#IB��a�L�RuN��=V~�7	�v�m����6��c�sS�L��~{e~)�|�� �F��.�����k��v1�[�#�V�i3:������D�@��s�L�s+
�O��:�'���}��W�������c��'�u�&>�K�����?oa?[!�-��@���f-KMt37���[,��n��2��k�i���q6C����a���Cp\���4�s�l���=��>�1�&MmNS��V'E�7�^�����|�q�x�e��=jy��;�.��d���7S>jF�T�;��b4m�^?��t�:���5��\�5Dc�9kq��L�����7�D���1�����O����CO�k��Am!�S�)h�B���[Wp��k�����Erx=]��w5e��PB�Cr�Rb
c�G���h_�kl�'Le�-&!
�<�&�*�"[j��Kd�e?#������S3��?�R��A3���t����������9�j�N��{a'���6����q����?�-�[1�V�i��^�A�:����l�X0�n'�uh��2��n�p�)Y�~'��g�?���R
������y�����SX��7�aVi�x�����U�bv���^U���ZX\�K�Y����������]�����p�i��
f=�8"J�
�N.��3������"�xJ	&!)5u_�X	��~H��]������9�G�3$���;z�<������dr�A�Z7m��"���7J$Q��Z/)��[�7�wP
X��s��9rB�P;�3�����<
UGUW!Kg[��}����1�k��z��Y�LBi�����>��%0�s�C��j�oW>�Xu�nS�Z�.xk���r�eO%����J�U�����n\�����w��P������
/���o�P�.����]|��P;okT�N�2����1����0b����%h���Y
T������.W��m�f�<�t������'�9X��H�>2�^��	E���O1^
�K��)�t|������s�gqa�����w��UL�����=���>��^�fmh�|�:q�����2����
��Q�-�^��k5�?���t>�.n
�z1V�51���;<��k�0_�m ^�7j�1��c�#v�5H���WeL�YE�����p�rAf���������d�)������!3��{Z3�2'���c�:-�Q)�
dfpy�����X�j+�q:w�8�?�jV��xn�0���pn0	9K�������-MI(��I�O2t��Y�?��mI+6v��f����/$YC6\�k|+����p G�=Lx�oX��D^3���#����P��
4vDf�ot����?=c��.���nA��<M����/Ei�u�<��O_m����u{�o��	;��3�BSda��~Bm�I(/�*!�X�5kV��.����6��FOb�F�,�m��s ����~$�N<w(�q_)DR}�����������������r
�WW�]W�:��c�c���FGx��x"��E_a�,G�����O��l��D������H�Q>�1[A�j�
<WcA�l���&@��CA-�KO ��T_r�R��6��[ae�bv����h�T@��l�RK����S��������9����V��I3u������^w��rU���#�i�d���XY�$aE����V��`�� u��jc����\�x�.��E���v���~>�4�J��/�x������<������Z�h{��s<�K�[���bv}���	[��,mc<%��/i�-�R`*q3�E�z�5����]���}�Q��1��>X%]�8w<��$O���1�%������f(����Uh�{��#�;U�?5Z(P�.�*Y^�ci�YS��b�R_N��@�	��R�{���-{�n)�)p�Q�5���X�T�ndl���3F�;3%A�.5\z,��c��*����Ngh�i���}X5�u��i��:P�D�Q14�C��������2}���[�����:���uDV�(�D��:�SN5���[y�j����M�0�9TGo.���G���n5���E�9i�Bo�!�
� �a��1�CK��$�%��9�8����8�!�K���c-�5O�{�Us�*5����*����P~�L
�Z�;'$���<������ESI�$�����������-��~��D.��)S�J�c ~��3�����k�A#<e��H��V@5�4�a�����x��@��I���=D�7j����8�t����1�����[���7��[}��Z6zI�2q�`cy���J�[�d7D�$"	����H�3�U��6W9[H�4'��Q}�I�H7W��`s�Q�i+��#ue����t���dx��Pd���%�����:��m�
k���m��8���y�4�u��j�e~	�5���&q%4��"Py%����?�[�O5{R�8��L7t�����0�U�MQ{�t���8Qk�Pm`���m7{c��a�7-V��b���u2�[�#��.�I*^F��c��?X���+����� l��@-!I��ea��pQ�H��3^a�u;�e\;���@���v��5��G|Y�V���5s�-������f�����n��
S����{\�n"���LP!���AL:�w-�,*�e����CYN\�����r�3���(F��5����d��L��wz����T_��NY
������#��
g**|SE,�
9v������T��;����w?���X�A����G>��4�q9��+D����s �{@K����`�T7�b��t����unv�@L���>��U�1B"�9V0�]�A�}8����%_�^}���t�x1����C��h�U���*k�+|%Z7T��e�~���'�'Ik�@��i��
��58'������9b0z������m�n�����:b�,�?��2n/��?f9�g����T��N��.Q	�\n��7W@zL�K{����bl�lhX�-
�����7���Q�$���ag����q�*p~��r��v��OM%C����Uh������A�H�q�5����3\j�
8��9^?%08�b��e^;���2�1�n���@W=*������m��N�N�Lm�7����0P;b���I�#"��-0�����c�+R��{�H�Rl5h�d*����)+/�	��`���\�Rvm|�n{g_��_� ��B��#����v]��'}�a$�Z���u�e�Zt4���Q������qt��e�+mC�+�x v��2m1��J"i---������E�}��U�_���=�$������En�qp��6l��&�O`�&����������Ig������k�i������9D�lu�_@'�g�*�;���4�g�m.M���PuN�ck{�� 5P��a�lF^##�4]�nM+<H��#6K��Ix	�����=��6�
�J����-
������
��I��/)N~�����Y����(�;�>����e��4�
�?��Hr��	�M�mR����0���+A4��o C!j�	��{�&ak#S���O=��1����h��	2�3L=y�S�U� GG�t%
g��ZQ|�Q�{!+�^�p������Y
B�����3�q�x�m+���]L���������_�Q_�I�4Z� �%[��SDS��]�|����[��P��377����8r��~��l�8����q5_��&O�[�eA�f9�����A
��|�]��su�B�c(<������ ����=s�1N�Db��5�����e/����;T��h��b��$1�y�<�����-�����m�Z���\����{
�����|������o:�f�@���;�Qy�dw��&����)��t
��)z
L
�F-O8X����2Ej��L���*�����c��DEGq���7�_��z�T@��<����o����3	d�4A�Ar&���i>o��E�2s
M*�o����=?�����eJ�3u����Z���fzI��T#�b��`}"*��#��d��?c_�F	�(+y�:�3�����r�e�-��������h�����"�8��2��H�v��X�4�$�N��6���X��d���2)]�/��>u�������������s���d��O8-�����
�]�w(&�iA
���<@��AT
6��v�IlP_K�����v^���;����FM�f��fX���*�����#%�i�A�A`\�����
�f�'����p^2P�^c^��#�m	��v+�������|������0����|�i�dB��%����E��'1�F�y8w����.m�y4�����T���-L�+O{��.�61�~���vs��9��P����
.�V8mG[����cQ�%�=Q	j�!�Gc��m����k�����i�=u#����h9&��	JoYJ�:��A����&�k�[��u����������7�t��j&��P-�gx��u|�FX�e���-�,��hh��&JT�������J����L�pRB~$���D��:������Z�G������I#��E�I2 ���j�ty���*J���x�]�yh�"������A������=����s�����|�!�������K�������w;�[�%�h��~��e $��+�MjN��Vh"Tk�	������pB�3`O-BWE�>3[g����9������O��n��r%4�`�;�-R��_�PU�VC[�r����s_1hp`�:�n���1����z��)���/��3r.�G���������6�?�%!C/�]�
��!b<�S�G��@�`~�q�(��j��bV�'s0
BXU�"O���L���J4����p�)K����X���d���g@f�F\E|�C�E7i�I*��d��dt���0�Y�&~�
���M�6����@���gAJz���x���3�'�{_��1�?)f���)��w�/��0-����,���;#!�t��ux�<���m�V	��K�����E}�	f`J�6g)���C7����rg��
��Z��)OI��R�q	�+�t���b�;w+k�T�mVO��z�KF���N)�-�Q���Y$����b������T;���s���R�T��_�����a�;h�?��,�
����MR��c�8Z��d��.��#�3�����h����������Z^�,l�����l�����_��-S

��������HBZ�%d�.�(P����z�fN�y R���J.������i�����pBN�ON'j54X��B�fK\�[��s�OfG���H��.fbO���
R�\��	���D[�����>2���|�S�����E-�n�1����z�-��y��U��R��QmV�������jK�3� ����yrJ��d�����`�v���`�'$����&���UEX23~�-�� ����:p{�P������4���X�h���cwfWn����d�vl��!�11�,�-�(����F0�����0&g5�d�2V=�D���T�@AWR#��$�[a���O�&�k\�o�Kn��g=M��LU�c'�� ����4�#�wV(��xQ ��\��<�0v����qbb��T���������)f/U1�h-E���Q7��E�)�y�[Eq>�[@��#C�nR;�	��E�����1���0���@t���X@�����'�T������������ER�K����"C]f����h��k���Btr�{%�P�����\�]���'�������N���7+�}v�b��7�10 8.��������Ve�Q�!M���(\���������mq��'�*I��mQ��kZ(-�{�s���T�3~�`o!=�j�pa��F��Q���lu����6�����W
�h* ���$?B��3]��F�@�3]"�5u�Ii+i�(�����m�W��F�B���$?(����W�W$����b���A���>�Q���
i��N�?^�?�-�b���[a�DP����t�K;��}��LS���Iu��jp	YI�H���]��^o1��\���7H�K���W��������������W]9���" z�~|�[Pp�
�
l����[\��D����c��5B��m�<{x*�|lu���a�&=�5�4p@��t����t%���$��c>��H,C�1
y`�p:���j)`������.BFN���[���& �#�(5A���o�����kK���8)�@�I���� �~]Jk��F�|kd%���n��x�����-t�
|�e����+�����^i��]���)������G�|�\���$!�\;a�|��v� �0l``���f����������',�?R��{8k�nH�M������O$�t��������!X�t�h����g��:[H���>x�V��s�d��� �4�
#���SM�8��}��1P!7pXJ�8y|�2S�s��������/�[��b�U�8�DaB�Uv�`�EW�i}��)�����2�u��A~"��{���eB�Bp�:��u������
��~�v�,j+�C{��&�t�I��?
U^��\=�g|����:>��kMV��?��������
������}�]�Yi@����5�0�����	��j'(���y���E������Q5�A��c�7�o��/����u��X���a�
���_Vou�������n�j�g%�d������M�/�1����A���i�"����d�W1q���Hd�9nm�3�2��Ys0��.~�����o�6���"]�X�R�+�{\PU�u���r�.��^+o����E NBz�����RI�����Q��;��W�!���,���T��"O�m�V�w�y����Hn"jC�aL^|u�K�}/c�Adr�06L��8N��k��%�<$H��1y+���)&�q ����	zc=���U�(�XT�H�uT?���I��"�����K��N�RT�hT���Z�h��Yw���i�����e7�na=F������f;�'��Q�a����B���r�
:�xT�2�4�93��4I!�5�{��+w�SK[]��h�4b;���vs�����{}t���:��f�"���T�C�#��P�&_�3��H�)"T_�Q��+�hy0��T�^����h��`��$L�h�60dM�&��/�9O8$� xv�VQ����6��&����4
G�-��BsI�j�m	��_�I�$UiO��-N�o�p�?����D���������bh��0��@F/r�j�Fj!�����������L��;-���u^�����mR�����a���s��V�����:���QT.��d����t��m�$��U ��UC�8`�6��\�O��\3���g����^�.������
������o���x����!E�����MS��K����!��d7���4����������R�(���@E�P��%���|�M���|����j���.2�����^5�:y�$?E���c0.�*������Nb��r��iT��n���K�K�0�)��(�i�~�@4Q�F�����t���
8� H[��K��EGo��<�����Z�S���B�vd���y�������K�T0tG``]�xQ�������}���L��v�����9_��������J�Lk�&Co&��4�9s���	�����������\�bL��9/�4J?��k�F���2G�<e.��Wj2�����}�;�L��	�|1���@�����-�����}��RKR���
���5�Gy;a\s��UWC h���lA�f��J?��q��?5�X���Z�����fR�?�������xPJ�L�l����K���V����I��8��[1��S�3����V��b)���������e�'�|�K	�8���*����%�	T�a:x+2���;�V0����`@4�:���{;Li��o@vz��������T���7�i5`�C��5��pau���>h[$��_��P}2���fT��}n^�h�7��}�c�R�H�o<�v
A����1{�f����7����q��~��`�6�l"�]��x��*9C8�����X���B�p��,�GOw
j�Z�A�+�^�T,�fwu��,�]3�0m���
�4]Ew���f"�s�'X��O�g�M��-����e��/��������	a�zA���c*�5�+�����8��qva�yu�,_*:A�C	�������>��Lf����������?U�7�{6���Q�u$K��j%��/]���W���b�'{��iU���j�C��H�������@�1�
�L���w�:����da����8�6�O��������X���J��r.����Cp?dX?DH)���S~�!sp?�#��G�OQ���*���-J)�J�Yt<
�pl^������W��������M�|����K��*.��\	�T������c�$;���m���D�J1_VAZjty���M\��68�����`�Ch�_�Y���������[�/D_<�/����0�b@`Hl��A#�����<���.e`��nng��_z�O�S%�����5�bO4�I�u�bQ���b�a���H���>8s��������O��f����]^;-~�]:Ml,�L��.�
e�~,|�l��A�6ZJ@=<��xt<g$�5s�������\�q�}����He��d�5|c)4L�����(��������5�������~��YJ���m�g)��^rCw
�P��A�JP������,�����o���
U�T������?S)�����A��j�]���n1����x��������d&l?����@m���@�K�&A4���*�����S�� h��'Ne��wmL���%�������0��Kbk�{���M���h4��)��<����oZb���7�;V�"l��F3/��,�-�U���9u�aY2�heU��T���d�������+(�6:��/����P�}7���El���|�i.��������FCq�*|�af���	�����9)�7�3���PT:��;PmQQ�p��YEk
�+k��H�N����wU��iW�r�dU������������'�l�Ha�&3��\�?����W�>�:I�`���Fq'�.�zr�=��HM������n��f���k��h�WD���|`�,��j;��a	��#9�>��=wJ��jZ��3r��C.������L���./��E�g�|xH��E�Z�J��G�����?��]���|bn����s�L�F�);� �~�Y���v*|��������u�\���������^�G��T2����:�n���g]��|
i�������H���@��� ����8/�w��	��a# ��
\��ESpg_index_adviser-HEAD_20070116-v26.patch
=���6� 
#19Bruce Momjian
bruce@momjian.us
In reply to: Gurjeet Singh (#18)
Re: [PATCHES] [HACKERS] [Fwd: Index Advisor]

I can't read a 7z file on my end. Please email me the file and I will
put it at a URL.

---------------------------------------------------------------------------

Gurjeet Singh wrote:

On 1/15/07, Andrew Dunstan <andrew@dunslane.net> wrote:

Gurjeet Singh wrote:

1) pg_post_planner_plugin-REL8_2_STABLE-v1.patch.gz
2) pg_index_adviser-REL8_2_STABLE-v26.patch.gz

Why are these patches against 8.2 rather than CVS HEAD? Is this not a
new feature? We never backport new features to the stable branches -
that's what makes them stable ;-)

Please find attached the patches ported to HEAD as of now. The patch to the
contrib modules is the same as before; the version number has been kept but
branch designator has been changed.

1) pg_post_planner_plugin-HEAD_20070116-v2.patch.gz
2) pg_index_adviser-HEAD_20070116-v26.7z

Best regards,

--
gurjeet[.singh]@EnterpriseDB.com
singh.gurjeet@{ gmail | hotmail | yahoo }.com

[ Attachment, skipping... ]

[ Attachment, skipping... ]

---------------------------(end of broadcast)---------------------------
TIP 3: Have you checked our extensive FAQ?

http://www.postgresql.org/docs/faq

--
Bruce Momjian bruce@momjian.us
EnterpriseDB http://www.enterprisedb.com

+ If your life is a hard drive, Christ can be your backup. +

#20Gurjeet Singh
singh.gurjeet@gmail.com
In reply to: Bruce Momjian (#19)
2 attachment(s)
Re: [PATCHES] [HACKERS] [Fwd: Index Advisor]

On 1/20/07, Bruce Momjian <bruce@momjian.us> wrote:

I can't read a 7z file on my end. Please email me the file and I will
put it at a URL.

---------------------------------------------------------------------------

Gurjeet Singh wrote:

Please find attached the patches ported to HEAD as of now. The patch to

the

contrib modules is the same as before; the version number has been kept

but

branch designator has been changed.

1) pg_post_planner_plugin-HEAD_20070116-v2.patch.gz
2) pg_index_adviser-HEAD_20070116-v26.7z

I am attaching the .gz versions of both the patches, and CC'ing to -patches
also. If it doesn't turn up on -patches even this time, then please do the
needful.

Thanks and best regards,

--
gurjeet[.singh]@EnterpriseDB.com
singh.gurjeet@{ gmail | hotmail | yahoo }.com

Attachments:

pg_post_planner_plugin-HEAD_20070116-v2.patch.gzapplication/x-gzip; name=pg_post_planner_plugin-HEAD_20070116-v2.patch.gzDownload
pg_index_adviser-HEAD_20070116-v26.patch.gzapplication/x-gzip; name=pg_index_adviser-HEAD_20070116-v26.patch.gzDownload
#21Bruce Momjian
bruce@momjian.us
In reply to: Gurjeet Singh (#20)
Re: [pgsql-patches] [HACKERS] [Fwd: Index Advisor]

Your patch has been added to the PostgreSQL unapplied patches list at:

http://momjian.postgresql.org/cgi-bin/pgpatches

It will be applied as soon as one of the PostgreSQL committers reviews
and approves it.

---------------------------------------------------------------------------

Gurjeet Singh wrote:

On 1/20/07, Bruce Momjian <bruce@momjian.us> wrote:

I can't read a 7z file on my end. Please email me the file and I will
put it at a URL.

---------------------------------------------------------------------------

Gurjeet Singh wrote:

Please find attached the patches ported to HEAD as of now. The patch to

the

contrib modules is the same as before; the version number has been kept

but

branch designator has been changed.

1) pg_post_planner_plugin-HEAD_20070116-v2.patch.gz
2) pg_index_adviser-HEAD_20070116-v26.7z

I am attaching the .gz versions of both the patches, and CC'ing to -patches
also. If it doesn't turn up on -patches even this time, then please do the
needful.

Thanks and best regards,

--
gurjeet[.singh]@EnterpriseDB.com
singh.gurjeet@{ gmail | hotmail | yahoo }.com

[ Attachment, skipping... ]

[ Attachment, skipping... ]

---------------------------(end of broadcast)---------------------------
TIP 2: Don't 'kill -9' the postmaster

--
Bruce Momjian bruce@momjian.us
EnterpriseDB http://www.enterprisedb.com

+ If your life is a hard drive, Christ can be your backup. +

#22Bruce Momjian
bruce@momjian.us
In reply to: Gurjeet Singh (#20)
Re: [pgsql-patches] [PATCHES] [Fwd: Index Advisor]

I need someone to review this patch to make sure the API used is
logical. You can do that by reading the README file in the patch. To
me, the procedure seems overly complicated, and too restrictive.

The patch is in the patches queue.

---------------------------------------------------------------------------

Gurjeet Singh wrote:

On 1/20/07, Bruce Momjian <bruce@momjian.us> wrote:

I can't read a 7z file on my end. Please email me the file and I will
put it at a URL.

---------------------------------------------------------------------------

Gurjeet Singh wrote:

Please find attached the patches ported to HEAD as of now. The patch to

the

contrib modules is the same as before; the version number has been kept

but

branch designator has been changed.

1) pg_post_planner_plugin-HEAD_20070116-v2.patch.gz
2) pg_index_adviser-HEAD_20070116-v26.7z

I am attaching the .gz versions of both the patches, and CC'ing to -patches
also. If it doesn't turn up on -patches even this time, then please do the
needful.

Thanks and best regards,

--
gurjeet[.singh]@EnterpriseDB.com
singh.gurjeet@{ gmail | hotmail | yahoo }.com

[ Attachment, skipping... ]

[ Attachment, skipping... ]

---------------------------(end of broadcast)---------------------------
TIP 2: Don't 'kill -9' the postmaster

--
Bruce Momjian <bruce@momjian.us> http://momjian.us
EnterpriseDB http://www.enterprisedb.com

+ If your life is a hard drive, Christ can be your backup. +

#23Tom Lane
tgl@sss.pgh.pa.us
In reply to: Gurjeet Singh (#13)

"Gurjeet Singh" <singh.gurjeet@gmail.com> writes:

Please find attached the latest version of the patch. It applies cleanly on
REL8_2_STABLE.

The interface to the planner in this seems rather brute-force. To run
a plan involving a hypothetical index, you have to make a bunch of
catalog entries, run the planner, and then roll back the transaction
to get rid of the entries. Slow, ugly, and you still need another kluge
to keep the planner from believing the index has zero size.

It strikes me that there is a better way to do it, because 99% of the
planner does not look at the system catalog entries --- all it cares
about is the IndexOptInfo structs set up by plancat.c. So there's not
really any need to make catalog entries at all AFAICS. Rather, the
best thing would be a plugin hook at the end of get_relation_info()
that would have a chance to editorialize on the constructed IndexOptInfo
list (and maybe other properties of the RelOptInfo too). You could
remove existing index entries or insert new ones.

I'm dissatisfied with the hard-wired hook into planner() also.
That doesn't provide any extensibility nor allow the index adviser
to be implemented as a loadable plugin. I'm inclined to think it's
in the wrong place anyway; you've got thrashing around there to avoid
recursion but it's very fragile. Having to dump the results into the
postmaster log isn't a nice user API either. Perhaps what would be
better is a hook in EXPLAIN to call a plugin that can add more lines to
EXPLAIN's output, and is passed the original query and plan so that
it can re-call the planner with hypothetical indexes prepared for
insertion by the other hook.

regards, tom lane

#24Gurjeet Singh
singh.gurjeet@gmail.com
In reply to: Tom Lane (#23)

Hi Tom,

The original patch was submitted by Kai Sattler, and we (at EDB) spent a
lot of time improving it, making it as seamless and as user-friendly as
possible. As is evident from the version number of the patch (v26), it has
gone through a lot of iterations, and was available to the community for
review and discussion (and discuss they did; they asked for a few things and
those were added/improved).

<quote Bruce>
I am thinking the API needs to be simpified, perhaps by removing the system
table and having the recommendations just logged to the server logs.
</quote>

<quote Kenneth>
This means that this very useful information (in log files) would need to be
passed through an intermediary or another tool developed to allow access to
this information. I think that having this available from a table would be
very nice.
</quote>

In the initial submission, the feature was a big piece of code embedded
inside the backend. It required a system table, did not show the new plan,
actually created index physically before re planning, and could not advise
for a running application (everything had to be manually EXPLAINed).

I read through the thread titled "Index Tuning Features" that first
discussed the idea of an Index adviser for PG, and this patch also meets
quite a few requirements raised there.

Here are a few of the good things about this patch as of now:

.) Loadable plugin. Develop your own plugin to do nifty things with the plan
generated by the planner. Just as the debugger is implemented; if no
plugin... no work to do...

.) No syntax change. Run your queries as they are and get the advice in the
advise_index table (or set client_min_messages = LOG, to see the improved
plan on the screen also, if any).

.) Can recommend indexes even for the generated dynamic-queries, that are
hard to regenerate in a dry-run.

.) Can recommend indexes for SQL being executed through plpgsql (or any PL)
(again, hard to regenerate the parameterized queries by hand), and the the
advice is available in the advise_index table.

.) The adviser dumps it's advice in a table named advise_index. That can be
a user table, or a view with INSERT rule, or anything else; it should just
be an INSERTable object, accessible to the executing user (as opposed to a
system table required by the original implementation, and hence a need for
initdb).

.) No need to modify the application in any way; just set PGOPTIONS
environment variable properly before executing the appln., and run it as
usual... you have the advice generated for you.

.) No need for DBA (or the appln. writer) to feed anything to the planner in
any way; the process of recommendation is fully automated (this may change
if another plugin implimentation requires the stats in some user table).

.) Does recommend multi-column indexes. Does not make a set of each
fathomable combination of table columns to develop multi-column indexes
(hence avoiding a combinatorial explosion of time-space requirements); it
uses the columns used in the query to generate multi-column indexes.

.) The indexes are not created on disk; the index-tuple-size calculation
function does a very good job of estimating the size of the virtual index.

.) The changes to the catalog are just for the backend running under the
adviser, no one else can see those virtual indexes (as opposed to the
earlier implementation where the indexes were created on-disk, and available
to all the backends in the planning phase).

So, with one hook (no GUC variables!), we get all these cool things. I
tried very hard to eliminate that one leftover kludge, but couldn't (we have
two options here, and they are enclosed in '#if GLOBAL_CAND_LIST ... #else'
parts of the code; left upto the committers to decide which one we need!).

Another kludge that I had to add was the SPI_connect() and SPI_finish()
frame around the savepoint handling, since the RollbackToSavepoint in
xact.cassumes that only a PL/* module must be using the savepoint
infrastucture
(this was discussed on -hackers).

The interface etc. may not be beautiful, but it isn't ugly either! It is
a lot better than manually creating pg_index records and inserting them into
cache; we use index_create() API to create the index (build is deferred),
and then 'rollback to savepoint' to undo those changes when the advisor is
done. index_create() causes pg_depends entries too, so a 'RB to SP' is far
much safer than going and deleting cache records manually.

I hope you would agree that we need two passes of planner, one without
v-indexes and the other with v-indexes, for the backend to compare the
costs, and recommend indexes only if the second plan turned out to be
cheaper. If we implement the way you have suggested, then we will need one
hook at the end of get_relation_info(), one in EXPLAIN code, and yet
another, someplace after planner is finished, to do the comparison of the
two plans and recommend only those indexes that were considered to be useful
by the planner. (A total of three places to touch). And then we'll need some
extra code in the core to generate the advisory (in some form; maybe into a
user table, or as part of the EXPLAIN output; but remember, not every query
can be EXPLAINed!).

Then, we also need logic in all these places to differentiate the normal
run from the v-index enabled run, else we'll end up generating IndexOptInfo
everytime we enter get_relation_info(). And this differentiation needs to be
done in EXPLAIN code too.

Also, although the whole plan-tree is available in get_relation_info(),
but it wouldn't be the right place to scan other tables, for eg., for
generating JOIN-INDEXes or materializing some intermediate joins. (sometime
in the future we may support them!).

If we don't run the planner twice, then the developer will have to run
it manually twice, and compare the costs manually (with and without
v-indexes); virtually impossible for lage applications and introduction of
another human-error possibility.

(I just noticed that you quoted the line from the mail where I submitted
version 23 of the patch, the plugin architecture wasn't utilized; please
refer to the mail that has 'pg_post_planner_plugin-HEAD_20070116-v2.patch.gz'
and 'pg_index_adviser-HEAD_20070116-v26.patch.gz' as attachments; dated
20.Jan.07)

About the right place to call the plugin... calling it immediately after
the planner is done with normal planning phase seems to be right. At this
point planner is done and no other part of the backend yet knows about what
plan is generated; so the plugin has a chance to modify the plan in place
and do it's trickery in a completely isolated time-space. (maybe we can pass
a reference to the plan pointer, and let the plugin replace the whole plan
itself using this reference!)

I surely agree that it is time-consuming (less efficient), but it is
completely automated, with the least of human interference or application
change required; hence, on the whole, it must be a million times faster than
a human sitting down, extracting every query - prepending EXPLAIN to it -
and executing it - twice - comparing the resulting cost!!!

Best regards,
--
gurjeet[.singh]@EnterpriseDB.com
singh.gurjeet@{ gmail | hotmail | yahoo }.com

17°29'34.37"N 78°30'59.76"E - Hyderabad
18°32'57.25"N 73°56'25.42"E - Pune *

Show quoted text

On 4/6/07, Tom Lane <tgl@sss.pgh.pa.us> wrote:

"Gurjeet Singh" <singh.gurjeet@gmail.com> writes:

Please find attached the latest version of the patch. It applies cleanly

on

REL8_2_STABLE.

The interface to the planner in this seems rather brute-force. To run
a plan involving a hypothetical index, you have to make a bunch of
catalog entries, run the planner, and then roll back the transaction
to get rid of the entries. Slow, ugly, and you still need another kluge
to keep the planner from believing the index has zero size.

It strikes me that there is a better way to do it, because 99% of the
planner does not look at the system catalog entries --- all it cares
about is the IndexOptInfo structs set up by plancat.c. So there's not
really any need to make catalog entries at all AFAICS. Rather, the
best thing would be a plugin hook at the end of get_relation_info()
that would have a chance to editorialize on the constructed IndexOptInfo
list (and maybe other properties of the RelOptInfo too). You could
remove existing index entries or insert new ones.

I'm dissatisfied with the hard-wired hook into planner() also.
That doesn't provide any extensibility nor allow the index adviser
to be implemented as a loadable plugin. I'm inclined to think it's
in the wrong place anyway; you've got thrashing around there to avoid
recursion but it's very fragile. Having to dump the results into the
postmaster log isn't a nice user API either. Perhaps what would be
better is a hook in EXPLAIN to call a plugin that can add more lines to
EXPLAIN's output, and is passed the original query and plan so that
it can re-call the planner with hypothetical indexes prepared for
insertion by the other hook.

regards, tom lane

#25Tom Lane
tgl@sss.pgh.pa.us
In reply to: Gurjeet Singh (#24)
Re: [mux@FreeBSD.org: Re: Anyone interested in improving postgresql scaling?]

Kris Kennaway <kris@obsecurity.org> forwards:

Yes but there are still a lot of wakeups to be avoided in the current
System V semaphore code. More specifically, not only do we wakeup all
the processes waiting on a single semaphore everytime something changes,
but we also wakeup all processes waiting on *any* of the semaphore in
the semaphore *set*, whatever the reason we're sleeping.

Ohhhh ... *that's* the problem. Ugh. Although we have a separate
semaphore for each PG backend, they're grouped into semaphore sets
(I think 16 active semaphores per set). So a wakeup intended for one
process would uselessly send up to 15 others through the semop code.

The only thing we could do to fix that from our end would be to use
a smaller sema-set size on *BSD platforms. Is the overhead per sema set
small enough to make this a sane thing to do? Will we be likely to
run into system limits on the number of sets?

regards, tom lane

#26Maxime Henrion
mux@FreeBSD.org
In reply to: Tom Lane (#25)
Re: [mux@FreeBSD.org: Re: Anyone interested in improving postgresql scaling?]

Tom Lane wrote:

Kris Kennaway <kris@obsecurity.org> forwards:

Yes but there are still a lot of wakeups to be avoided in the current
System V semaphore code. More specifically, not only do we wakeup all
the processes waiting on a single semaphore everytime something changes,
but we also wakeup all processes waiting on *any* of the semaphore in
the semaphore *set*, whatever the reason we're sleeping.

Thanks for forwarding my mail, Kris! To Tom: if you can get my mails
to reach pgsql-hackers@ somehow that would be just great :-).

Ohhhh ... *that's* the problem. Ugh. Although we have a separate
semaphore for each PG backend, they're grouped into semaphore sets
(I think 16 active semaphores per set). So a wakeup intended for one
process would uselessly send up to 15 others through the semop code.

Yes.

The only thing we could do to fix that from our end would be to use
a smaller sema-set size on *BSD platforms. Is the overhead per sema set
small enough to make this a sane thing to do? Will we be likely to
run into system limits on the number of sets?

I'm not familiar enough with the PostgreSQL code to know what impact
such a change could have, but since the problem is clearly on our
side here, I would advise against doing changes in PostgreSQL that
are likely to complicate the code for little gain. We still didn't
even fully measure how much the useless wakups cost us since we're
running into other contention problems with my patch that removes
those. And, as you point out, there are complications ensuing with
respect to system limits (we already ask users to bump them when
they install PostgreSQL).

I'm looking forward fixing/rewriting all of the FreeBSD sysV semaphore
code and am just waiting for a green light from my boss before doing
so. Maybe someone will beat me to it, since it isn't such a big
change.

I think the high number of setproctitle() calls are more problematic
to us at the moment, Kris can comment on that.

Cheers,
Maxime

#27Tom Lane
tgl@sss.pgh.pa.us
In reply to: Maxime Henrion (#26)
Re: [mux@FreeBSD.org: Re: Anyone interested in improving postgresql scaling?]

Maxime Henrion <mux@freebsd.org> writes:

Thanks for forwarding my mail, Kris! To Tom: if you can get my mails
to reach pgsql-hackers@ somehow that would be just great :-).

They'll get approved eventually, just like mine to the BSD lists will
get approved eventually ;-)

The only thing we could do to fix that from our end would be to use
a smaller sema-set size on *BSD platforms. Is the overhead per sema set
small enough to make this a sane thing to do? Will we be likely to
run into system limits on the number of sets?

I'm not familiar enough with the PostgreSQL code to know what impact
such a change could have, but since the problem is clearly on our
side here, I would advise against doing changes in PostgreSQL that
are likely to complicate the code for little gain. We still didn't
even fully measure how much the useless wakups cost us since we're
running into other contention problems with my patch that removes
those. And, as you point out, there are complications ensuing with
respect to system limits (we already ask users to bump them when
they install PostgreSQL).

OK, it was just an off-the-cuff idea.

I think the high number of setproctitle() calls are more problematic
to us at the moment, Kris can comment on that.

As of PG 8.2 it is possible to turn those off. I don't think there's a
lot of enthusiasm for turning them off by default ... at least not yet.
But it might make sense to point out in the PG documentation that
update_process_title is particularly costly on platforms X, Y, and Z.
Do you know if this issue affects all the BSDen equally?

regards, tom lane

#28Kris Kennaway
kris@obsecurity.org
In reply to: Tom Lane (#27)
Re: [mux@FreeBSD.org: Re: Anyone interested in improving postgresql scaling?]

On Tue, Apr 10, 2007 at 08:23:36PM -0400, Tom Lane wrote:

I think the high number of setproctitle() calls are more problematic
to us at the moment, Kris can comment on that.

As of PG 8.2 it is possible to turn those off. I don't think there's a
lot of enthusiasm for turning them off by default ... at least not yet.
But it might make sense to point out in the PG documentation that
update_process_title is particularly costly on platforms X, Y, and Z.
Do you know if this issue affects all the BSDen equally?

It will likely affect them to some extent. In fact the only platforms
it will not hurt on are those which have already jumped through
special hoops to make setproctitle() super-cheap. I presume Linux is
in this category but don't know which others are, if any.

Since we've basically had it handed to us that calling setproctitle()
thousands of times per second is something that real applications now
do, we're pretty much forced to work on making it cheaper. Hopefully
this is something that will be addressed over the next few months
(we're going to look at adding support for pages shared between libc
and kernel so this kind of thing can be done without requiring a
syscall).

However this won't help all the existing systems out there (including
other affected OSes), so it would be great if you guys could meet us
half way and find a way to make postgresql rate-limit these calls by
default to some suitable compromise rate, like once/second or
whatever.

Kris

#29Mark Kirkwood
markir@paradise.net.nz
In reply to: Tom Lane (#27)
Re: [mux@FreeBSD.org: Re: Anyone interested in improving postgresql scaling?]

Tom Lane wrote:

I think the high number of setproctitle() calls are more problematic
to us at the moment, Kris can comment on that.

As of PG 8.2 it is possible to turn those off. I don't think there's a
lot of enthusiasm for turning them off by default ... at least not yet.
But it might make sense to point out in the PG documentation that
update_process_title is particularly costly on platforms X, Y, and Z.
Do you know if this issue affects all the BSDen equally?

Might be good to turn off by default for the 8.2+ Postgresql versions in
the FreeBSD ports tree (looks like postgresql.conf.sample is being
patched anyway, so pretty easy to amend).

Cheers

Mark

#30Kris Kennaway
kris@obsecurity.org
In reply to: Mark Kirkwood (#29)
Re: [mux@FreeBSD.org: Re: Anyone interested in improving postgresql scaling?]

On Wed, Apr 11, 2007 at 12:50:06PM +1200, Mark Kirkwood wrote:

Tom Lane wrote:

I think the high number of setproctitle() calls are more problematic
to us at the moment, Kris can comment on that.

As of PG 8.2 it is possible to turn those off. I don't think there's a
lot of enthusiasm for turning them off by default ... at least not yet.
But it might make sense to point out in the PG documentation that
update_process_title is particularly costly on platforms X, Y, and Z.
Do you know if this issue affects all the BSDen equally?

Might be good to turn off by default for the 8.2+ Postgresql versions in
the FreeBSD ports tree (looks like postgresql.conf.sample is being
patched anyway, so pretty easy to amend).

Yeah, we might end up doing this, but I consider it a workaround.

Kris

#31Tom Lane
tgl@sss.pgh.pa.us
In reply to: Kris Kennaway (#28)
Re: [mux@FreeBSD.org: Re: Anyone interested in improving postgresql scaling?]

Kris Kennaway <kris@obsecurity.org> writes:

I think the high number of setproctitle() calls are more problematic
to us at the moment, Kris can comment on that.

Since we've basically had it handed to us that calling setproctitle()
thousands of times per second is something that real applications now
do, we're pretty much forced to work on making it cheaper.
...
However this won't help all the existing systems out there (including
other affected OSes), so it would be great if you guys could meet us
half way and find a way to make postgresql rate-limit these calls by
default to some suitable compromise rate, like once/second or
whatever.

Well, the thing is, we've pretty much had it handed to us that
current-command indicators that aren't up to date are not very useful.
So rate-limited updates strike me as a useless compromise. We have
the "real" solution (status advertised in PG's shared memory) already,
so the question in my mind is just how fast DBAs will wish to transition
to looking at "select * from pg_stat_activity" instead of looking at
"ps auxww".

I don't see anything wrong at all with making update_process_title
default to "off" in BSD-specific packaging of Postgres. It's a harder
sell to turn it off by default everywhere, because of all them Linux
users for whom that's just taking away a convenient status viewing
method. I think we might get there eventually, but we need a decent
interval to wean people away from the old method.

[ Disclaimer: I work for Red Hat, so am unlikely to favor doing anything
that is a loss on Linux. But I do use and like other platforms too;
just don't happen to have any BSD in-house currently, unless you're
willing to count Darwin as BSD. ]

regards, tom lane

#32Kris Kennaway
kris@obsecurity.org
In reply to: Tom Lane (#31)
Re: [mux@FreeBSD.org: Re: Anyone interested in improving postgresql scaling?]

On Wed, Apr 11, 2007 at 01:03:50AM -0400, Tom Lane wrote:

Kris Kennaway <kris@obsecurity.org> writes:

I think the high number of setproctitle() calls are more problematic
to us at the moment, Kris can comment on that.

Since we've basically had it handed to us that calling setproctitle()
thousands of times per second is something that real applications now
do, we're pretty much forced to work on making it cheaper.
...
However this won't help all the existing systems out there (including
other affected OSes), so it would be great if you guys could meet us
half way and find a way to make postgresql rate-limit these calls by
default to some suitable compromise rate, like once/second or
whatever.

Well, the thing is, we've pretty much had it handed to us that
current-command indicators that aren't up to date are not very useful.
So rate-limited updates strike me as a useless compromise. We have
the "real" solution (status advertised in PG's shared memory) already,
so the question in my mind is just how fast DBAs will wish to transition
to looking at "select * from pg_stat_activity" instead of looking at
"ps auxww".

I don't get your argument - ps auxww is never going to be 100%
up-to-date because during the time the command is running the status
may change. So we already know that stats being a fraction of a
second out of date are acceptable to users, because that's what may
happen when you run ps in the present model. So you can use this to
get away with limiting updates to e.g. 10/second and in practise no
users will notice the difference.

Updating thousands of times a second just on the off chance that an
admin may one day run ps is completely inefficient (and has a huge
overhead on non-Linux systems, so it's demonstrably not a sensible way
to do things), and to the extent that there is a problem to be solved
it isn't even really solving it anyway.

If there really are users who find 10 proctitle updates/second an
unacceptably low update rate, then tune for the default case and
provide an option to allow them to override the rate limit to whatever
update rate they find appropriate.

Kris

#33Tom Lane
tgl@sss.pgh.pa.us
In reply to: Kris Kennaway (#32)
Re: [mux@FreeBSD.org: Re: Anyone interested in improving postgresql scaling?]

Kris Kennaway <kris@obsecurity.org> writes:

On Wed, Apr 11, 2007 at 01:03:50AM -0400, Tom Lane wrote:

Well, the thing is, we've pretty much had it handed to us that
current-command indicators that aren't up to date are not very useful.
So rate-limited updates strike me as a useless compromise.

I don't get your argument - ps auxww is never going to be 100%
up-to-date because during the time the command is running the status
may change.

Of course. But we have already done the update-once-every-half-second
bit --- that was how pg_stat_activity used to work --- and our users
made clear that it's not good enough. So I don't see us expending
significant effort to convert the setproctitle code path to that
approach. The clear way of the future for expensive-setproctitle
platforms is just to turn it off entirely and rely on the new
pg_stat_activity implementation.

regards, tom lane

#34Gregory Stark
stark@enterprisedb.com
In reply to: Kris Kennaway (#32)
Re: [mux@FreeBSD.org: Re: Anyone interested in improving postgresql scaling?]

"Kris Kennaway" <kris@obsecurity.org> writes:

If there really are users who find 10 proctitle updates/second an
unacceptably low update rate, then tune for the default case and
provide an option to allow them to override the rate limit to whatever
update rate they find appropriate.

If you rate limit the naive way you would end up with info that's arbitrarily
old and out of date. To get something that's guaranteed not to be older than
some maximum age we would have to start with setting timers and setting the
proctitle in a signal handler which would be much more complex than what I
think you're imagining.

--
Gregory Stark
EnterpriseDB http://www.enterprisedb.com

#35Bruce Momjian
bruce@momjian.us
In reply to: Gurjeet Singh (#24)

Gurjeet Singh wrote:

The interface etc. may not be beautiful, but it isn't ugly either! It is
a lot better than manually creating pg_index records and inserting them into
cache; we use index_create() API to create the index (build is deferred),
and then 'rollback to savepoint' to undo those changes when the advisor is
done. index_create() causes pg_depends entries too, so a 'RB to SP' is far
much safer than going and deleting cache records manually.

My complaint was not that the API used in the code was non-optimal(which
I think was Tom's issue), but that the _user_ API was not very clean.
Not sure what to recommend, but I will think about it later.

--
Bruce Momjian <bruce@momjian.us> http://momjian.us
EnterpriseDB http://www.enterprisedb.com

+ If your life is a hard drive, Christ can be your backup. +

#36Gurjeet Singh
singh.gurjeet@gmail.com
In reply to: Bruce Momjian (#35)

On 4/12/07, Bruce Momjian <bruce@momjian.us> wrote:

Gurjeet Singh wrote:

The interface etc. may not be beautiful, but it isn't ugly either!

It is

a lot better than manually creating pg_index records and inserting them

into

cache; we use index_create() API to create the index (build is

deferred),

and then 'rollback to savepoint' to undo those changes when the advisor

is

done. index_create() causes pg_depends entries too, so a 'RB to SP' is

far

much safer than going and deleting cache records manually.

My complaint was not that the API used in the code was non-optimal(which
I think was Tom's issue), but that the _user_ API was not very clean.
Not sure what to recommend, but I will think about it later.

That can be fixed/improved with minimal efforts, but if it is the internal
API usage, or the architecture we're bothered about, then IMO just an
overhaul of the code will not be sufficient, rather, it will require rework
from scratch.

Best regards,
--
gurjeet[.singh]@EnterpriseDB.com
singh.gurjeet@{ gmail | hotmail | yahoo }.com

17°29'34.37"N 78°30'59.76"E - Hyderabad
18°32'57.25"N 73°56'25.42"E - Pune *

#37Bruce Momjian
bruce@momjian.us
In reply to: Tom Lane (#33)
Re: [mux@FreeBSD.org: Re: Anyone interested in improving postgresql scaling?]

Tom Lane wrote:

Kris Kennaway <kris@obsecurity.org> writes:

On Wed, Apr 11, 2007 at 01:03:50AM -0400, Tom Lane wrote:

Well, the thing is, we've pretty much had it handed to us that
current-command indicators that aren't up to date are not very useful.
So rate-limited updates strike me as a useless compromise.

I don't get your argument - ps auxww is never going to be 100%
up-to-date because during the time the command is running the status
may change.

Of course. But we have already done the update-once-every-half-second
bit --- that was how pg_stat_activity used to work --- and our users
made clear that it's not good enough. So I don't see us expending
significant effort to convert the setproctitle code path to that
approach. The clear way of the future for expensive-setproctitle
platforms is just to turn it off entirely and rely on the new
pg_stat_activity implementation.

8.3 will modify less memory to update the process title than happened in
the past --- perhaps that will reduce the overhead, but I doubt it. You
can test CVS HEAD to check it.

--
Bruce Momjian <bruce@momjian.us> http://momjian.us
EnterpriseDB http://www.enterprisedb.com

+ If your life is a hard drive, Christ can be your backup. +

#38Kris Kennaway
kris@obsecurity.org
In reply to: Bruce Momjian (#37)
Re: [mux@FreeBSD.org: Re: Anyone interested in improving postgresql scaling?]

On Thu, Apr 12, 2007 at 12:57:32PM -0400, Bruce Momjian wrote:

Tom Lane wrote:

Kris Kennaway <kris@obsecurity.org> writes:

On Wed, Apr 11, 2007 at 01:03:50AM -0400, Tom Lane wrote:

Well, the thing is, we've pretty much had it handed to us that
current-command indicators that aren't up to date are not very useful.
So rate-limited updates strike me as a useless compromise.

I don't get your argument - ps auxww is never going to be 100%
up-to-date because during the time the command is running the status
may change.

Of course. But we have already done the update-once-every-half-second
bit --- that was how pg_stat_activity used to work --- and our users
made clear that it's not good enough. So I don't see us expending
significant effort to convert the setproctitle code path to that
approach. The clear way of the future for expensive-setproctitle
platforms is just to turn it off entirely and rely on the new
pg_stat_activity implementation.

8.3 will modify less memory to update the process title than happened in
the past --- perhaps that will reduce the overhead, but I doubt it. You
can test CVS HEAD to check it.

Yeah, this is not relevant for BSD, it uses a syscall to set it (which
is why it has high overhead) instead of just modifying user memory.

Kris

#39Simon Riggs
simon@2ndquadrant.com
In reply to: Gurjeet Singh (#24)

On Tue, 2007-04-10 at 12:18 -0700, Gurjeet Singh wrote:

Also, although the whole plan-tree is available in
get_relation_info(), but it wouldn't be the right place to scan other
tables, for eg., for generating JOIN-INDEXes or materializing some
intermediate joins. (sometime in the future we may support them!).

I like Tom's suggestion. We never thought actually creating the indexes
was a very good thing and I'd be happy to bury that idea for good.

Speed is definitely a consideration if we are to re-plan thousands of
SQL statements for a real workload.

If we don't run the planner twice, then the developer will have to
run it manually twice, and compare the costs manually (with and
without v-indexes); virtually impossible for lage applications and
introduction of another human-error possibility.

AFAICS Tom hasn't referred to running twice or not, so I'm not very sure
what you're referring to, sorry. If you could answer Tom's suggestions
one by one directly underneath them it would be easier to discuss
things.

ISTM that you've done a great job, the trick is now to reach agreement
and finish this. If there is something still to discuss, it needs to be
very clearly tied back to Tom's comments so everyone can follow it, then
agree it. If there is a problem in Tom's suggestions that directly
effects the operation of the tool then we need to identify what that is.
But if those hooks would give us all we need, then lets agree it and fix
up the adviser plug-in later.

We really, really, really need this. Lots.

--
Simon Riggs
EnterpriseDB http://www.enterprisedb.com