Hi Vadim, Too much of shared buffers allocation also causes problem. Read the documentation.
Regards, Pavan On Wed, Jun 13, 2018, 3:23 PM Vadim Nevorotin <nevoro...@gmail.com> wrote: > I have a very strange problem. I'm using PostgreSQL 9.6 with PostGIS 2.3 > (both from Debian Strecth repos) to store DB for OSM server (but actually > it doesn't matter). And I've noticed, that on each new connection to DB > first query is much slower (10x) than all others. E.g.: > > $ psql test_gis > psql (9.6.7) > Type "help" for help. > test_gis=# \timing > Timing is on. > test_gis=# SELECT srid FROM geometry_columns WHERE > f_table_name='planet_osm_polygon' AND f_geometry_column='way'; > srid > ------ > 3857 > (1 row) > Time: 52.889 ms > test_gis=# SELECT srid FROM geometry_columns WHERE > f_table_name='planet_osm_polygon' AND f_geometry_column='way'; > srid > ------ > 3857 > (1 row) > Time: 2.070 ms > test_gis=# > > If I run others instances of psql in parallel, when the first is active - > they has absolutely the same problem. In one instance of psql query is fast > (if it's not the first query), in others - first query is slow, but all > others is fast. > > EXPLAIN (ANALYZE, BUFFERS) for the first query shows very strange timings: > > QUERY PLAN > > > -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- > > Nested Loop Left Join (cost=0.82..26.41 rows=1 width=4) *(actual > time=49.290..49.297 rows=1 loops=1)* > Join Filter: ((s_2.connamespace = n.oid) AND (s_2.conrelid = c.oid) AND > (a.attnum = ANY (s_2.conkey))) > Buffers: shared hit=18 > -> Nested Loop Left Join (cost=0.82..25.28 rows=1 width=14) (actual > time=0.135..0.141 rows=1 loops=1) > Join Filter: ((s_1.connamespace = n.oid) AND (s_1.conrelid = > c.oid) AND (a.attnum = ANY (s_1.conkey))) > Buffers: shared hit=17 > -> Nested Loop Left Join (cost=0.82..24.16 rows=1 width=14) > (actual time=0.126..0.132 rows=1 loops=1) > Join Filter: ((s.connamespace = n.oid) AND (s.conrelid = > c.oid) AND (a.attnum = ANY (s.conkey))) > Buffers: shared hit=16 > -> Nested Loop (cost=0.82..23.05 rows=1 width=14) (actual > time=0.083..0.089 rows=1 loops=1) > Buffers: shared hit=15 > -> Nested Loop (cost=0.55..17.75 rows=1 width=18) > (actual time=0.078..0.082 rows=1 loops=1) > Join Filter: (c.relnamespace = n.oid) > Rows Removed by Join Filter: 5 > Buffers: shared hit=12 > -> Nested Loop (cost=0.55..16.61 rows=1 > width=18) (actual time=0.072..0.074 rows=1 loops=1) > Buffers: shared hit=11 > -> Index Scan using > pg_class_relname_nsp_index on pg_class c (cost=0.27..8.30 rows=1 width=8) > (actual time=0.049..0.050 rows=1 loops=1) > Index Cond: (relname = > 'planet_osm_polygon'::name) > Filter: ((NOT > pg_is_other_temp_schema(relnamespace)) AND has_table_privilege(oid, > 'SELECT'::text) AND (relkind = ANY ('{r,v,m,f}'::"char"[]))) > Buffers: shared hit=8 > -> Index Scan using > pg_attribute_relid_attnam_index on pg_attribute a (cost=0.28..8.30 rows=1 > width=14) (actual time=0.021..0.021 rows=1 loops=1) > Index Cond: ((attrelid = c.oid) AND > (attname = 'way'::name)) > Filter: (NOT attisdropped) > Buffers: shared hit=3 > -> Seq Scan on pg_namespace n > (cost=0.00..1.06 rows=6 width=4) (actual time=0.003..0.004 rows=6 loops=1) > Buffers: shared hit=1 > -> Index Scan using pg_type_oid_index on pg_type t > (cost=0.27..5.29 rows=1 width=4) (actual time=0.005..0.007 rows=1 loops=1) > Index Cond: (oid = a.atttypid) > Filter: (typname = 'geometry'::name) > Buffers: shared hit=3 > -> Seq Scan on pg_constraint s (cost=0.00..1.09 rows=1 > width=31) (actual time=0.041..0.041 rows=0 loops=1) > Filter: (consrc ~~* '%geometrytype(% = %'::text) > Rows Removed by Filter: 7 > Buffers: shared hit=1 > -> Seq Scan on pg_constraint s_1 (cost=0.00..1.09 rows=1 > width=31) (actual time=0.009..0.009 rows=0 loops=1) > Filter: (consrc ~~* '%ndims(% = %'::text) > Rows Removed by Filter: 7 > Buffers: shared hit=1 > -> Seq Scan on pg_constraint s_2 (cost=0.00..1.09 rows=1 width=77) > (actual time=0.011..0.011 rows=0 loops=1) > Filter: (consrc ~~* '%srid(% = %'::text) > Rows Removed by Filter: 7 > Buffers: shared hit=1 > > * Planning time: 2.589 ms Execution time: 49.467 ms* > > (45 rows) > > The same problem is when connecting to PostgreSQL from Mapnik, so it's not > a psql problem. We have a lot of memory (shared_buffers = 20GB, work_mem > = 100MB) and a very small db (we've upload to empty db data only for one > very small county). So I'm absolutely sure that it's the problem of main > PostgreSQL. > > And there are two questions: why this problem occurs and how can I fix it? >