SELECT Query taking 200 ms on PostgreSQL compared to 4 ms on Oracle after migration.

Started by aditya desaialmost 5 years ago43 messages
#1aditya desai
admad123@gmail.com

Hi,
We migrated our Oracle Databases to PostgreSQL. One of the simple select
query that takes 4 ms on Oracle is taking around 200 ms on PostgreSQL.
Could you please advise. Please find query and query plans below. Gather
cost seems high. Will increasing max_parallel_worker_per_gather help?

explain analyse SELECT bom.address_key dom2137,bom.address_type_key
dom1727,bom.start_date dom1077,bom.end_date dom828,bom.address_status_key
dom1955,bom.address_role_key dom1711,bom.delivery_point_created
dom2362,bom.postcode dom873,bom.postcode_name dom1390,bom.street_name
dom1186,bom.premises_number_1 dom1777,bom.premises_number_2
dom1778,bom.premises_letter_1 dom1784,bom.premises_letter_2
dom1785,bom.premises_separator dom1962,bom.stairway dom892,bom.po_box
dom653,bom.apartment_number dom1732,bom.apartment_letter
dom1739,bom.street_key dom1097,bom.address_use_key dom1609,bom.language_key
dom1272,bom.address_family_id dom1796,bom.cur_address_key
dom2566,bom.created_by dom1052,bom.modified_by dom1158,bom.creation_time
dom1392,bom.modification_time dom1813 FROM DEPT.address dom WHERE
address_key = 6113763

[
{
"Plan": {
"Node Type": "Gather",
"Parallel Aware": false,
"Actual Rows": 1,
"Actual Loops": 1,
"Workers Planned": 1,
"Workers Launched": 1,
"Single Copy": true,
"Plans": [
{
"Node Type": "Index Scan",
"Parent Relationship": "Outer",
"Parallel Aware": false,
"Scan Direction": "Forward",
"Index Name": "address1_i7",
"Relation Name": "address",
"Alias": "dom",
"Actual Rows": 1,
"Actual Loops": 1,
"Index Cond": "(address_key = 6113763)",
"Rows Removed by Index Recheck": 0
}
]
},
"Triggers": []
}
]

"Gather (cost=1000.43..1002.75 rows=1 width=127) (actual
time=174.318..198.539 rows=1 loops=1)"
" Workers Planned: 1"
" Workers Launched: 1"
" Single Copy: true"
" -> Index Scan using address1_i7 on address1 dom (cost=0.43..2.65 rows=1
width=127) (actual time=0.125..0.125 rows=1 loops=1)"
" Index Cond: (address_key = 6113763)"
"Planning Time: 0.221 ms"
"Execution Time: 198.601 ms"

Regards,
Aditya.

#2Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: aditya desai (#1)
Re: SELECT Query taking 200 ms on PostgreSQL compared to 4 ms on Oracle after migration.

On Sat, Apr 3, 2021 at 7:08 PM aditya desai <admad123@gmail.com> wrote:

Hi,
We migrated our Oracle Databases to PostgreSQL. One of the simple select query that takes 4 ms on Oracle is taking around 200 ms on PostgreSQL. Could you please advise. Please find query and query plans below. Gather cost seems high. Will increasing max_parallel_worker_per_gather help?

No it doesn't. For small tables, parallelism might not help since it
doesn't come for free. Try setting max_parallel_worker_per_gather to 0
i.e. without parallel query.

With Regards,
Bharath Rupireddy.
EnterpriseDB: http://www.enterprisedb.com

#3Pavel Stehule
pavel.stehule@gmail.com
In reply to: aditya desai (#1)
Re: SELECT Query taking 200 ms on PostgreSQL compared to 4 ms on Oracle after migration.

so 3. 4. 2021 v 15:38 odesílatel aditya desai <admad123@gmail.com> napsal:

Hi,
We migrated our Oracle Databases to PostgreSQL. One of the simple select
query that takes 4 ms on Oracle is taking around 200 ms on PostgreSQL.
Could you please advise. Please find query and query plans below. Gather
cost seems high. Will increasing max_parallel_worker_per_gather help?

explain analyse SELECT bom.address_key dom2137,bom.address_type_key
dom1727,bom.start_date dom1077,bom.end_date dom828,bom.address_status_key
dom1955,bom.address_role_key dom1711,bom.delivery_point_created
dom2362,bom.postcode dom873,bom.postcode_name dom1390,bom.street_name
dom1186,bom.premises_number_1 dom1777,bom.premises_number_2
dom1778,bom.premises_letter_1 dom1784,bom.premises_letter_2
dom1785,bom.premises_separator dom1962,bom.stairway dom892,bom.po_box
dom653,bom.apartment_number dom1732,bom.apartment_letter
dom1739,bom.street_key dom1097,bom.address_use_key dom1609,bom.language_key
dom1272,bom.address_family_id dom1796,bom.cur_address_key
dom2566,bom.created_by dom1052,bom.modified_by dom1158,bom.creation_time
dom1392,bom.modification_time dom1813 FROM DEPT.address dom WHERE
address_key = 6113763

[
{
"Plan": {
"Node Type": "Gather",
"Parallel Aware": false,
"Actual Rows": 1,
"Actual Loops": 1,
"Workers Planned": 1,
"Workers Launched": 1,
"Single Copy": true,
"Plans": [
{
"Node Type": "Index Scan",
"Parent Relationship": "Outer",
"Parallel Aware": false,
"Scan Direction": "Forward",
"Index Name": "address1_i7",
"Relation Name": "address",
"Alias": "dom",
"Actual Rows": 1,
"Actual Loops": 1,
"Index Cond": "(address_key = 6113763)",
"Rows Removed by Index Recheck": 0
}
]
},
"Triggers": []
}
]

"Gather (cost=1000.43..1002.75 rows=1 width=127) (actual
time=174.318..198.539 rows=1 loops=1)"
" Workers Planned: 1"
" Workers Launched: 1"
" Single Copy: true"
" -> Index Scan using address1_i7 on address1 dom (cost=0.43..2.65 rows=1
width=127) (actual time=0.125..0.125 rows=1 loops=1)"
" Index Cond: (address_key = 6113763)"
"Planning Time: 0.221 ms"
"Execution Time: 198.601 ms"

You should have broken configuration - there is not any reason to start
parallelism - probably some option in postgresql.conf has very bad value.
Second - it's crazy to see 200 ms just on interprocess communication -
maybe your CPU is overutilized.

Regards

Pavel

Show quoted text

Regards,
Aditya.

#4Michael Lewis
mlewis@entrata.com
In reply to: aditya desai (#1)
Re: SELECT Query taking 200 ms on PostgreSQL compared to 4 ms on Oracle after migration.

It seems like something is missing. Is this table partitioned? How long ago
was migration done? Has vacuum freeze and analyze of tables been done? Was
index created after populating data or reindexed after perhaps? What
version are you using?

#5Justin Pryzby
pryzby@telsasoft.com
In reply to: Pavel Stehule (#3)
Re: SELECT Query taking 200 ms on PostgreSQL compared to 4 ms on Oracle after migration.

On Sat, Apr 03, 2021 at 04:08:01PM +0200, Pavel Stehule wrote:

so 3. 4. 2021 v 15:38 odes�latel aditya desai <admad123@gmail.com> napsal:

"Gather (cost=1000.43..1002.75 rows=1 width=127) (actual
time=174.318..198.539 rows=1 loops=1)"
" Workers Planned: 1"
" Workers Launched: 1"
" Single Copy: true"
" -> Index Scan using address1_i7 on address1 dom (cost=0.43..2.65 rows=1
width=127) (actual time=0.125..0.125 rows=1 loops=1)"
" Index Cond: (address_key = 6113763)"
"Planning Time: 0.221 ms"
"Execution Time: 198.601 ms"

You should have broken configuration - there is not any reason to start
parallelism - probably some option in postgresql.conf has very bad value.
Second - it's crazy to see 200 ms just on interprocess communication -
maybe your CPU is overutilized.

It seems like force_parallel_mode is set, which is for debugging and not for
"forcing things to go faster". Maybe we should rename the parameter, like
parallel_mode_testing=on.

http://rhaas.blogspot.com/2018/06/using-forceparallelmode-correctly.html

--
Justin

#6aditya desai
admad123@gmail.com
In reply to: Michael Lewis (#4)
Re: SELECT Query taking 200 ms on PostgreSQL compared to 4 ms on Oracle after migration.

Hi Michael,
Thanks for your response.
Is this table partitioned? - No
How long ago was migration done? - 27th March 2021
Has vacuum freeze and analyze of tables been done? - We ran vacuum analyze.
Was index created after populating data or reindexed after perhaps? -
Index was created after data load and reindex was executed on all tables
yesterday.
Version is PostgreSQL-11

Regards,
Aditya.

On Sat, Apr 3, 2021 at 7:40 PM Michael Lewis <mlewis@entrata.com> wrote:

Show quoted text

It seems like something is missing. Is this table partitioned? How long
ago was migration done? Has vacuum freeze and analyze of tables been done?
Was index created after populating data or reindexed after perhaps? What
version are you using?

#7Bruce Momjian
bruce@momjian.us
In reply to: aditya desai (#6)
Re: SELECT Query taking 200 ms on PostgreSQL compared to 4 ms on Oracle after migration.

On Sat, Apr 3, 2021 at 08:29:22PM +0530, aditya desai wrote:

Hi Michael,
Thanks for your response.
Is this table partitioned? - No
How long ago was migration done? - 27th March 2021
Has vacuum freeze and analyze of tables been done? - We ran vacuum analyze.
�Was index created after populating data or reindexed after perhaps? - Index
was created after data load and reindex was executed on all tables yesterday.
�Version is PostgreSQL-11

FYI, the output of these queries will show u what changes have been made
to the configuration file:

SELECT version();

SELECT name, current_setting(name), source
FROM pg_settings
WHERE source NOT IN ('default', 'override');

--
Bruce Momjian <bruce@momjian.us> https://momjian.us
EDB https://enterprisedb.com

If only the physical world exists, free will is an illusion.

#8aditya desai
admad123@gmail.com
In reply to: Justin Pryzby (#5)
Re: SELECT Query taking 200 ms on PostgreSQL compared to 4 ms on Oracle after migration.

Hi Justin,
Yes, force_parallel_mode is on. Should we set it off?

Regards,
Aditya.

On Sat, Apr 3, 2021 at 7:46 PM Justin Pryzby <pryzby@telsasoft.com> wrote:

Show quoted text

On Sat, Apr 03, 2021 at 04:08:01PM +0200, Pavel Stehule wrote:

so 3. 4. 2021 v 15:38 odesílatel aditya desai <admad123@gmail.com>

napsal:

"Gather (cost=1000.43..1002.75 rows=1 width=127) (actual
time=174.318..198.539 rows=1 loops=1)"
" Workers Planned: 1"
" Workers Launched: 1"
" Single Copy: true"
" -> Index Scan using address1_i7 on address1 dom (cost=0.43..2.65

rows=1

width=127) (actual time=0.125..0.125 rows=1 loops=1)"
" Index Cond: (address_key = 6113763)"
"Planning Time: 0.221 ms"
"Execution Time: 198.601 ms"

You should have broken configuration - there is not any reason to start
parallelism - probably some option in postgresql.conf has very bad

value.

Second - it's crazy to see 200 ms just on interprocess communication -
maybe your CPU is overutilized.

It seems like force_parallel_mode is set, which is for debugging and not
for
"forcing things to go faster". Maybe we should rename the parameter, like
parallel_mode_testing=on.

http://rhaas.blogspot.com/2018/06/using-forceparallelmode-correctly.html

--
Justin

#9Bruce Momjian
bruce@momjian.us
In reply to: aditya desai (#8)
Re: SELECT Query taking 200 ms on PostgreSQL compared to 4 ms on Oracle after migration.

On Sat, Apr 3, 2021 at 08:38:18PM +0530, aditya desai wrote:

Hi Justin,
Yes, force_parallel_mode is on. Should we set it off?

Yes. I bet someone set it without reading our docs:

https://www.postgresql.org/docs/13/runtime-config-query.html#RUNTIME-CONFIG-QUERY-OTHER

--> Allows the use of parallel queries for testing purposes even in cases
--> where no performance benefit is expected.

We might need to clarify this sentence to be clearer it is _only_ for
testing. Also, I suggest you review _all_ changes that have been made
to the server since I am worried other unwise changes might also have
been made.

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

Regards,
Aditya.

On Sat, Apr 3, 2021 at 7:46 PM Justin Pryzby <pryzby@telsasoft.com> wrote:

On Sat, Apr 03, 2021 at 04:08:01PM +0200, Pavel Stehule wrote:

so 3. 4. 2021 v 15:38 odes�latel aditya desai <admad123@gmail.com>

napsal:

"Gather (cost=1000.43..1002.75 rows=1 width=127) (actual
time=174.318..198.539 rows=1 loops=1)"
" Workers Planned: 1"
" Workers Launched: 1"
" Single Copy: true"
" -> Index Scan using address1_i7 on address1 dom (cost=0.43..2.65 rows

=1

width=127) (actual time=0.125..0.125 rows=1 loops=1)"
" Index Cond: (address_key = 6113763)"
"Planning Time: 0.221 ms"
"Execution Time: 198.601 ms"

You should have broken configuration - there is not any reason to start
parallelism -� probably some option in postgresql.conf has very bad

value.

Second - it's crazy to see 200 ms just on interprocess communication -
maybe your CPU is overutilized.

It seems like force_parallel_mode is set, which is for debugging and not
for
"forcing things to go faster".� Maybe we should rename the parameter, like
parallel_mode_testing=on.

http://rhaas.blogspot.com/2018/06/using-forceparallelmode-correctly.html

--
Justin

--
Bruce Momjian <bruce@momjian.us> https://momjian.us
EDB https://enterprisedb.com

If only the physical world exists, free will is an illusion.

#10aditya desai
admad123@gmail.com
In reply to: Bruce Momjian (#9)
Re: SELECT Query taking 200 ms on PostgreSQL compared to 4 ms on Oracle after migration.

Thanks Bruce!! Will set it off and retry.

On Sat, Apr 3, 2021 at 8:42 PM Bruce Momjian <bruce@momjian.us> wrote:

Show quoted text

On Sat, Apr 3, 2021 at 08:38:18PM +0530, aditya desai wrote:

Hi Justin,
Yes, force_parallel_mode is on. Should we set it off?

Yes. I bet someone set it without reading our docs:

https://www.postgresql.org/docs/13/runtime-config-query.html#RUNTIME-CONFIG-QUERY-OTHER

--> Allows the use of parallel queries for testing purposes even in
cases
--> where no performance benefit is expected.

We might need to clarify this sentence to be clearer it is _only_ for
testing. Also, I suggest you review _all_ changes that have been made
to the server since I am worried other unwise changes might also have
been made.

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

Regards,
Aditya.

On Sat, Apr 3, 2021 at 7:46 PM Justin Pryzby <pryzby@telsasoft.com>

wrote:

On Sat, Apr 03, 2021 at 04:08:01PM +0200, Pavel Stehule wrote:

so 3. 4. 2021 v 15:38 odesílatel aditya desai <admad123@gmail.com>

napsal:

"Gather (cost=1000.43..1002.75 rows=1 width=127) (actual
time=174.318..198.539 rows=1 loops=1)"
" Workers Planned: 1"
" Workers Launched: 1"
" Single Copy: true"
" -> Index Scan using address1_i7 on address1 dom

(cost=0.43..2.65 rows

=1

width=127) (actual time=0.125..0.125 rows=1 loops=1)"
" Index Cond: (address_key = 6113763)"
"Planning Time: 0.221 ms"
"Execution Time: 198.601 ms"

You should have broken configuration - there is not any reason to

start

parallelism - probably some option in postgresql.conf has very bad

value.

Second - it's crazy to see 200 ms just on interprocess

communication -

maybe your CPU is overutilized.

It seems like force_parallel_mode is set, which is for debugging and

not

for
"forcing things to go faster". Maybe we should rename the

parameter, like

parallel_mode_testing=on.

http://rhaas.blogspot.com/2018/06/using-forceparallelmode-correctly.html

--
Justin

--
Bruce Momjian <bruce@momjian.us> https://momjian.us
EDB https://enterprisedb.com

If only the physical world exists, free will is an illusion.

#11Bruce Momjian
bruce@momjian.us
In reply to: Bruce Momjian (#9)
Re: SELECT Query taking 200 ms on PostgreSQL compared to 4 ms on Oracle after migration.

On Sat, Apr 3, 2021 at 11:12:01AM -0400, Bruce Momjian wrote:

On Sat, Apr 3, 2021 at 08:38:18PM +0530, aditya desai wrote:

Hi Justin,
Yes, force_parallel_mode is on. Should we set it off?

Yes. I bet someone set it without reading our docs:

https://www.postgresql.org/docs/13/runtime-config-query.html#RUNTIME-CONFIG-QUERY-OTHER

--> Allows the use of parallel queries for testing purposes even in cases
--> where no performance benefit is expected.

We might need to clarify this sentence to be clearer it is _only_ for
testing. Also, I suggest you review _all_ changes that have been made
to the server since I am worried other unwise changes might also have
been made.

This brings up an issue we see occasionally. You can either leave
everything as default, get advice on which defaults to change, or study
each setting and then change defaults. Changing defaults without study
often leads to poor configurations, as we are seeing here.

The lucky thing is that you noticed a slow query and found the
misconfiguration, but I am sure there are many servers where
misconfiguration is never detected. I wish I knew how to improve this
situation, but user education seems to be all we can do.

--
Bruce Momjian <bruce@momjian.us> https://momjian.us
EDB https://enterprisedb.com

If only the physical world exists, free will is an illusion.

#12aditya desai
admad123@gmail.com
In reply to: aditya desai (#1)
Re: SELECT Query taking 200 ms on PostgreSQL compared to 4 ms on Oracle after migration.

adding the group.

aad_log_min_messages | warning
| configuration file
application_name | psql
| client
archive_command |
c:\postgres\bin\xlogcopy\xlogcopy.exe archive blob "%f" "%p" |
configuration file
archive_mode | on
| configuration file
archive_timeout | 15min
| configuration file
authentication_timeout | 30s
| configuration file
autovacuum_analyze_scale_factor | 0.05
| configuration file
autovacuum_naptime | 15s
| configuration file
autovacuum_vacuum_scale_factor | 0.05
| configuration file
bgwriter_delay | 20ms
| configuration file
bgwriter_flush_after | 512kB
| configuration file
bgwriter_lru_maxpages | 100
| configuration file
checkpoint_completion_target | 0.9
| configuration file
checkpoint_flush_after | 256kB
| configuration file
checkpoint_timeout | 5min
| configuration file
client_encoding | UTF8
| client
connection_ID |
5b59f092-444c-49df-b5d6-a7a0028a7855 | client
connection_PeerIP |
fd40:4d4a:11:5067:6d11:500:a07:5144 | client
connection_Vnet | on
| client
constraint_exclusion | partition
| configuration file
data_sync_retry | on
| configuration file
DateStyle | ISO, MDY
| configuration file
default_text_search_config | pg_catalog.english
| configuration file
dynamic_shared_memory_type | windows
| configuration file
effective_cache_size | 160GB
| configuration file
enable_seqscan | off
| configuration file
force_parallel_mode | off
| configuration file
from_collapse_limit | 15
| configuration file
full_page_writes | off
| configuration file
hot_standby | on
| configuration file
hot_standby_feedback | on
| configuration file
join_collapse_limit | 15
| configuration file
lc_messages | English_United States.1252
| configuration file
lc_monetary | English_United States.1252
| configuration file
lc_numeric | English_United States.1252
| configuration file
lc_time | English_United States.1252
| configuration file
listen_addresses | *
| configuration file
log_checkpoints | on
| configuration file
log_connections | on
| configuration file
log_destination | stderr
| configuration file
log_file_mode | 0640
| configuration file
log_line_prefix | %t-%c-
| configuration file
log_min_messages_internal | info
| configuration file
log_rotation_age | 1h
| configuration file
log_rotation_size | 100MB
| configuration file
log_timezone | UTC
| configuration file
logging_collector | on
| configuration file
maintenance_work_mem | 1GB
| configuration file
max_connections | 1900
| configuration file
max_parallel_workers_per_gather | 16
| configuration file
max_replication_slots | 10
| configuration file
max_stack_depth | 2MB
| environment variable
max_wal_senders | 10
| configuration file
max_wal_size | 26931MB
| configuration file
min_wal_size | 4GB
| configuration file
pg_qs.query_capture_mode | top
| configuration file
pgms_wait_sampling.query_capture_mode | all
| configuration file
pgstat_udp_port | 20224
| command line
port | 20224
| command line
random_page_cost | 1.1
| configuration file
shared_buffers | 64GB
| configuration file
ssl | on
| configuration file
ssl_ca_file | root.crt
| configuration file
superuser_reserved_connections | 5
| configuration file
TimeZone | EET
| configuration file
track_io_timing | on
| configuration file
wal_buffers | 128MB
| configuration file
wal_keep_segments | 25
| configuration file
wal_level | replica
| configuration file
work_mem | 16MB
| configuration file

On Sat, Apr 3, 2021 at 8:59 PM aditya desai <admad123@gmail.com> wrote:

Show quoted text

Hi Bruce,
Please find the below output.force_parallel_mode if off now.

aad_log_min_messages | warning
| configuration file
application_name | psql
| client
archive_command |
c:\postgres\bin\xlogcopy\xlogcopy.exe archive blob "%f" "%p" |
configuration file
archive_mode | on
| configuration file
archive_timeout | 15min
| configuration file
authentication_timeout | 30s
| configuration file
autovacuum_analyze_scale_factor | 0.05
| configuration file
autovacuum_naptime | 15s
| configuration file
autovacuum_vacuum_scale_factor | 0.05
| configuration file
bgwriter_delay | 20ms
| configuration file
bgwriter_flush_after | 512kB
| configuration file
bgwriter_lru_maxpages | 100
| configuration file
checkpoint_completion_target | 0.9
| configuration file
checkpoint_flush_after | 256kB
| configuration file
checkpoint_timeout | 5min
| configuration file
client_encoding | UTF8
| client
connection_ID |
5b59f092-444c-49df-b5d6-a7a0028a7855 | client
connection_PeerIP |
fd40:4d4a:11:5067:6d11:500:a07:5144 | client
connection_Vnet | on
| client
constraint_exclusion | partition
| configuration file
data_sync_retry | on
| configuration file
DateStyle | ISO, MDY
| configuration file
default_text_search_config | pg_catalog.english
| configuration file
dynamic_shared_memory_type | windows
| configuration file
effective_cache_size | 160GB
| configuration file
enable_seqscan | off
| configuration file
force_parallel_mode | off
| configuration file
from_collapse_limit | 15
| configuration file
full_page_writes | off
| configuration file
hot_standby | on
| configuration file
hot_standby_feedback | on
| configuration file
join_collapse_limit | 15
| configuration file
lc_messages | English_United States.1252
| configuration file
lc_monetary | English_United States.1252
| configuration file
lc_numeric | English_United States.1252
| configuration file
lc_time | English_United States.1252
| configuration file
listen_addresses | *
| configuration file
log_checkpoints | on
| configuration file
log_connections | on
| configuration file
log_destination | stderr
| configuration file
log_file_mode | 0640
| configuration file
log_line_prefix | %t-%c-
| configuration file
log_min_messages_internal | info
| configuration file
log_rotation_age | 1h
| configuration file
log_rotation_size | 100MB
| configuration file
log_timezone | UTC
| configuration file
logging_collector | on
| configuration file
maintenance_work_mem | 1GB
| configuration file
max_connections | 1900
| configuration file
max_parallel_workers_per_gather | 16
| configuration file
max_replication_slots | 10
| configuration file
max_stack_depth | 2MB
| environment variable
max_wal_senders | 10
| configuration file
max_wal_size | 26931MB
| configuration file
min_wal_size | 4GB
| configuration file
pg_qs.query_capture_mode | top
| configuration file
pgms_wait_sampling.query_capture_mode | all
| configuration file
pgstat_udp_port | 20224
| command line
port | 20224
| command line
random_page_cost | 1.1
| configuration file
shared_buffers | 64GB
| configuration file
ssl | on
| configuration file
ssl_ca_file | root.crt
| configuration file
superuser_reserved_connections | 5
| configuration file
TimeZone | EET
| configuration file
track_io_timing | on
| configuration file
wal_buffers | 128MB
| configuration file
wal_keep_segments | 25
| configuration file
wal_level | replica
| configuration file
work_mem | 16MB
| configuration file

Regards,
Aditya.

On Sat, Apr 3, 2021 at 8:34 PM Bruce Momjian <bruce@momjian.us> wrote:

On Sat, Apr 3, 2021 at 08:29:22PM +0530, aditya desai wrote:

Hi Michael,
Thanks for your response.
Is this table partitioned? - No
How long ago was migration done? - 27th March 2021
Has vacuum freeze and analyze of tables been done? - We ran vacuum

analyze.

Was index created after populating data or reindexed after perhaps? -

Index

was created after data load and reindex was executed on all tables

yesterday.

Version is PostgreSQL-11

FYI, the output of these queries will show u what changes have been made
to the configuration file:

SELECT version();

SELECT name, current_setting(name), source
FROM pg_settings
WHERE source NOT IN ('default', 'override');

--
Bruce Momjian <bruce@momjian.us> https://momjian.us
EDB https://enterprisedb.com

If only the physical world exists, free will is an illusion.

#13aditya desai
admad123@gmail.com
In reply to: aditya desai (#1)
Re: SELECT Query taking 200 ms on PostgreSQL compared to 4 ms on Oracle after migration.

I will gather all information and get back to you

On Sat, Apr 3, 2021 at 9:00 PM Pavel Stehule <pavel.stehule@gmail.com>
wrote:

Show quoted text

so 3. 4. 2021 v 17:15 odesílatel aditya desai <admad123@gmail.com> napsal:

Hi Pavel,
Thanks for response. Please see below.
work_mem=16MB
maintenance_work_mem=1GB
effective_cache_size=160GB
shared_buffers=64GB
force_parallel_mode=ON

force_parallel_mode is very bad idea. efective_cache_size=160GB can be too
much too. work_mem 16 MB is maybe too low. The configuration looks a little
bit chaotic :)

How much has RAM your server? How much CPU cores are there? What is
max_connections?

Regards

Pavel

Regards,
Aditya.

On Sat, Apr 3, 2021 at 7:38 PM Pavel Stehule <pavel.stehule@gmail.com>
wrote:

so 3. 4. 2021 v 15:38 odesílatel aditya desai <admad123@gmail.com>
napsal:

Hi,
We migrated our Oracle Databases to PostgreSQL. One of the simple
select query that takes 4 ms on Oracle is taking around 200 ms on
PostgreSQL. Could you please advise. Please find query and query plans
below. Gather cost seems high. Will increasing
max_parallel_worker_per_gather help?

explain analyse SELECT bom.address_key dom2137,bom.address_type_key
dom1727,bom.start_date dom1077,bom.end_date dom828,bom.address_status_key
dom1955,bom.address_role_key dom1711,bom.delivery_point_created
dom2362,bom.postcode dom873,bom.postcode_name dom1390,bom.street_name
dom1186,bom.premises_number_1 dom1777,bom.premises_number_2
dom1778,bom.premises_letter_1 dom1784,bom.premises_letter_2
dom1785,bom.premises_separator dom1962,bom.stairway dom892,bom.po_box
dom653,bom.apartment_number dom1732,bom.apartment_letter
dom1739,bom.street_key dom1097,bom.address_use_key dom1609,bom.language_key
dom1272,bom.address_family_id dom1796,bom.cur_address_key
dom2566,bom.created_by dom1052,bom.modified_by dom1158,bom.creation_time
dom1392,bom.modification_time dom1813 FROM DEPT.address dom WHERE
address_key = 6113763

[
{
"Plan": {
"Node Type": "Gather",
"Parallel Aware": false,
"Actual Rows": 1,
"Actual Loops": 1,
"Workers Planned": 1,
"Workers Launched": 1,
"Single Copy": true,
"Plans": [
{
"Node Type": "Index Scan",
"Parent Relationship": "Outer",
"Parallel Aware": false,
"Scan Direction": "Forward",
"Index Name": "address1_i7",
"Relation Name": "address",
"Alias": "dom",
"Actual Rows": 1,
"Actual Loops": 1,
"Index Cond": "(address_key = 6113763)",
"Rows Removed by Index Recheck": 0
}
]
},
"Triggers": []
}
]

"Gather (cost=1000.43..1002.75 rows=1 width=127) (actual
time=174.318..198.539 rows=1 loops=1)"
" Workers Planned: 1"
" Workers Launched: 1"
" Single Copy: true"
" -> Index Scan using address1_i7 on address1 dom (cost=0.43..2.65
rows=1 width=127) (actual time=0.125..0.125 rows=1 loops=1)"
" Index Cond: (address_key = 6113763)"
"Planning Time: 0.221 ms"
"Execution Time: 198.601 ms"

You should have broken configuration - there is not any reason to start
parallelism - probably some option in postgresql.conf has very bad value.
Second - it's crazy to see 200 ms just on interprocess communication -
maybe your CPU is overutilized.

Regards

Pavel

Regards,
Aditya.

#14Pavel Stehule
pavel.stehule@gmail.com
In reply to: aditya desai (#12)
Re: SELECT Query taking 200 ms on PostgreSQL compared to 4 ms on Oracle after migration.

so 3. 4. 2021 v 17:30 odesílatel aditya desai <admad123@gmail.com> napsal:

adding the group.

aad_log_min_messages | warning
| configuration file
application_name | psql
| client
archive_command |
c:\postgres\bin\xlogcopy\xlogcopy.exe archive blob "%f" "%p" |
configuration file
archive_mode | on
| configuration file
archive_timeout | 15min
| configuration file
authentication_timeout | 30s
| configuration file
autovacuum_analyze_scale_factor | 0.05
| configuration file
autovacuum_naptime | 15s
| configuration file
autovacuum_vacuum_scale_factor | 0.05
| configuration file
bgwriter_delay | 20ms
| configuration file
bgwriter_flush_after | 512kB
| configuration file
bgwriter_lru_maxpages | 100
| configuration file
checkpoint_completion_target | 0.9
| configuration file
checkpoint_flush_after | 256kB
| configuration file
checkpoint_timeout | 5min
| configuration file
client_encoding | UTF8
| client
connection_ID |
5b59f092-444c-49df-b5d6-a7a0028a7855 | client
connection_PeerIP |
fd40:4d4a:11:5067:6d11:500:a07:5144 | client
connection_Vnet | on
| client
constraint_exclusion | partition
| configuration file
data_sync_retry | on
| configuration file
DateStyle | ISO, MDY
| configuration file
default_text_search_config | pg_catalog.english
| configuration file
dynamic_shared_memory_type | windows
| configuration file
effective_cache_size | 160GB
| configuration file
enable_seqscan | off
| configuration file
force_parallel_mode | off
| configuration file
from_collapse_limit | 15
| configuration file
full_page_writes | off
| configuration file
hot_standby | on
| configuration file
hot_standby_feedback | on
| configuration file
join_collapse_limit | 15
| configuration file
lc_messages | English_United States.1252
| configuration file
lc_monetary | English_United States.1252
| configuration file
lc_numeric | English_United States.1252
| configuration file
lc_time | English_United States.1252
| configuration file
listen_addresses | *
| configuration file
log_checkpoints | on
| configuration file
log_connections | on
| configuration file
log_destination | stderr
| configuration file
log_file_mode | 0640
| configuration file
log_line_prefix | %t-%c-
| configuration file
log_min_messages_internal | info
| configuration file
log_rotation_age | 1h
| configuration file
log_rotation_size | 100MB
| configuration file
log_timezone | UTC
| configuration file
logging_collector | on
| configuration file
maintenance_work_mem | 1GB
| configuration file
max_connections | 1900
| configuration file
max_parallel_workers_per_gather | 16
| configuration file
max_replication_slots | 10
| configuration file
max_stack_depth | 2MB
| environment variable
max_wal_senders | 10
| configuration file
max_wal_size | 26931MB
| configuration file
min_wal_size | 4GB
| configuration file
pg_qs.query_capture_mode | top
| configuration file
pgms_wait_sampling.query_capture_mode | all
| configuration file
pgstat_udp_port | 20224
| command line
port | 20224
| command line
random_page_cost | 1.1
| configuration file
shared_buffers | 64GB
| configuration file
ssl | on
| configuration file
ssl_ca_file | root.crt
| configuration file
superuser_reserved_connections | 5
| configuration file
TimeZone | EET
| configuration file
track_io_timing | on
| configuration file
wal_buffers | 128MB
| configuration file
wal_keep_segments | 25
| configuration file
wal_level | replica
| configuration file
work_mem | 16MB
| configuration file

max_connections | 1900

it is really not good - there can be very high CPU overloading with a lot
of others issues.

Show quoted text

On Sat, Apr 3, 2021 at 8:59 PM aditya desai <admad123@gmail.com> wrote:

Hi Bruce,
Please find the below output.force_parallel_mode if off now.

aad_log_min_messages | warning
| configuration file
application_name | psql
| client
archive_command |
c:\postgres\bin\xlogcopy\xlogcopy.exe archive blob "%f" "%p" |
configuration file
archive_mode | on
| configuration file
archive_timeout | 15min
| configuration file
authentication_timeout | 30s
| configuration file
autovacuum_analyze_scale_factor | 0.05
| configuration file
autovacuum_naptime | 15s
| configuration file
autovacuum_vacuum_scale_factor | 0.05
| configuration file
bgwriter_delay | 20ms
| configuration file
bgwriter_flush_after | 512kB
| configuration file
bgwriter_lru_maxpages | 100
| configuration file
checkpoint_completion_target | 0.9
| configuration file
checkpoint_flush_after | 256kB
| configuration file
checkpoint_timeout | 5min
| configuration file
client_encoding | UTF8
| client
connection_ID |
5b59f092-444c-49df-b5d6-a7a0028a7855 | client
connection_PeerIP |
fd40:4d4a:11:5067:6d11:500:a07:5144 | client
connection_Vnet | on
| client
constraint_exclusion | partition
| configuration file
data_sync_retry | on
| configuration file
DateStyle | ISO, MDY
| configuration file
default_text_search_config | pg_catalog.english
| configuration file
dynamic_shared_memory_type | windows
| configuration file
effective_cache_size | 160GB
| configuration file
enable_seqscan | off
| configuration file
force_parallel_mode | off
| configuration file
from_collapse_limit | 15
| configuration file
full_page_writes | off
| configuration file
hot_standby | on
| configuration file
hot_standby_feedback | on
| configuration file
join_collapse_limit | 15
| configuration file
lc_messages | English_United States.1252
| configuration file
lc_monetary | English_United States.1252
| configuration file
lc_numeric | English_United States.1252
| configuration file
lc_time | English_United States.1252
| configuration file
listen_addresses | *
| configuration file
log_checkpoints | on
| configuration file
log_connections | on
| configuration file
log_destination | stderr
| configuration file
log_file_mode | 0640
| configuration file
log_line_prefix | %t-%c-
| configuration file
log_min_messages_internal | info
| configuration file
log_rotation_age | 1h
| configuration file
log_rotation_size | 100MB
| configuration file
log_timezone | UTC
| configuration file
logging_collector | on
| configuration file
maintenance_work_mem | 1GB
| configuration file
max_connections | 1900
| configuration file
max_parallel_workers_per_gather | 16
| configuration file
max_replication_slots | 10
| configuration file
max_stack_depth | 2MB
| environment variable
max_wal_senders | 10
| configuration file
max_wal_size | 26931MB
| configuration file
min_wal_size | 4GB
| configuration file
pg_qs.query_capture_mode | top
| configuration file
pgms_wait_sampling.query_capture_mode | all
| configuration file
pgstat_udp_port | 20224
| command line
port | 20224
| command line
random_page_cost | 1.1
| configuration file
shared_buffers | 64GB
| configuration file
ssl | on
| configuration file
ssl_ca_file | root.crt
| configuration file
superuser_reserved_connections | 5
| configuration file
TimeZone | EET
| configuration file
track_io_timing | on
| configuration file
wal_buffers | 128MB
| configuration file
wal_keep_segments | 25
| configuration file
wal_level | replica
| configuration file
work_mem | 16MB
| configuration file

Regards,
Aditya.

On Sat, Apr 3, 2021 at 8:34 PM Bruce Momjian <bruce@momjian.us> wrote:

On Sat, Apr 3, 2021 at 08:29:22PM +0530, aditya desai wrote:

Hi Michael,
Thanks for your response.
Is this table partitioned? - No
How long ago was migration done? - 27th March 2021
Has vacuum freeze and analyze of tables been done? - We ran vacuum

analyze.

Was index created after populating data or reindexed after perhaps? -

Index

was created after data load and reindex was executed on all tables

yesterday.

Version is PostgreSQL-11

FYI, the output of these queries will show u what changes have been made
to the configuration file:

SELECT version();

SELECT name, current_setting(name), source
FROM pg_settings
WHERE source NOT IN ('default', 'override');

--
Bruce Momjian <bruce@momjian.us> https://momjian.us
EDB https://enterprisedb.com

If only the physical world exists, free will is an illusion.

#15Bruce Momjian
bruce@momjian.us
In reply to: aditya desai (#12)
Re: SELECT Query taking 200 ms on PostgreSQL compared to 4 ms on Oracle after migration.

On Sat, Apr 3, 2021 at 09:00:24PM +0530, aditya desai wrote:

adding the group.

Perfect. That is a lot of non-default settings, so I would be concerned
there are other misconfigurations in there --- the group here might have
some tips.

�aad_log_min_messages� � � � � � � � � | warning� � � � � � � � � � � � � � � �
� � � � � � � � � � � | configuration file

The above is not a PG config variable.

�connection_ID� � � � � � � � � � � � �| 5b59f092-444c-49df-b5d6-a7a0028a7855�
� � � � � � � � � � � �| client
�connection_PeerIP� � � � � � � � � � �| fd40:4d4a:11:5067:6d11:500:a07:5144� �
� � � � � � � � � � � | client
�connection_Vnet� � � � � � � � � � � �| on� � � � � � � � � � � � � � � � � �

Uh, these are not a PG settings. You need to show us the output of
version() because this is not standard Postgres. A quick search
suggests this is a Microsoft version of Postgres. I will stop
commenting.

--
Bruce Momjian <bruce@momjian.us> https://momjian.us
EDB https://enterprisedb.com

If only the physical world exists, free will is an illusion.

#16Tom Lane
tgl@sss.pgh.pa.us
In reply to: Bruce Momjian (#9)
Re: SELECT Query taking 200 ms on PostgreSQL compared to 4 ms on Oracle after migration.

Bruce Momjian <bruce@momjian.us> writes:

On Sat, Apr 3, 2021 at 08:38:18PM +0530, aditya desai wrote:

Yes, force_parallel_mode is on. Should we set it off?

Yes. I bet someone set it without reading our docs:

https://www.postgresql.org/docs/13/runtime-config-query.html#RUNTIME-CONFIG-QUERY-OTHER

--> Allows the use of parallel queries for testing purposes even in cases
--> where no performance benefit is expected.

We might need to clarify this sentence to be clearer it is _only_ for
testing.

I wonder why it is listed under planner options at all, and not under
developer options.

regards, tom lane

#17Justin Pryzby
pryzby@telsasoft.com
In reply to: Tom Lane (#16)
Re: SELECT Query taking 200 ms on PostgreSQL compared to 4 ms on Oracle after migration.

On Sat, Apr 03, 2021 at 11:39:19AM -0400, Tom Lane wrote:

Bruce Momjian <bruce@momjian.us> writes:

On Sat, Apr 3, 2021 at 08:38:18PM +0530, aditya desai wrote:

Yes, force_parallel_mode is on. Should we set it off?

Yes. I bet someone set it without reading our docs:

https://www.postgresql.org/docs/13/runtime-config-query.html#RUNTIME-CONFIG-QUERY-OTHER

--> Allows the use of parallel queries for testing purposes even in cases
--> where no performance benefit is expected.

We might need to clarify this sentence to be clearer it is _only_ for
testing.

I wonder why it is listed under planner options at all, and not under
developer options.

Because it's there to help DBAs catch errors in functions incorrectly marked as
parallel safe.

--
Justin

#18Bruce Momjian
bruce@momjian.us
In reply to: Tom Lane (#16)
Re: SELECT Query taking 200 ms on PostgreSQL compared to 4 ms on Oracle after migration.

On Sat, Apr 3, 2021 at 11:39:19AM -0400, Tom Lane wrote:

Bruce Momjian <bruce@momjian.us> writes:

On Sat, Apr 3, 2021 at 08:38:18PM +0530, aditya desai wrote:

Yes, force_parallel_mode is on. Should we set it off?

Yes. I bet someone set it without reading our docs:

https://www.postgresql.org/docs/13/runtime-config-query.html#RUNTIME-CONFIG-QUERY-OTHER

--> Allows the use of parallel queries for testing purposes even in cases
--> where no performance benefit is expected.

We might need to clarify this sentence to be clearer it is _only_ for
testing.

I wonder why it is listed under planner options at all, and not under
developer options.

I was kind of surprised by that myself since I was working on a blog
entry about from_collapse_limit and join_collapse_limit. I think moving
it makes sense.

--
Bruce Momjian <bruce@momjian.us> https://momjian.us
EDB https://enterprisedb.com

If only the physical world exists, free will is an illusion.

#19Bruce Momjian
bruce@momjian.us
In reply to: Justin Pryzby (#17)
Re: SELECT Query taking 200 ms on PostgreSQL compared to 4 ms on Oracle after migration.

On Sat, Apr 3, 2021 at 10:41:14AM -0500, Justin Pryzby wrote:

On Sat, Apr 03, 2021 at 11:39:19AM -0400, Tom Lane wrote:

Bruce Momjian <bruce@momjian.us> writes:

On Sat, Apr 3, 2021 at 08:38:18PM +0530, aditya desai wrote:

Yes, force_parallel_mode is on. Should we set it off?

Yes. I bet someone set it without reading our docs:

https://www.postgresql.org/docs/13/runtime-config-query.html#RUNTIME-CONFIG-QUERY-OTHER

--> Allows the use of parallel queries for testing purposes even in cases
--> where no performance benefit is expected.

We might need to clarify this sentence to be clearer it is _only_ for
testing.

I wonder why it is listed under planner options at all, and not under
developer options.

Because it's there to help DBAs catch errors in functions incorrectly marked as
parallel safe.

Uh, isn't that developer/debugging?

--
Bruce Momjian <bruce@momjian.us> https://momjian.us
EDB https://enterprisedb.com

If only the physical world exists, free will is an illusion.

#20aditya desai
admad123@gmail.com
In reply to: Justin Pryzby (#17)
Re: SELECT Query taking 200 ms on PostgreSQL compared to 4 ms on Oracle after migration.

Thanks Justin. Will review all parameters and get back to you.

On Sat, Apr 3, 2021 at 9:11 PM Justin Pryzby <pryzby@telsasoft.com> wrote:

Show quoted text

On Sat, Apr 03, 2021 at 11:39:19AM -0400, Tom Lane wrote:

Bruce Momjian <bruce@momjian.us> writes:

On Sat, Apr 3, 2021 at 08:38:18PM +0530, aditya desai wrote:

Yes, force_parallel_mode is on. Should we set it off?

Yes. I bet someone set it without reading our docs:

https://www.postgresql.org/docs/13/runtime-config-query.html#RUNTIME-CONFIG-QUERY-OTHER

--> Allows the use of parallel queries for testing purposes even in

cases

--> where no performance benefit is expected.

We might need to clarify this sentence to be clearer it is _only_ for
testing.

I wonder why it is listed under planner options at all, and not under
developer options.

Because it's there to help DBAs catch errors in functions incorrectly
marked as
parallel safe.

--
Justin

#21aditya desai
admad123@gmail.com
In reply to: aditya desai (#20)
Re: SELECT Query taking 200 ms on PostgreSQL compared to 4 ms on Oracle after migration.

Hi Justin/Bruce/Pavel,
Thanks for your inputs. After setting force_parallel_mode=off Execution
time of same query was reduced to 1ms from 200 ms. Worked like a charm. We
also increased work_mem to 80=MB. Thanks again.

Regards,
Aditya.

On Sat, Apr 3, 2021 at 9:14 PM aditya desai <admad123@gmail.com> wrote:

Show quoted text

Thanks Justin. Will review all parameters and get back to you.

On Sat, Apr 3, 2021 at 9:11 PM Justin Pryzby <pryzby@telsasoft.com> wrote:

On Sat, Apr 03, 2021 at 11:39:19AM -0400, Tom Lane wrote:

Bruce Momjian <bruce@momjian.us> writes:

On Sat, Apr 3, 2021 at 08:38:18PM +0530, aditya desai wrote:

Yes, force_parallel_mode is on. Should we set it off?

Yes. I bet someone set it without reading our docs:

https://www.postgresql.org/docs/13/runtime-config-query.html#RUNTIME-CONFIG-QUERY-OTHER

--> Allows the use of parallel queries for testing purposes even in

cases

--> where no performance benefit is expected.

We might need to clarify this sentence to be clearer it is _only_ for
testing.

I wonder why it is listed under planner options at all, and not under
developer options.

Because it's there to help DBAs catch errors in functions incorrectly
marked as
parallel safe.

--
Justin

#22Pavel Stehule
pavel.stehule@gmail.com
In reply to: aditya desai (#21)
Re: SELECT Query taking 200 ms on PostgreSQL compared to 4 ms on Oracle after migration.

so 3. 4. 2021 v 19:37 odesílatel aditya desai <admad123@gmail.com> napsal:

Hi Justin/Bruce/Pavel,
Thanks for your inputs. After setting force_parallel_mode=off Execution
time of same query was reduced to 1ms from 200 ms. Worked like a charm. We
also increased work_mem to 80=MB. Thanks

super.

The too big max_connection can cause a lot of problems. You should install
and use pgbouncer or pgpool II.

https://scalegrid.io/blog/postgresql-connection-pooling-part-4-pgbouncer-vs-pgpool/

Regards

Pavel

Show quoted text

again.

Regards,
Aditya.

On Sat, Apr 3, 2021 at 9:14 PM aditya desai <admad123@gmail.com> wrote:

Thanks Justin. Will review all parameters and get back to you.

On Sat, Apr 3, 2021 at 9:11 PM Justin Pryzby <pryzby@telsasoft.com>
wrote:

On Sat, Apr 03, 2021 at 11:39:19AM -0400, Tom Lane wrote:

Bruce Momjian <bruce@momjian.us> writes:

On Sat, Apr 3, 2021 at 08:38:18PM +0530, aditya desai wrote:

Yes, force_parallel_mode is on. Should we set it off?

Yes. I bet someone set it without reading our docs:

https://www.postgresql.org/docs/13/runtime-config-query.html#RUNTIME-CONFIG-QUERY-OTHER

--> Allows the use of parallel queries for testing purposes even in

cases

--> where no performance benefit is expected.

We might need to clarify this sentence to be clearer it is _only_ for
testing.

I wonder why it is listed under planner options at all, and not under
developer options.

Because it's there to help DBAs catch errors in functions incorrectly
marked as
parallel safe.

--
Justin

#23aditya desai
admad123@gmail.com
In reply to: Pavel Stehule (#22)
Re: SELECT Query taking 200 ms on PostgreSQL compared to 4 ms on Oracle after migration.

Yes. I have made suggestions on connection pooling as well. Currently it is
being done from Application side.

On Sat, Apr 3, 2021 at 11:12 PM Pavel Stehule <pavel.stehule@gmail.com>
wrote:

Show quoted text

so 3. 4. 2021 v 19:37 odesílatel aditya desai <admad123@gmail.com> napsal:

Hi Justin/Bruce/Pavel,
Thanks for your inputs. After setting force_parallel_mode=off Execution
time of same query was reduced to 1ms from 200 ms. Worked like a charm. We
also increased work_mem to 80=MB. Thanks

super.

The too big max_connection can cause a lot of problems. You should install
and use pgbouncer or pgpool II.

https://scalegrid.io/blog/postgresql-connection-pooling-part-4-pgbouncer-vs-pgpool/

Regards

Pavel

again.

Regards,
Aditya.

On Sat, Apr 3, 2021 at 9:14 PM aditya desai <admad123@gmail.com> wrote:

Thanks Justin. Will review all parameters and get back to you.

On Sat, Apr 3, 2021 at 9:11 PM Justin Pryzby <pryzby@telsasoft.com>
wrote:

On Sat, Apr 03, 2021 at 11:39:19AM -0400, Tom Lane wrote:

Bruce Momjian <bruce@momjian.us> writes:

On Sat, Apr 3, 2021 at 08:38:18PM +0530, aditya desai wrote:

Yes, force_parallel_mode is on. Should we set it off?

Yes. I bet someone set it without reading our docs:

https://www.postgresql.org/docs/13/runtime-config-query.html#RUNTIME-CONFIG-QUERY-OTHER

--> Allows the use of parallel queries for testing purposes even in

cases

--> where no performance benefit is expected.

We might need to clarify this sentence to be clearer it is _only_

for

testing.

I wonder why it is listed under planner options at all, and not under
developer options.

Because it's there to help DBAs catch errors in functions incorrectly
marked as
parallel safe.

--
Justin

#24Pavel Stehule
pavel.stehule@gmail.com
In reply to: aditya desai (#23)
Re: SELECT Query taking 200 ms on PostgreSQL compared to 4 ms on Oracle after migration.

so 3. 4. 2021 v 19:45 odesílatel aditya desai <admad123@gmail.com> napsal:

Yes. I have made suggestions on connection pooling as well. Currently it
is being done from Application side.

It is usual - but the application side pooling doesn't solve well
overloading. The behaviour of the database is not linear. Usually opened
connections are not active. But any non active connection can be changed to
an active connection (there is not any limit for active connections), and
then the performance can be very very slow. Good pooling and good setting
of max_connections is protection against overloading. max_connection should
be 10-20 x CPU cores (for OLTP)

Regards

Pavel

Show quoted text

On Sat, Apr 3, 2021 at 11:12 PM Pavel Stehule <pavel.stehule@gmail.com>
wrote:

so 3. 4. 2021 v 19:37 odesílatel aditya desai <admad123@gmail.com>
napsal:

Hi Justin/Bruce/Pavel,
Thanks for your inputs. After setting force_parallel_mode=off Execution
time of same query was reduced to 1ms from 200 ms. Worked like a charm. We
also increased work_mem to 80=MB. Thanks

super.

The too big max_connection can cause a lot of problems. You should
install and use pgbouncer or pgpool II.

https://scalegrid.io/blog/postgresql-connection-pooling-part-4-pgbouncer-vs-pgpool/

Regards

Pavel

again.

Regards,
Aditya.

On Sat, Apr 3, 2021 at 9:14 PM aditya desai <admad123@gmail.com> wrote:

Thanks Justin. Will review all parameters and get back to you.

On Sat, Apr 3, 2021 at 9:11 PM Justin Pryzby <pryzby@telsasoft.com>
wrote:

On Sat, Apr 03, 2021 at 11:39:19AM -0400, Tom Lane wrote:

Bruce Momjian <bruce@momjian.us> writes:

On Sat, Apr 3, 2021 at 08:38:18PM +0530, aditya desai wrote:

Yes, force_parallel_mode is on. Should we set it off?

Yes. I bet someone set it without reading our docs:

https://www.postgresql.org/docs/13/runtime-config-query.html#RUNTIME-CONFIG-QUERY-OTHER

--> Allows the use of parallel queries for testing purposes even

in cases

--> where no performance benefit is expected.

We might need to clarify this sentence to be clearer it is _only_

for

testing.

I wonder why it is listed under planner options at all, and not under
developer options.

Because it's there to help DBAs catch errors in functions incorrectly
marked as
parallel safe.

--
Justin

#25Justin Pryzby
pryzby@telsasoft.com
In reply to: Bruce Momjian (#19)
4 attachment(s)
[PATCH] force_parallel_mode and GUC categories

Forking this thread
/messages/by-id/20210403154336.GG29125@momjian.us

On Sat, Apr 3, 2021 at 08:38:18PM +0530, aditya desai wrote:

Yes, force_parallel_mode is on. Should we set it off?

Bruce Momjian <bruce@momjian.us> writes:

Yes. I bet someone set it without reading our docs:

...

We might need to clarify this sentence to be clearer it is _only_ for
testing.

On Sat, Apr 03, 2021 at 11:39:19AM -0400, Tom Lane wrote:

I wonder why it is listed under planner options at all, and not under
developer options.

On Sat, Apr 3, 2021 at 10:41:14AM -0500, Justin Pryzby wrote:

Because it's there to help DBAs catch errors in functions incorrectly marked as
parallel safe.

On Sat, Apr 03, 2021 at 11:43:36AM -0400, Bruce Momjian wrote:

Uh, isn't that developer/debugging?

I understood "developer" to mean someone who's debugging postgres itself, not
(say) a function written using pl/pgsql. Like backtrace_functions,
post_auth_delay, jit_profiling_support.

But I see that some "dev" options are more user-facing (for a sufficiently
advanced user):
ignore_checksum_failure, ignore_invalid_pages, zero_damaged_pages.

Also, I understood this to mean the "category" in pg_settings, but I guess
what's important here is the absense of the GUC in the sample/template config
file. pg_settings.category and the sample headings it appears are intended to
be synchronized, but a few of them are out of sync. See attached.

+1 to move this to "developer" options and remove it from the sample config:

# - Other Planner Options -
#force_parallel_mode = off

--
Justin

Attachments:

0001-track_activity_query_size-is-STATS_COLLECTOR-categor.patchtext/x-diff; charset=us-asciiDownload
From ce0c5b99650859bb13f204ea56221ca854a601e1 Mon Sep 17 00:00:00 2001
From: Justin Pryzby <pryzbyj@telsasoft.com>
Date: Sat, 3 Apr 2021 19:06:37 -0500
Subject: [PATCH 1/4] track_activity_query_size is STATS_COLLECTOR category

Not Resource Usage / Memory, as since 995fb7420
---
 contrib/postgres_fdw/postgres_fdw.c | 1 +
 src/backend/utils/misc/guc.c        | 2 +-
 src/include/pg_config_manual.h      | 4 ++--
 3 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/contrib/postgres_fdw/postgres_fdw.c b/contrib/postgres_fdw/postgres_fdw.c
index 16c2979f2d..aff6e8c085 100644
--- a/contrib/postgres_fdw/postgres_fdw.c
+++ b/contrib/postgres_fdw/postgres_fdw.c
@@ -6797,6 +6797,7 @@ fetch_more_data_begin(AsyncRequest *areq)
 	char		sql[64];
 
 	Assert(!fsstate->conn_state->pendingAreq);
+	Assert(fsstate->conn);
 
 	/* Create the cursor synchronously. */
 	if (!fsstate->cursor_exists)
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index 584daffc8a..c315dd4bc1 100644
--- a/src/backend/utils/misc/guc.c
+++ b/src/backend/utils/misc/guc.c
@@ -3435,7 +3435,7 @@ static struct config_int ConfigureNamesInt[] =
 	},
 
 	{
-		{"track_activity_query_size", PGC_POSTMASTER, RESOURCES_MEM,
+		{"track_activity_query_size", PGC_POSTMASTER, STATS_COLLECTOR,
 			gettext_noop("Sets the size reserved for pg_stat_activity.query, in bytes."),
 			NULL,
 			GUC_UNIT_BYTE
diff --git a/src/include/pg_config_manual.h b/src/include/pg_config_manual.h
index e28c990382..fdb4fc1de2 100644
--- a/src/include/pg_config_manual.h
+++ b/src/include/pg_config_manual.h
@@ -288,7 +288,7 @@
  * You should normally use MEMORY_CONTEXT_CHECKING with USE_VALGRIND;
  * instrumentation of repalloc() is inferior without it.
  */
-/* #define USE_VALGRIND */
+#define USE_VALGRIND
 
 /*
  * Define this to cause pfree()'d memory to be cleared immediately, to
@@ -313,7 +313,7 @@
  * facilitate catching code that depends on the contents of uninitialized
  * memory.  Caution: this is horrendously expensive.
  */
-/* #define RANDOMIZE_ALLOCATED_MEMORY */
+#define RANDOMIZE_ALLOCATED_MEMORY
 
 /*
  * For cache invalidation debugging, define CLOBBER_CACHE_ENABLED to enable
-- 
2.17.0

0002-log_autovacuum_min_duration-is-LOGGING_WHAT.patchtext/x-diff; charset=us-asciiDownload
From 6604d8b515ef62e77fea2550e5f040d89fa948f4 Mon Sep 17 00:00:00 2001
From: Justin Pryzby <pryzbyj@telsasoft.com>
Date: Sat, 3 Apr 2021 19:10:01 -0500
Subject: [PATCH 2/4] log_autovacuum_min_duration is LOGGING_WHAT

Not AUTOVACUUM, since 48f7e6439 and ef23a7744
---
 doc/src/sgml/config.sgml                      | 56 +++++++++----------
 src/backend/utils/misc/postgresql.conf.sample |  8 +--
 2 files changed, 32 insertions(+), 32 deletions(-)

diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml
index 9d87b5097a..c4d5126c2a 100644
--- a/doc/src/sgml/config.sgml
+++ b/doc/src/sgml/config.sgml
@@ -6688,6 +6688,34 @@ local0.*    /var/log/postgresql
       </listitem>
      </varlistentry>
 
+     <varlistentry id="guc-log-autovacuum-min-duration" xreflabel="log_autovacuum_min_duration">
+      <term><varname>log_autovacuum_min_duration</varname> (<type>integer</type>)
+      <indexterm>
+       <primary><varname>log_autovacuum_min_duration</varname></primary>
+       <secondary>configuration parameter</secondary>
+      </indexterm>
+      </term>
+      <listitem>
+       <para>
+        Causes each action executed by autovacuum to be logged if it ran for at
+        least the specified amount of time.  Setting this to zero logs
+        all autovacuum actions. <literal>-1</literal> (the default) disables
+        logging autovacuum actions.
+        If this value is specified without units, it is taken as milliseconds.
+        For example, if you set this to
+        <literal>250ms</literal> then all automatic vacuums and analyzes that run
+        250ms or longer will be logged.  In addition, when this parameter is
+        set to any value other than <literal>-1</literal>, a message will be
+        logged if an autovacuum action is skipped due to a conflicting lock or a
+        concurrently dropped relation.  Enabling this parameter can be helpful
+        in tracking autovacuum activity.  This parameter can only be set in
+        the <filename>postgresql.conf</filename> file or on the server command line;
+        but the setting can be overridden for individual tables by
+        changing table storage parameters.
+       </para>
+      </listitem>
+     </varlistentry>
+
      <varlistentry id="guc-log-checkpoints" xreflabel="log_checkpoints">
       <term><varname>log_checkpoints</varname> (<type>boolean</type>)
       <indexterm>
@@ -7662,34 +7690,6 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
       </listitem>
      </varlistentry>
 
-     <varlistentry id="guc-log-autovacuum-min-duration" xreflabel="log_autovacuum_min_duration">
-      <term><varname>log_autovacuum_min_duration</varname> (<type>integer</type>)
-      <indexterm>
-       <primary><varname>log_autovacuum_min_duration</varname></primary>
-       <secondary>configuration parameter</secondary>
-      </indexterm>
-      </term>
-      <listitem>
-       <para>
-        Causes each action executed by autovacuum to be logged if it ran for at
-        least the specified amount of time.  Setting this to zero logs
-        all autovacuum actions. <literal>-1</literal> (the default) disables
-        logging autovacuum actions.
-        If this value is specified without units, it is taken as milliseconds.
-        For example, if you set this to
-        <literal>250ms</literal> then all automatic vacuums and analyzes that run
-        250ms or longer will be logged.  In addition, when this parameter is
-        set to any value other than <literal>-1</literal>, a message will be
-        logged if an autovacuum action is skipped due to a conflicting lock or a
-        concurrently dropped relation.  Enabling this parameter can be helpful
-        in tracking autovacuum activity.  This parameter can only be set in
-        the <filename>postgresql.conf</filename> file or on the server command line;
-        but the setting can be overridden for individual tables by
-        changing table storage parameters.
-       </para>
-      </listitem>
-     </varlistentry>
-
      <varlistentry id="guc-autovacuum-max-workers" xreflabel="autovacuum_max_workers">
       <term><varname>autovacuum_max_workers</varname> (<type>integer</type>)
       <indexterm>
diff --git a/src/backend/utils/misc/postgresql.conf.sample b/src/backend/utils/misc/postgresql.conf.sample
index 30cfddac1f..52c4373a79 100644
--- a/src/backend/utils/misc/postgresql.conf.sample
+++ b/src/backend/utils/misc/postgresql.conf.sample
@@ -568,6 +568,10 @@
 #log_temp_files = -1			# log temporary files equal or larger
 					# than the specified size in kilobytes;
 					# -1 disables, 0 logs all temp files
+#log_autovacuum_min_duration = -1	# -1 disables, 0 logs all actions and
+					# their durations, > 0 logs only
+					# actions running at least this number
+					# of milliseconds.
 #log_timezone = 'GMT'
 
 #------------------------------------------------------------------------------
@@ -608,10 +612,6 @@
 
 #autovacuum = on			# Enable autovacuum subprocess?  'on'
 					# requires track_counts to also be on.
-#log_autovacuum_min_duration = -1	# -1 disables, 0 logs all actions and
-					# their durations, > 0 logs only
-					# actions running at least this number
-					# of milliseconds.
 #autovacuum_max_workers = 3		# max number of autovacuum subprocesses
 					# (change requires restart)
 #autovacuum_naptime = 1min		# time between autovacuum runs
-- 
2.17.0

0003-track_commit_timestamp-is-REPLICATION_SENDING.patchtext/x-diff; charset=us-asciiDownload
From b386aceaece02b57b2c5c5640bbf38d9da99a5e4 Mon Sep 17 00:00:00 2001
From: Justin Pryzby <pryzbyj@telsasoft.com>
Date: Sat, 3 Apr 2021 19:17:03 -0500
Subject: [PATCH 3/4] track_commit_timestamp is REPLICATION_SENDING

If I'm not wrong, this was missed at 4bd8ed31b
---
 src/backend/utils/misc/guc.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index c315dd4bc1..27287599ad 100644
--- a/src/backend/utils/misc/guc.c
+++ b/src/backend/utils/misc/guc.c
@@ -1180,7 +1180,7 @@ static struct config_bool ConfigureNamesBool[] =
 		check_bonjour, NULL, NULL
 	},
 	{
-		{"track_commit_timestamp", PGC_POSTMASTER, REPLICATION,
+		{"track_commit_timestamp", PGC_POSTMASTER, REPLICATION_SENDING,
 			gettext_noop("Collects transaction commit time."),
 			NULL
 		},
-- 
2.17.0

0004-Change-force_parallel_mode-to-a-DEVELOPER-GUC-and-re.patchtext/x-diff; charset=us-asciiDownload
From cd224c1524d60c9b5679a853358b59dad00a35ca Mon Sep 17 00:00:00 2001
From: Justin Pryzby <pryzbyj@telsasoft.com>
Date: Sat, 3 Apr 2021 19:24:50 -0500
Subject: [PATCH 4/4] Change force_parallel_mode to a DEVELOPER GUC, and remove
 it from sample config..

..to help avoid users finding this option and changing it in hopes that it'll
make their queries faster, but without reading the documentation or
understanding what it does.
---
 doc/src/sgml/config.sgml                      | 90 +++++++++----------
 src/backend/utils/misc/guc.c                  |  2 +-
 src/backend/utils/misc/postgresql.conf.sample |  1 -
 3 files changed, 46 insertions(+), 47 deletions(-)

diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml
index c4d5126c2a..5c7c5a39ca 100644
--- a/doc/src/sgml/config.sgml
+++ b/doc/src/sgml/config.sgml
@@ -5788,51 +5788,6 @@ SELECT * FROM parent WHERE key = 2400;
       </listitem>
      </varlistentry>
 
-     <varlistentry id="guc-force-parallel-mode" xreflabel="force_parallel_mode">
-      <term><varname>force_parallel_mode</varname> (<type>enum</type>)
-      <indexterm>
-       <primary><varname>force_parallel_mode</varname> configuration parameter</primary>
-      </indexterm>
-      </term>
-      <listitem>
-       <para>
-        Allows the use of parallel queries for testing purposes even in cases
-        where no performance benefit is expected.
-        The allowed values of <varname>force_parallel_mode</varname> are
-        <literal>off</literal> (use parallel mode only when it is expected to improve
-        performance), <literal>on</literal> (force parallel query for all queries
-        for which it is thought to be safe), and <literal>regress</literal> (like
-        <literal>on</literal>, but with additional behavior changes as explained
-        below).
-       </para>
-
-       <para>
-        More specifically, setting this value to <literal>on</literal> will add
-        a <literal>Gather</literal> node to the top of any query plan for which this
-        appears to be safe, so that the query runs inside of a parallel worker.
-        Even when a parallel worker is not available or cannot be used,
-        operations such as starting a subtransaction that would be prohibited
-        in a parallel query context will be prohibited unless the planner
-        believes that this will cause the query to fail.  If failures or
-        unexpected results occur when this option is set, some functions used
-        by the query may need to be marked <literal>PARALLEL UNSAFE</literal>
-        (or, possibly, <literal>PARALLEL RESTRICTED</literal>).
-       </para>
-
-       <para>
-        Setting this value to <literal>regress</literal> has all of the same effects
-        as setting it to <literal>on</literal> plus some additional effects that are
-        intended to facilitate automated regression testing.  Normally,
-        messages from a parallel worker include a context line indicating that,
-        but a setting of <literal>regress</literal> suppresses this line so that the
-        output is the same as in non-parallel execution.  Also,
-        the <literal>Gather</literal> nodes added to plans by this setting are hidden
-        in <literal>EXPLAIN</literal> output so that the output matches what
-        would be obtained if this setting were turned <literal>off</literal>.
-       </para>
-      </listitem>
-     </varlistentry>
-
      <varlistentry id="guc-plan-cache_mode" xreflabel="plan_cache_mode">
       <term><varname>plan_cache_mode</varname> (<type>enum</type>)
       <indexterm>
@@ -10231,6 +10186,51 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir'
       </listitem>
      </varlistentry>
 
+     <varlistentry id="guc-force-parallel-mode" xreflabel="force_parallel_mode">
+      <term><varname>force_parallel_mode</varname> (<type>enum</type>)
+      <indexterm>
+       <primary><varname>force_parallel_mode</varname> configuration parameter</primary>
+      </indexterm>
+      </term>
+      <listitem>
+       <para>
+        Allows the use of parallel queries for testing purposes even in cases
+        where no performance benefit is expected.
+        The allowed values of <varname>force_parallel_mode</varname> are
+        <literal>off</literal> (use parallel mode only when it is expected to improve
+        performance), <literal>on</literal> (force parallel query for all queries
+        for which it is thought to be safe), and <literal>regress</literal> (like
+        <literal>on</literal>, but with additional behavior changes as explained
+        below).
+       </para>
+
+       <para>
+        More specifically, setting this value to <literal>on</literal> will add
+        a <literal>Gather</literal> node to the top of any query plan for which this
+        appears to be safe, so that the query runs inside of a parallel worker.
+        Even when a parallel worker is not available or cannot be used,
+        operations such as starting a subtransaction that would be prohibited
+        in a parallel query context will be prohibited unless the planner
+        believes that this will cause the query to fail.  If failures or
+        unexpected results occur when this option is set, some functions used
+        by the query may need to be marked <literal>PARALLEL UNSAFE</literal>
+        (or, possibly, <literal>PARALLEL RESTRICTED</literal>).
+       </para>
+
+       <para>
+        Setting this value to <literal>regress</literal> has all of the same effects
+        as setting it to <literal>on</literal> plus some additional effects that are
+        intended to facilitate automated regression testing.  Normally,
+        messages from a parallel worker include a context line indicating that,
+        but a setting of <literal>regress</literal> suppresses this line so that the
+        output is the same as in non-parallel execution.  Also,
+        the <literal>Gather</literal> nodes added to plans by this setting are hidden
+        in <literal>EXPLAIN</literal> output so that the output matches what
+        would be obtained if this setting were turned <literal>off</literal>.
+       </para>
+      </listitem>
+     </varlistentry>
+
      <varlistentry id="guc-ignore-system-indexes" xreflabel="ignore_system_indexes">
       <term><varname>ignore_system_indexes</varname> (<type>boolean</type>)
       <indexterm>
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index 27287599ad..06de7c0308 100644
--- a/src/backend/utils/misc/guc.c
+++ b/src/backend/utils/misc/guc.c
@@ -4840,7 +4840,7 @@ static struct config_enum ConfigureNamesEnum[] =
 	},
 
 	{
-		{"force_parallel_mode", PGC_USERSET, QUERY_TUNING_OTHER,
+		{"force_parallel_mode", PGC_USERSET, DEVELOPER_OPTIONS,
 			gettext_noop("Forces use of parallel query facilities."),
 			gettext_noop("If possible, run query using a parallel worker and with parallel restrictions."),
 			GUC_EXPLAIN
diff --git a/src/backend/utils/misc/postgresql.conf.sample b/src/backend/utils/misc/postgresql.conf.sample
index 52c4373a79..50faa50462 100644
--- a/src/backend/utils/misc/postgresql.conf.sample
+++ b/src/backend/utils/misc/postgresql.conf.sample
@@ -415,7 +415,6 @@
 #from_collapse_limit = 8
 #join_collapse_limit = 8		# 1 disables collapsing of explicit
 					# JOIN clauses
-#force_parallel_mode = off
 #jit = on				# allow JIT compilation
 #plan_cache_mode = auto			# auto, force_generic_plan or
 					# force_custom_plan
-- 
2.17.0

#26aditya desai
admad123@gmail.com
In reply to: aditya desai (#1)
Re: SELECT Query taking 200 ms on PostgreSQL compared to 4 ms on Oracle after migration.

Noted thanks!!

On Sun, Apr 4, 2021 at 4:19 PM Pavel Stehule <pavel.stehule@gmail.com>
wrote:

Show quoted text

ne 4. 4. 2021 v 12:39 odesílatel aditya desai <admad123@gmail.com> napsal:

Hi Pavel,
Notes thanks. We have 64 core cpu and 320 GB RAM.

ok - this is probably good for max thousand connections, maybe less (about
6 hundred). Postgres doesn't perform well, when there are too many active
queries. Other databases have limits for active queries, and then use an
internal queue. But Postgres has nothing similar.

Regards,
Aditya.

On Sat, Apr 3, 2021 at 11:21 PM Pavel Stehule <pavel.stehule@gmail.com>
wrote:

so 3. 4. 2021 v 19:45 odesílatel aditya desai <admad123@gmail.com>
napsal:

Yes. I have made suggestions on connection pooling as well. Currently
it is being done from Application side.

It is usual - but the application side pooling doesn't solve well
overloading. The behaviour of the database is not linear. Usually opened
connections are not active. But any non active connection can be changed to
an active connection (there is not any limit for active connections), and
then the performance can be very very slow. Good pooling and good setting
of max_connections is protection against overloading. max_connection should
be 10-20 x CPU cores (for OLTP)

Regards

Pavel

On Sat, Apr 3, 2021 at 11:12 PM Pavel Stehule <pavel.stehule@gmail.com>
wrote:

so 3. 4. 2021 v 19:37 odesílatel aditya desai <admad123@gmail.com>
napsal:

Hi Justin/Bruce/Pavel,
Thanks for your inputs. After setting force_parallel_mode=off
Execution time of same query was reduced to 1ms from 200 ms. Worked like a
charm. We also increased work_mem to 80=MB. Thanks

super.

The too big max_connection can cause a lot of problems. You should
install and use pgbouncer or pgpool II.

https://scalegrid.io/blog/postgresql-connection-pooling-part-4-pgbouncer-vs-pgpool/

Regards

Pavel

again.

Regards,
Aditya.

On Sat, Apr 3, 2021 at 9:14 PM aditya desai <admad123@gmail.com>
wrote:

Thanks Justin. Will review all parameters and get back to you.

On Sat, Apr 3, 2021 at 9:11 PM Justin Pryzby <pryzby@telsasoft.com>
wrote:

On Sat, Apr 03, 2021 at 11:39:19AM -0400, Tom Lane wrote:

Bruce Momjian <bruce@momjian.us> writes:

On Sat, Apr 3, 2021 at 08:38:18PM +0530, aditya desai wrote:

Yes, force_parallel_mode is on. Should we set it off?

Yes. I bet someone set it without reading our docs:

https://www.postgresql.org/docs/13/runtime-config-query.html#RUNTIME-CONFIG-QUERY-OTHER

--> Allows the use of parallel queries for testing purposes

even in cases

--> where no performance benefit is expected.

We might need to clarify this sentence to be clearer it is

_only_ for

testing.

I wonder why it is listed under planner options at all, and not

under

developer options.

Because it's there to help DBAs catch errors in functions
incorrectly marked as
parallel safe.

--
Justin

#27Justin Pryzby
pryzby@telsasoft.com
In reply to: Justin Pryzby (#25)
4 attachment(s)
Re: [PATCH] force_parallel_mode and GUC categories

The previous patches accidentally included some unrelated changes.

--
Justin

Attachments:

v2-0001-track_activity_query_size-is-STATS_COLLECTOR-cate.patchtext/x-diff; charset=us-asciiDownload
From fd67dd04d1b824a25e113796c235fd9fc9db23e0 Mon Sep 17 00:00:00 2001
From: Justin Pryzby <pryzbyj@telsasoft.com>
Date: Sat, 3 Apr 2021 19:06:37 -0500
Subject: [PATCH v2 1/4] track_activity_query_size is STATS_COLLECTOR category

Not Resource Usage / Memory, as since 995fb7420
---
 src/backend/utils/misc/guc.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index 090abdad8b..e54209995d 100644
--- a/src/backend/utils/misc/guc.c
+++ b/src/backend/utils/misc/guc.c
@@ -3506,7 +3506,7 @@ static struct config_int ConfigureNamesInt[] =
 	},
 
 	{
-		{"track_activity_query_size", PGC_POSTMASTER, RESOURCES_MEM,
+		{"track_activity_query_size", PGC_POSTMASTER, STATS_COLLECTOR,
 			gettext_noop("Sets the size reserved for pg_stat_activity.query, in bytes."),
 			NULL,
 			GUC_UNIT_BYTE
-- 
2.17.0

v2-0002-log_autovacuum_min_duration-is-LOGGING_WHAT.patchtext/x-diff; charset=us-asciiDownload
From bbed9ed2c3c55b0ccd51358a5c62baa07d1a5ee1 Mon Sep 17 00:00:00 2001
From: Justin Pryzby <pryzbyj@telsasoft.com>
Date: Sat, 3 Apr 2021 19:10:01 -0500
Subject: [PATCH v2 2/4] log_autovacuum_min_duration is LOGGING_WHAT

Not AUTOVACUUM, since 48f7e6439 and ef23a7744
---
 doc/src/sgml/config.sgml                      | 56 +++++++++----------
 src/backend/utils/misc/postgresql.conf.sample |  8 +--
 2 files changed, 32 insertions(+), 32 deletions(-)

diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml
index 26628f3e6d..eb154cd669 100644
--- a/doc/src/sgml/config.sgml
+++ b/doc/src/sgml/config.sgml
@@ -6812,6 +6812,34 @@ local0.*    /var/log/postgresql
       </listitem>
      </varlistentry>
 
+     <varlistentry id="guc-log-autovacuum-min-duration" xreflabel="log_autovacuum_min_duration">
+      <term><varname>log_autovacuum_min_duration</varname> (<type>integer</type>)
+      <indexterm>
+       <primary><varname>log_autovacuum_min_duration</varname></primary>
+       <secondary>configuration parameter</secondary>
+      </indexterm>
+      </term>
+      <listitem>
+       <para>
+        Causes each action executed by autovacuum to be logged if it ran for at
+        least the specified amount of time.  Setting this to zero logs
+        all autovacuum actions. <literal>-1</literal> (the default) disables
+        logging autovacuum actions.
+        If this value is specified without units, it is taken as milliseconds.
+        For example, if you set this to
+        <literal>250ms</literal> then all automatic vacuums and analyzes that run
+        250ms or longer will be logged.  In addition, when this parameter is
+        set to any value other than <literal>-1</literal>, a message will be
+        logged if an autovacuum action is skipped due to a conflicting lock or a
+        concurrently dropped relation.  Enabling this parameter can be helpful
+        in tracking autovacuum activity.  This parameter can only be set in
+        the <filename>postgresql.conf</filename> file or on the server command line;
+        but the setting can be overridden for individual tables by
+        changing table storage parameters.
+       </para>
+      </listitem>
+     </varlistentry>
+
      <varlistentry id="guc-log-checkpoints" xreflabel="log_checkpoints">
       <term><varname>log_checkpoints</varname> (<type>boolean</type>)
       <indexterm>
@@ -7827,34 +7855,6 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
       </listitem>
      </varlistentry>
 
-     <varlistentry id="guc-log-autovacuum-min-duration" xreflabel="log_autovacuum_min_duration">
-      <term><varname>log_autovacuum_min_duration</varname> (<type>integer</type>)
-      <indexterm>
-       <primary><varname>log_autovacuum_min_duration</varname></primary>
-       <secondary>configuration parameter</secondary>
-      </indexterm>
-      </term>
-      <listitem>
-       <para>
-        Causes each action executed by autovacuum to be logged if it ran for at
-        least the specified amount of time.  Setting this to zero logs
-        all autovacuum actions. <literal>-1</literal> (the default) disables
-        logging autovacuum actions.
-        If this value is specified without units, it is taken as milliseconds.
-        For example, if you set this to
-        <literal>250ms</literal> then all automatic vacuums and analyzes that run
-        250ms or longer will be logged.  In addition, when this parameter is
-        set to any value other than <literal>-1</literal>, a message will be
-        logged if an autovacuum action is skipped due to a conflicting lock or a
-        concurrently dropped relation.  Enabling this parameter can be helpful
-        in tracking autovacuum activity.  This parameter can only be set in
-        the <filename>postgresql.conf</filename> file or on the server command line;
-        but the setting can be overridden for individual tables by
-        changing table storage parameters.
-       </para>
-      </listitem>
-     </varlistentry>
-
      <varlistentry id="guc-autovacuum-max-workers" xreflabel="autovacuum_max_workers">
       <term><varname>autovacuum_max_workers</varname> (<type>integer</type>)
       <indexterm>
diff --git a/src/backend/utils/misc/postgresql.conf.sample b/src/backend/utils/misc/postgresql.conf.sample
index 9830cfe382..cc9edc410f 100644
--- a/src/backend/utils/misc/postgresql.conf.sample
+++ b/src/backend/utils/misc/postgresql.conf.sample
@@ -575,6 +575,10 @@
 #log_temp_files = -1			# log temporary files equal or larger
 					# than the specified size in kilobytes;
 					# -1 disables, 0 logs all temp files
+#log_autovacuum_min_duration = -1	# -1 disables, 0 logs all actions and
+					# their durations, > 0 logs only
+					# actions running at least this number
+					# of milliseconds.
 #log_timezone = 'GMT'
 
 #------------------------------------------------------------------------------
@@ -616,10 +620,6 @@
 
 #autovacuum = on			# Enable autovacuum subprocess?  'on'
 					# requires track_counts to also be on.
-#log_autovacuum_min_duration = -1	# -1 disables, 0 logs all actions and
-					# their durations, > 0 logs only
-					# actions running at least this number
-					# of milliseconds.
 #autovacuum_max_workers = 3		# max number of autovacuum subprocesses
 					# (change requires restart)
 #autovacuum_naptime = 1min		# time between autovacuum runs
-- 
2.17.0

v2-0003-track_commit_timestamp-is-REPLICATION_SENDING.patchtext/x-diff; charset=us-asciiDownload
From 7cc9fa15f08b7e95fb9d7a00b548e581be5bf40b Mon Sep 17 00:00:00 2001
From: Justin Pryzby <pryzbyj@telsasoft.com>
Date: Sat, 3 Apr 2021 19:17:03 -0500
Subject: [PATCH v2 3/4] track_commit_timestamp is REPLICATION_SENDING

If I'm not wrong, this was missed at 4bd8ed31b
---
 src/backend/utils/misc/guc.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index e54209995d..2b9583cc77 100644
--- a/src/backend/utils/misc/guc.c
+++ b/src/backend/utils/misc/guc.c
@@ -1188,7 +1188,7 @@ static struct config_bool ConfigureNamesBool[] =
 		check_bonjour, NULL, NULL
 	},
 	{
-		{"track_commit_timestamp", PGC_POSTMASTER, REPLICATION,
+		{"track_commit_timestamp", PGC_POSTMASTER, REPLICATION_SENDING,
 			gettext_noop("Collects transaction commit time."),
 			NULL
 		},
-- 
2.17.0

v2-0004-Change-force_parallel_mode-to-a-DEVELOPER-GUC-and.patchtext/x-diff; charset=us-asciiDownload
From 0259b2e7d4b14e2c0c16004a619ac2275cf23c5b Mon Sep 17 00:00:00 2001
From: Justin Pryzby <pryzbyj@telsasoft.com>
Date: Sat, 3 Apr 2021 19:24:50 -0500
Subject: [PATCH v2 4/4] Change force_parallel_mode to a DEVELOPER GUC, and
 remove it from sample config..

..to help avoid users finding this option and changing it in hopes that it'll
make their queries faster, but without reading the documentation or
understanding what it does.
---
 doc/src/sgml/config.sgml                      | 90 +++++++++----------
 src/backend/utils/misc/guc.c                  |  2 +-
 src/backend/utils/misc/postgresql.conf.sample |  1 -
 3 files changed, 46 insertions(+), 47 deletions(-)

diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml
index eb154cd669..4568a5c5a0 100644
--- a/doc/src/sgml/config.sgml
+++ b/doc/src/sgml/config.sgml
@@ -5912,51 +5912,6 @@ SELECT * FROM parent WHERE key = 2400;
       </listitem>
      </varlistentry>
 
-     <varlistentry id="guc-force-parallel-mode" xreflabel="force_parallel_mode">
-      <term><varname>force_parallel_mode</varname> (<type>enum</type>)
-      <indexterm>
-       <primary><varname>force_parallel_mode</varname> configuration parameter</primary>
-      </indexterm>
-      </term>
-      <listitem>
-       <para>
-        Allows the use of parallel queries for testing purposes even in cases
-        where no performance benefit is expected.
-        The allowed values of <varname>force_parallel_mode</varname> are
-        <literal>off</literal> (use parallel mode only when it is expected to improve
-        performance), <literal>on</literal> (force parallel query for all queries
-        for which it is thought to be safe), and <literal>regress</literal> (like
-        <literal>on</literal>, but with additional behavior changes as explained
-        below).
-       </para>
-
-       <para>
-        More specifically, setting this value to <literal>on</literal> will add
-        a <literal>Gather</literal> node to the top of any query plan for which this
-        appears to be safe, so that the query runs inside of a parallel worker.
-        Even when a parallel worker is not available or cannot be used,
-        operations such as starting a subtransaction that would be prohibited
-        in a parallel query context will be prohibited unless the planner
-        believes that this will cause the query to fail.  If failures or
-        unexpected results occur when this option is set, some functions used
-        by the query may need to be marked <literal>PARALLEL UNSAFE</literal>
-        (or, possibly, <literal>PARALLEL RESTRICTED</literal>).
-       </para>
-
-       <para>
-        Setting this value to <literal>regress</literal> has all of the same effects
-        as setting it to <literal>on</literal> plus some additional effects that are
-        intended to facilitate automated regression testing.  Normally,
-        messages from a parallel worker include a context line indicating that,
-        but a setting of <literal>regress</literal> suppresses this line so that the
-        output is the same as in non-parallel execution.  Also,
-        the <literal>Gather</literal> nodes added to plans by this setting are hidden
-        in <literal>EXPLAIN</literal> output so that the output matches what
-        would be obtained if this setting were turned <literal>off</literal>.
-       </para>
-      </listitem>
-     </varlistentry>
-
      <varlistentry id="guc-plan-cache_mode" xreflabel="plan_cache_mode">
       <term><varname>plan_cache_mode</varname> (<type>enum</type>)
       <indexterm>
@@ -10462,6 +10417,51 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir'
       </listitem>
      </varlistentry>
 
+     <varlistentry id="guc-force-parallel-mode" xreflabel="force_parallel_mode">
+      <term><varname>force_parallel_mode</varname> (<type>enum</type>)
+      <indexterm>
+       <primary><varname>force_parallel_mode</varname> configuration parameter</primary>
+      </indexterm>
+      </term>
+      <listitem>
+       <para>
+        Allows the use of parallel queries for testing purposes even in cases
+        where no performance benefit is expected.
+        The allowed values of <varname>force_parallel_mode</varname> are
+        <literal>off</literal> (use parallel mode only when it is expected to improve
+        performance), <literal>on</literal> (force parallel query for all queries
+        for which it is thought to be safe), and <literal>regress</literal> (like
+        <literal>on</literal>, but with additional behavior changes as explained
+        below).
+       </para>
+
+       <para>
+        More specifically, setting this value to <literal>on</literal> will add
+        a <literal>Gather</literal> node to the top of any query plan for which this
+        appears to be safe, so that the query runs inside of a parallel worker.
+        Even when a parallel worker is not available or cannot be used,
+        operations such as starting a subtransaction that would be prohibited
+        in a parallel query context will be prohibited unless the planner
+        believes that this will cause the query to fail.  If failures or
+        unexpected results occur when this option is set, some functions used
+        by the query may need to be marked <literal>PARALLEL UNSAFE</literal>
+        (or, possibly, <literal>PARALLEL RESTRICTED</literal>).
+       </para>
+
+       <para>
+        Setting this value to <literal>regress</literal> has all of the same effects
+        as setting it to <literal>on</literal> plus some additional effects that are
+        intended to facilitate automated regression testing.  Normally,
+        messages from a parallel worker include a context line indicating that,
+        but a setting of <literal>regress</literal> suppresses this line so that the
+        output is the same as in non-parallel execution.  Also,
+        the <literal>Gather</literal> nodes added to plans by this setting are hidden
+        in <literal>EXPLAIN</literal> output so that the output matches what
+        would be obtained if this setting were turned <literal>off</literal>.
+       </para>
+      </listitem>
+     </varlistentry>
+
      <varlistentry id="guc-ignore-system-indexes" xreflabel="ignore_system_indexes">
       <term><varname>ignore_system_indexes</varname> (<type>boolean</type>)
       <indexterm>
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index 2b9583cc77..598813da2d 100644
--- a/src/backend/utils/misc/guc.c
+++ b/src/backend/utils/misc/guc.c
@@ -4922,7 +4922,7 @@ static struct config_enum ConfigureNamesEnum[] =
 	},
 
 	{
-		{"force_parallel_mode", PGC_USERSET, QUERY_TUNING_OTHER,
+		{"force_parallel_mode", PGC_USERSET, DEVELOPER_OPTIONS,
 			gettext_noop("Forces use of parallel query facilities."),
 			gettext_noop("If possible, run query using a parallel worker and with parallel restrictions."),
 			GUC_EXPLAIN
diff --git a/src/backend/utils/misc/postgresql.conf.sample b/src/backend/utils/misc/postgresql.conf.sample
index cc9edc410f..a38fe18886 100644
--- a/src/backend/utils/misc/postgresql.conf.sample
+++ b/src/backend/utils/misc/postgresql.conf.sample
@@ -421,7 +421,6 @@
 #from_collapse_limit = 8
 #join_collapse_limit = 8		# 1 disables collapsing of explicit
 					# JOIN clauses
-#force_parallel_mode = off
 #jit = on				# allow JIT compilation
 #plan_cache_mode = auto			# auto, force_generic_plan or
 					# force_custom_plan
-- 
2.17.0

#28Michael Paquier
michael@paquier.xyz
In reply to: Justin Pryzby (#25)
Re: [PATCH] force_parallel_mode and GUC categories

On Sat, Apr 03, 2021 at 08:25:46PM -0500, Justin Pryzby wrote:

Forking this thread
/messages/by-id/20210403154336.GG29125@momjian.us

Didn't see this one, thanks for forking.

I understood "developer" to mean someone who's debugging postgres itself, not
(say) a function written using pl/pgsql. Like backtrace_functions,
post_auth_delay, jit_profiling_support.

But I see that some "dev" options are more user-facing (for a sufficiently
advanced user):
ignore_checksum_failure, ignore_invalid_pages, zero_damaged_pages.

Also, I understood this to mean the "category" in pg_settings, but I guess
what's important here is the absense of the GUC in the sample/template config
file. pg_settings.category and the sample headings it appears are intended to
be synchronized, but a few of them are out of sync. See attached.

+1 to move this to "developer" options and remove it from the sample config:

# - Other Planner Options -
#force_parallel_mode = off

0001 has some changes to pg_config_manual.h related to valgrind and
memory randomization. You may want to remove that before posting a
patch.

-       {"track_commit_timestamp", PGC_POSTMASTER, REPLICATION,
+       {"track_commit_timestamp", PGC_POSTMASTER, REPLICATION_SENDING,
I can get behind this change for clarity where it gets actively used.
-       {"track_activity_query_size", PGC_POSTMASTER, RESOURCES_MEM,
+       {"track_activity_query_size", PGC_POSTMASTER, STATS_COLLECTOR,
But not this one, because it is a memory setting.
-       {"force_parallel_mode", PGC_USERSET, QUERY_TUNING_OTHER,
+       {"force_parallel_mode", PGC_USERSET, DEVELOPER_OPTIONS,
And not this one either, as it is mainly a planner thing, like the
other parameters in the same area.
The last change is related to log_autovacuum_min_duration, and I can
get behind the argument you are making to group all log activity
parameters together.  Now, about this part:
+#log_autovacuum_min_duration = -1  # -1 disables, 0 logs all actions and
+                   # their durations, > 0 logs only
+                   # actions running at least this number
+                   # of milliseconds.
I think that we should clarify in the description that this is an
autovacuum-only thing, say by appending a small sentence about the
fact that it logs autovacuum activities, in a similar fashion to
log_temp_files.  Moving the parameter out of the autovacuum section
makes it lose a bit of context.

@@ -6903,6 +6903,7 @@ fetch_more_data_begin(AsyncRequest *areq)
char sql[64];

Assert(!fsstate->conn_state->pendingAreq);
+ Assert(fsstate->conn);
What's this diff doing here?
--
Michaelx

#29Justin Pryzby
pryzby@telsasoft.com
In reply to: Michael Paquier (#28)
Re: [PATCH] force_parallel_mode and GUC categories

On Fri, Apr 09, 2021 at 10:50:53AM +0900, Michael Paquier wrote:

On Sat, Apr 03, 2021 at 08:25:46PM -0500, Justin Pryzby wrote:

Forking this thread
/messages/by-id/20210403154336.GG29125@momjian.us

Didn't see this one, thanks for forking.

-       {"force_parallel_mode", PGC_USERSET, QUERY_TUNING_OTHER,
+       {"force_parallel_mode", PGC_USERSET, DEVELOPER_OPTIONS,
And not this one either, as it is mainly a planner thing, like the
other parameters in the same area.

This is the main motive behind the patch.

Developer options aren't shown in postgresql.conf.sample, which it seems like
sometimes people read through quickly, setting a whole bunch of options that
sound good, sometimes including this one. And in the best case they then ask
on -performance why their queries are slow and we tell them to turn it back off
to fix their issues. This changes to no longer put it in .sample, and calling
it a "dev" option seems to be the classification and mechanism by which to do
that.

--
Justin

ps, Maybe you saw that I'd already resent without including the accidental junk
hunks.

#30Bruce Momjian
bruce@momjian.us
In reply to: Justin Pryzby (#29)
Re: [PATCH] force_parallel_mode and GUC categories

On Thu, Apr 8, 2021 at 10:17:18PM -0500, Justin Pryzby wrote:

On Fri, Apr 09, 2021 at 10:50:53AM +0900, Michael Paquier wrote:

On Sat, Apr 03, 2021 at 08:25:46PM -0500, Justin Pryzby wrote:

Forking this thread
/messages/by-id/20210403154336.GG29125@momjian.us

Didn't see this one, thanks for forking.

-       {"force_parallel_mode", PGC_USERSET, QUERY_TUNING_OTHER,
+       {"force_parallel_mode", PGC_USERSET, DEVELOPER_OPTIONS,
And not this one either, as it is mainly a planner thing, like the
other parameters in the same area.

This is the main motive behind the patch.

Developer options aren't shown in postgresql.conf.sample, which it seems like
sometimes people read through quickly, setting a whole bunch of options that
sound good, sometimes including this one. And in the best case they then ask
on -performance why their queries are slow and we tell them to turn it back off
to fix their issues. This changes to no longer put it in .sample, and calling
it a "dev" option seems to be the classification and mechanism by which to do
that.

+1

--
Bruce Momjian <bruce@momjian.us> https://momjian.us
EDB https://enterprisedb.com

If only the physical world exists, free will is an illusion.

#31Michael Paquier
michael@paquier.xyz
In reply to: Bruce Momjian (#30)
Re: [PATCH] force_parallel_mode and GUC categories

On Fri, Apr 09, 2021 at 07:39:28AM -0400, Bruce Momjian wrote:

On Thu, Apr 8, 2021 at 10:17:18PM -0500, Justin Pryzby wrote:

This is the main motive behind the patch.

Developer options aren't shown in postgresql.conf.sample, which it seems like
sometimes people read through quickly, setting a whole bunch of options that
sound good, sometimes including this one. And in the best case they then ask
on -performance why their queries are slow and we tell them to turn it back off
to fix their issues. This changes to no longer put it in .sample, and calling
it a "dev" option seems to be the classification and mechanism by which to do
that.

+1

Hm. I can see the point you are making based on the bug report that
has led to this thread:
/messages/by-id/CAN0SRDFV=Fv0zXHCGbh7gh=MTfw05Xd1x7gjJrZs5qn-TEphOw@mail.gmail.com

However, I'd like to think that we can do better than what's proposed
in the patch. There are a couple of things to consider here:
- Should the parameter be renamed to reflect that it should only be
used for testing purposes?
- Should we make more general the description of the developer options
in the docs?

I have applied the patch for log_autovacuum_min_duration for now, as
this one is clearly wrong.
--
Michael

#32Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: Michael Paquier (#31)
Re: [PATCH] force_parallel_mode and GUC categories

On Mon, Apr 12, 2021 at 10:31 AM Michael Paquier <michael@paquier.xyz> wrote:

On Fri, Apr 09, 2021 at 07:39:28AM -0400, Bruce Momjian wrote:

On Thu, Apr 8, 2021 at 10:17:18PM -0500, Justin Pryzby wrote:

This is the main motive behind the patch.

Developer options aren't shown in postgresql.conf.sample, which it seems like
sometimes people read through quickly, setting a whole bunch of options that
sound good, sometimes including this one. And in the best case they then ask
on -performance why their queries are slow and we tell them to turn it back off
to fix their issues. This changes to no longer put it in .sample, and calling
it a "dev" option seems to be the classification and mechanism by which to do
that.

+1

Hm. I can see the point you are making based on the bug report that
has led to this thread:
/messages/by-id/CAN0SRDFV=Fv0zXHCGbh7gh=MTfw05Xd1x7gjJrZs5qn-TEphOw@mail.gmail.com

However, I'd like to think that we can do better than what's proposed
in the patch. There are a couple of things to consider here:
- Should the parameter be renamed to reflect that it should only be
used for testing purposes?
- Should we make more general the description of the developer options
in the docs?

IMO, categorizing force_parallel_mode to DEVELOPER_OPTIONS and moving
it to the "Developer Options" section in config.sgml looks
appropriate. So, the v2-0004 patch proposed by Justin at [1]/messages/by-id/20210408213812.GA18734@telsasoft.com looks
good to me. If there are any other GUCs that are not meant to be used
in production, IMO we could follow the same.

[1]: /messages/by-id/20210408213812.GA18734@telsasoft.com

With Regards,
Bharath Rupireddy.
EnterpriseDB: http://www.enterprisedb.com

#33Tom Lane
tgl@sss.pgh.pa.us
In reply to: Michael Paquier (#31)
Re: [PATCH] force_parallel_mode and GUC categories

Michael Paquier <michael@paquier.xyz> writes:

However, I'd like to think that we can do better than what's proposed
in the patch. There are a couple of things to consider here:
- Should the parameter be renamed to reflect that it should only be
used for testing purposes?

-1 to that part, because it would break a bunch of buildfarm animals'
configurations. I doubt that any gain in clarity would be worth it.

- Should we make more general the description of the developer options
in the docs?

Perhaps ... what did you have in mind?

regards, tom lane

#34Michael Paquier
michael@paquier.xyz
In reply to: Tom Lane (#33)
Re: [PATCH] force_parallel_mode and GUC categories

On Mon, Apr 12, 2021 at 01:40:52AM -0400, Tom Lane wrote:

Michael Paquier <michael@paquier.xyz> writes:

However, I'd like to think that we can do better than what's proposed
in the patch. There are a couple of things to consider here:
- Should the parameter be renamed to reflect that it should only be
used for testing purposes?

-1 to that part, because it would break a bunch of buildfarm animals'
configurations. I doubt that any gain in clarity would be worth it.

Okay.

- Should we make more general the description of the developer options
in the docs?

Perhaps ... what did you have in mind?

The first sentence of the page now says that:
"The following parameters are intended for work on the PostgreSQL
source code, and in some cases to assist with recovery of severely
damaged databases."

That does not stick with force_parallel_mode IMO. Maybe:
"The following parameters are intended for development work related to
PostgreSQL. Some of them work on the PostgreSQL source code, some of
them can be used to control the run-time behavior of the server, and
in some cases they can be used to assist with the recovery of severely
damaged databases."
--
Michael

#35Justin Pryzby
pryzby@telsasoft.com
In reply to: Michael Paquier (#34)
3 attachment(s)
Re: [PATCH] force_parallel_mode and GUC categories

On Tue, Apr 13, 2021 at 04:34:23PM +0900, Michael Paquier wrote:

On Mon, Apr 12, 2021 at 01:40:52AM -0400, Tom Lane wrote:

- Should we make more general the description of the developer options
in the docs?

Perhaps ... what did you have in mind?

The first sentence of the page now says that:
"The following parameters are intended for work on the PostgreSQL
source code, and in some cases to assist with recovery of severely
damaged databases."

That does not stick with force_parallel_mode IMO. Maybe:

Good point.

--
Justin

Attachments:

v3-0001-track_activity_query_size-is-STATS_COLLECTOR-cate.patchtext/x-diff; charset=us-asciiDownload
From b5355f3384df1aab87e4cb89afcf4d9703c14bdb Mon Sep 17 00:00:00 2001
From: Justin Pryzby <pryzbyj@telsasoft.com>
Date: Sat, 3 Apr 2021 19:06:37 -0500
Subject: [PATCH v3 1/3] track_activity_query_size is STATS_COLLECTOR category

Not Resource Usage / Memory, as since 995fb7420
---
 src/backend/utils/misc/guc.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index d0a51b507d..e65d62e71d 100644
--- a/src/backend/utils/misc/guc.c
+++ b/src/backend/utils/misc/guc.c
@@ -3506,7 +3506,7 @@ static struct config_int ConfigureNamesInt[] =
 	},
 
 	{
-		{"track_activity_query_size", PGC_POSTMASTER, RESOURCES_MEM,
+		{"track_activity_query_size", PGC_POSTMASTER, STATS_COLLECTOR,
 			gettext_noop("Sets the size reserved for pg_stat_activity.query, in bytes."),
 			NULL,
 			GUC_UNIT_BYTE
-- 
2.17.0

v3-0002-track_commit_timestamp-is-REPLICATION_SENDING.patchtext/x-diff; charset=us-asciiDownload
From b491b4520f157fb1328925f500f15fe2ef8e457c Mon Sep 17 00:00:00 2001
From: Justin Pryzby <pryzbyj@telsasoft.com>
Date: Sat, 3 Apr 2021 19:17:03 -0500
Subject: [PATCH v3 2/3] track_commit_timestamp is REPLICATION_SENDING

If I'm not wrong, this was missed at 4bd8ed31b
---
 src/backend/utils/misc/guc.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index e65d62e71d..a3c2ebbc53 100644
--- a/src/backend/utils/misc/guc.c
+++ b/src/backend/utils/misc/guc.c
@@ -1188,7 +1188,7 @@ static struct config_bool ConfigureNamesBool[] =
 		check_bonjour, NULL, NULL
 	},
 	{
-		{"track_commit_timestamp", PGC_POSTMASTER, REPLICATION,
+		{"track_commit_timestamp", PGC_POSTMASTER, REPLICATION_SENDING,
 			gettext_noop("Collects transaction commit time."),
 			NULL
 		},
-- 
2.17.0

v3-0003-Change-force_parallel_mode-to-a-DEVELOPER-GUC-and.patchtext/x-diff; charset=us-asciiDownload
From e9b556f2bc75dc8350759e4b32e588325086218e Mon Sep 17 00:00:00 2001
From: Justin Pryzby <pryzbyj@telsasoft.com>
Date: Sat, 3 Apr 2021 19:24:50 -0500
Subject: [PATCH v3 3/3] Change force_parallel_mode to a DEVELOPER GUC, and
 remove it from sample config..

..to discourage users from changing this option in hopes that it'll make their
queries faster, but without reading the documentation or understanding what it
does.
---
 doc/src/sgml/config.sgml                      | 96 ++++++++++---------
 src/backend/utils/misc/guc.c                  |  2 +-
 src/backend/utils/misc/postgresql.conf.sample |  1 -
 3 files changed, 50 insertions(+), 49 deletions(-)

diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml
index f749fe9ce7..a7350c6ddc 100644
--- a/doc/src/sgml/config.sgml
+++ b/doc/src/sgml/config.sgml
@@ -5912,51 +5912,6 @@ SELECT * FROM parent WHERE key = 2400;
       </listitem>
      </varlistentry>
 
-     <varlistentry id="guc-force-parallel-mode" xreflabel="force_parallel_mode">
-      <term><varname>force_parallel_mode</varname> (<type>enum</type>)
-      <indexterm>
-       <primary><varname>force_parallel_mode</varname> configuration parameter</primary>
-      </indexterm>
-      </term>
-      <listitem>
-       <para>
-        Allows the use of parallel queries for testing purposes even in cases
-        where no performance benefit is expected.
-        The allowed values of <varname>force_parallel_mode</varname> are
-        <literal>off</literal> (use parallel mode only when it is expected to improve
-        performance), <literal>on</literal> (force parallel query for all queries
-        for which it is thought to be safe), and <literal>regress</literal> (like
-        <literal>on</literal>, but with additional behavior changes as explained
-        below).
-       </para>
-
-       <para>
-        More specifically, setting this value to <literal>on</literal> will add
-        a <literal>Gather</literal> node to the top of any query plan for which this
-        appears to be safe, so that the query runs inside of a parallel worker.
-        Even when a parallel worker is not available or cannot be used,
-        operations such as starting a subtransaction that would be prohibited
-        in a parallel query context will be prohibited unless the planner
-        believes that this will cause the query to fail.  If failures or
-        unexpected results occur when this option is set, some functions used
-        by the query may need to be marked <literal>PARALLEL UNSAFE</literal>
-        (or, possibly, <literal>PARALLEL RESTRICTED</literal>).
-       </para>
-
-       <para>
-        Setting this value to <literal>regress</literal> has all of the same effects
-        as setting it to <literal>on</literal> plus some additional effects that are
-        intended to facilitate automated regression testing.  Normally,
-        messages from a parallel worker include a context line indicating that,
-        but a setting of <literal>regress</literal> suppresses this line so that the
-        output is the same as in non-parallel execution.  Also,
-        the <literal>Gather</literal> nodes added to plans by this setting are hidden
-        in <literal>EXPLAIN</literal> output so that the output matches what
-        would be obtained if this setting were turned <literal>off</literal>.
-       </para>
-      </listitem>
-     </varlistentry>
-
      <varlistentry id="guc-plan-cache_mode" xreflabel="plan_cache_mode">
       <term><varname>plan_cache_mode</varname> (<type>enum</type>)
       <indexterm>
@@ -10374,8 +10329,10 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir'
     <title>Developer Options</title>
 
     <para>
-     The following parameters are intended for work on the
-     <productname>PostgreSQL</productname> source code, and in some cases
+     The following parameters are intended for development with
+     <productname>PostgreSQL</productname>.  Some of them are useful while
+     writing SQL queries, some of them are useful when
+     working on the source code of PostgreSQL itself, and
      to assist with recovery of severely damaged databases.  There
      should be no reason to use them on a production database.
      As such, they have been excluded from the sample
@@ -10464,6 +10421,51 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir'
       </listitem>
      </varlistentry>
 
+     <varlistentry id="guc-force-parallel-mode" xreflabel="force_parallel_mode">
+      <term><varname>force_parallel_mode</varname> (<type>enum</type>)
+      <indexterm>
+       <primary><varname>force_parallel_mode</varname> configuration parameter</primary>
+      </indexterm>
+      </term>
+      <listitem>
+       <para>
+        Allows the use of parallel queries for testing purposes even in cases
+        where no performance benefit is expected.
+        The allowed values of <varname>force_parallel_mode</varname> are
+        <literal>off</literal> (use parallel mode only when it is expected to improve
+        performance), <literal>on</literal> (force parallel query for all queries
+        for which it is thought to be safe), and <literal>regress</literal> (like
+        <literal>on</literal>, but with additional behavior changes as explained
+        below).
+       </para>
+
+       <para>
+        More specifically, setting this value to <literal>on</literal> will add
+        a <literal>Gather</literal> node to the top of any query plan for which this
+        appears to be safe, so that the query runs inside of a parallel worker.
+        Even when a parallel worker is not available or cannot be used,
+        operations such as starting a subtransaction that would be prohibited
+        in a parallel query context will be prohibited unless the planner
+        believes that this will cause the query to fail.  If failures or
+        unexpected results occur when this option is set, some functions used
+        by the query may need to be marked <literal>PARALLEL UNSAFE</literal>
+        (or, possibly, <literal>PARALLEL RESTRICTED</literal>).
+       </para>
+
+       <para>
+        Setting this value to <literal>regress</literal> has all of the same effects
+        as setting it to <literal>on</literal> plus some additional effects that are
+        intended to facilitate automated regression testing.  Normally,
+        messages from a parallel worker include a context line indicating that,
+        but a setting of <literal>regress</literal> suppresses this line so that the
+        output is the same as in non-parallel execution.  Also,
+        the <literal>Gather</literal> nodes added to plans by this setting are hidden
+        in <literal>EXPLAIN</literal> output so that the output matches what
+        would be obtained if this setting were turned <literal>off</literal>.
+       </para>
+      </listitem>
+     </varlistentry>
+
      <varlistentry id="guc-ignore-system-indexes" xreflabel="ignore_system_indexes">
       <term><varname>ignore_system_indexes</varname> (<type>boolean</type>)
       <indexterm>
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index a3c2ebbc53..b8738561e6 100644
--- a/src/backend/utils/misc/guc.c
+++ b/src/backend/utils/misc/guc.c
@@ -4922,7 +4922,7 @@ static struct config_enum ConfigureNamesEnum[] =
 	},
 
 	{
-		{"force_parallel_mode", PGC_USERSET, QUERY_TUNING_OTHER,
+		{"force_parallel_mode", PGC_USERSET, DEVELOPER_OPTIONS,
 			gettext_noop("Forces use of parallel query facilities."),
 			gettext_noop("If possible, run query using a parallel worker and with parallel restrictions."),
 			GUC_EXPLAIN
diff --git a/src/backend/utils/misc/postgresql.conf.sample b/src/backend/utils/misc/postgresql.conf.sample
index 2f6dd014a8..0f7f49b949 100644
--- a/src/backend/utils/misc/postgresql.conf.sample
+++ b/src/backend/utils/misc/postgresql.conf.sample
@@ -421,7 +421,6 @@
 #from_collapse_limit = 8
 #join_collapse_limit = 8		# 1 disables collapsing of explicit
 					# JOIN clauses
-#force_parallel_mode = off
 #jit = on				# allow JIT compilation
 #plan_cache_mode = auto			# auto, force_generic_plan or
 					# force_custom_plan
-- 
2.17.0

#36Tom Lane
tgl@sss.pgh.pa.us
In reply to: Michael Paquier (#34)
Re: [PATCH] force_parallel_mode and GUC categories

Michael Paquier <michael@paquier.xyz> writes:

On Mon, Apr 12, 2021 at 01:40:52AM -0400, Tom Lane wrote:

Perhaps ... what did you have in mind?

The first sentence of the page now says that:
"The following parameters are intended for work on the PostgreSQL
source code, and in some cases to assist with recovery of severely
damaged databases."

That does not stick with force_parallel_mode IMO. Maybe:
"The following parameters are intended for development work related to
PostgreSQL. Some of them work on the PostgreSQL source code, some of
them can be used to control the run-time behavior of the server, and
in some cases they can be used to assist with the recovery of severely
damaged databases."

I think that's overly wordy. Maybe

The following parameters are intended for developer testing, and
should never be enabled for production work. However, some of
them can be used to assist with the recovery of severely
damaged databases.

regards, tom lane

#37Michael Paquier
michael@paquier.xyz
In reply to: Tom Lane (#36)
Re: [PATCH] force_parallel_mode and GUC categories

On Tue, Apr 13, 2021 at 10:12:35AM -0400, Tom Lane wrote:

The following parameters are intended for developer testing, and
should never be enabled for production work. However, some of
them can be used to assist with the recovery of severely
damaged databases.

Okay, that's fine by me.
--
Michael

#38Michael Paquier
michael@paquier.xyz
In reply to: Justin Pryzby (#35)
Re: [PATCH] force_parallel_mode and GUC categories

On Tue, Apr 13, 2021 at 07:31:39AM -0500, Justin Pryzby wrote:

Good point.

Thanks. I have used the wording that Tom has proposed upthread, added
one GUC_NOT_IN_SAMPLE that you forgot, and applied the
force_parallel_mode patch.
--
Michael

#39Justin Pryzby
pryzby@telsasoft.com
In reply to: Michael Paquier (#38)
Re: [PATCH] force_parallel_mode and GUC categories

On Wed, Apr 14, 2021 at 03:57:21PM +0900, Michael Paquier wrote:

On Tue, Apr 13, 2021 at 07:31:39AM -0500, Justin Pryzby wrote:

Good point.

Thanks. I have used the wording that Tom has proposed upthread, added
one GUC_NOT_IN_SAMPLE that you forgot, and applied the
force_parallel_mode patch.

Thanks. It just occured to me to ask if we should backpatch it.
The goal is to avoid someone trying to use this as a peformance option.

It's to their benefit and ours if they don't do that on v10-13 for the next 5
years, not just v14-17.

The patch seems to apply cleanly on v12 but cherry-pick needs help for other
branches...

--
Justin

#40Michael Paquier
michael@paquier.xyz
In reply to: Justin Pryzby (#39)
Re: [PATCH] force_parallel_mode and GUC categories

On Fri, Apr 23, 2021 at 01:23:26PM -0500, Justin Pryzby wrote:

The patch seems to apply cleanly on v12 but cherry-pick needs help for other
branches...

FWIW, this did not seem bad enough to me to require a back-patch.
This parameter got introduced in 2016 and this was the only report
related to it for the last 5 years.
--
Michael

#41Justin Pryzby
pryzby@telsasoft.com
In reply to: Michael Paquier (#40)
Re: [PATCH] force_parallel_mode and GUC categories

On Sat, Apr 24, 2021 at 10:50:21AM +0900, Michael Paquier wrote:

On Fri, Apr 23, 2021 at 01:23:26PM -0500, Justin Pryzby wrote:

The patch seems to apply cleanly on v12 but cherry-pick needs help for other
branches...

FWIW, this did not seem bad enough to me to require a back-patch.
This parameter got introduced in 2016 and this was the only report
related to it for the last 5 years.

No, it's not the first report - although I'm surprised I wasn't able to find
more than these.

/messages/by-id/20190102164525.GU25379@telsasoft.com
/messages/by-id/CAKJS1f_Qi0iboCos3wu6QiAbdF-9FoK57wxzKbe2-WcesN4rFA@mail.gmail.com

--
Justin

#42Justin Pryzby
pryzby@telsasoft.com
In reply to: Michael Paquier (#28)
Re: [PATCH] force_parallel_mode and GUC categories

On Fri, Apr 09, 2021 at 10:50:53AM +0900, Michael Paquier wrote:

-       {"track_commit_timestamp", PGC_POSTMASTER, REPLICATION,
+       {"track_commit_timestamp", PGC_POSTMASTER, REPLICATION_SENDING,
I can get behind this change for clarity where it gets actively used.

I'm not sure what you meant?

...but, I realized just now that *zero* other GUCs use "REPLICATION".
And the documentation puts it in 20.6.1. Sending Servers,
so it still seems to me that this is correct to move this, too.

https://www.postgresql.org/docs/devel/runtime-config-replication.html

Then, I wonder if REPLICATION should be removed from guc_tables.h...

--
Justin

#43Tom Lane
tgl@sss.pgh.pa.us
In reply to: Justin Pryzby (#42)
Re: [PATCH] force_parallel_mode and GUC categories

Justin Pryzby <pryzby@telsasoft.com> writes:

...but, I realized just now that *zero* other GUCs use "REPLICATION".
And the documentation puts it in 20.6.1. Sending Servers,
so it still seems to me that this is correct to move this, too.
https://www.postgresql.org/docs/devel/runtime-config-replication.html
Then, I wonder if REPLICATION should be removed from guc_tables.h...

For the archives' sake --- these things are now committed as part of
a55a98477. I'd forgotten this thread, and then rediscovered the same
inconsistencies as Justin had while reviewing Bharath Rupireddy's patch
for bug #16997 [1]/messages/by-id/16997-ff16127f6e0d1390@postgresql.org.

I think this thread can now be closed off as done. However, there
are some open issues mentioned in the other thread, if anyone here
wants to comment.

regards, tom lane

[1]: /messages/by-id/16997-ff16127f6e0d1390@postgresql.org