Hello folks! I am having a complex query slowing over time increasing in duration. If anyone has a few cycles that they could lend a hand or just point me in the right direction with this – I would surely appreciate it! Fairly beefy Linux server with
Postgres 12 (latest) – this particular query has been getting slower over time & seemingly slowing everything else down. The server is dedicated entirely to this particular database. Let me know if I can provide any additional information!! Thanks in advance! Here’s my background – Linux RHEL 8 – PostgreSQL 12.17. – MemTotal:
263216840 kB MemFree:
3728224 kB MemAvailable:
197186864 kB Buffers:
6704 kB Cached:
204995024 kB SwapCached:
19244 kB free -m total
used
free shared
buff/cache
available Mem:
257047
51860 3722
10718
201464
192644 Swap:
4095
855 3240 Here are a few of the settings in our postgres server: max_connections = 300
# (change requires restart) shared_buffers = 10GB temp_buffers = 24MB work_mem = 2GB maintenance_work_mem = 1GB most everything else is set to the default. The query is complex with several joins: SELECT anon_1.granule_collection_id AS anon_1_granule_collection_id, anon_1.granule_create_date AS anon_1_granule_create_date, anon_1.granule_delete_date AS anon_1_granule_delete_date, ST_AsGeoJSON(anon_1.granule_geography) AS
anon_1_granule_geography, ST_AsGeoJSON(anon_1.granule_geometry) AS anon_1_granule_geometry, anon_1.granule_is_active AS anon_1_granule_is_active, anon_1.granule_properties AS anon_1_granule_properties, anon_1.granule_update_date AS anon_1_granule_update_date,
anon_1.granule_uuid AS anon_1_granule_uuid, anon_1.granule_visibility_last_update_date AS anon_1_granule_visibility_last_update_date, anon_1.granule_visibility_id AS anon_1_granule_visibility_id, collection_1.id AS collection_1_id, collection_1.entry_id AS
collection_1_entry_id, collection_1.short_name AS collection_1_short_name, collection_1.version AS collection_1_version, file_1.id AS file_1_id, file_1.location AS file_1_location, file_1.md5 AS file_1_md5, file_1.name AS file_1_name, file_1.size AS file_1_size,
file_1.type AS file_1_type, visibility_1.id AS visibility_1_id, visibility_1.name AS visibility_1_name, visibility_1.value AS visibility_1_value FROM (SELECT granule.collection_id AS granule_collection_id, granule.create_date AS granule_create_date, granule.delete_date AS granule_delete_date, granule.geography AS granule_geography,
granule.geometry AS granule_geometry, granule.is_active AS granule_is_active, granule.properties AS granule_properties, granule.update_date AS granule_update_date, granule.uuid AS granule_uuid, granule.visibility_last_update_date AS granule_visibility_last_update_date,
granule.visibility_id AS granule_visibility_id FROM granule JOIN collection ON collection.id = granule.collection_id WHERE granule.is_active = true AND (collection.entry_id LIKE 'AJAX_CO2_CH4_1' OR collection.entry_id LIKE 'AJAX_O3_1' OR collection.entry_id LIKE 'AJAX_CH2O_1' OR collection.entry_id
LIKE 'AJAX_MMS_1') AND ((granule.properties #>> '{temporal_extent, range_date_times, 0, beginning_date_time}') > '2015-10-06T23:59:59+00:00' OR (granule.properties #>> '{temporal_extent, single_date_times, 0}') > '2015-10-06T23:59:59+00:00' OR (granule.properties
#>> '{temporal_extent, periodic_date_times, 0, start_date}') > '2015-10-06T23:59:59+00:00') AND ((granule.properties #>> '{temporal_extent, range_date_times, 0, end_date_time}') < '2015-10-09T00:00:00+00:00' OR (granule.properties #>> '{temporal_extent, single_date_times,
0}') < '2015-10-09T00:00:00+00:00' OR (granule.properties #>> '{temporal_extent, periodic_date_times, 0, end_date}') < '2015-10-09T00:00:00+00:00') ORDER BY granule.uuid LIMIT 26) AS anon_1 LEFT OUTER JOIN collection AS collection_1 ON collection_1.id = anon_1.granule_collection_id LEFT OUTER JOIN (granule_file AS granule_file_1 JOIN file AS
file_1 ON file_1.id = granule_file_1.file_id) ON anon_1.granule_uuid = granule_file_1.granule_uuid LEFT OUTER JOIN visibility AS visibility_1 ON visibility_1.id = anon_1.granule_visibility_id ORDER BY anon_1.granule_uuid Here’s the explain: Sort
(cost=10914809.92..10914810.27 rows=141 width=996) Sort Key: granule.uuid ->
Hash Left Join
(cost=740539.73..10914804.89 rows=141 width=996) Hash Cond: (granule.visibility_id = visibility_1.id) ->
Hash Right Join
(cost=740537.56..10914731.81 rows=141 width=1725) Hash Cond: (granule_file_1.granule_uuid = granule.uuid) ->
Hash Join
(cost=644236.90..10734681.93 rows=22332751 width=223) Hash Cond: (file_1.id = granule_file_1.file_id) ->
Seq Scan on file file_1
(cost=0.00..9205050.88 rows=22068888 width=207) ->
Hash (cost=365077.51..365077.51 rows=22332751 width=20)
-> Seq Scan on granule_file granule_file_1
(cost=0.00..365077.51 rows=22332751 width=20) ->
Hash (cost=96300.33..96300.33 rows=26 width=1518) ->
Nested Loop Left Join
(cost=96092.55..96300.33 rows=26 width=1518)
-> Limit
(cost=96092.27..96092.33 rows=26 width=1462)
-> Sort
(cost=96092.27..96100.47 rows=3282 width=1462)
Sort Key: granule.uuid
-> Nested Loop
(cost=0.56..95998.73 rows=3282 width=1462)
-> Seq Scan on collection
(cost=0.00..3366.24 rows=1 width=4)
Filter: (((entry_id)::text ~~ 'AJAX_CO2_CH4_1'::text) OR ((entry_id)::text ~~ 'AJAX_O3_1'::text) OR ((entry_id)::text ~~ 'AJAX_CH2O_1'::text) OR ((entry_id)::text ~~ 'AJAX_MMS_1'::text))
-> Index Scan using ix_granule_collection_id on granule
(cost=0.56..92445.36 rows=18713 width=1462)
Index Cond: (collection_id = collection.id)
Filter: (is_active AND (((properties #>> '{temporal_extent,range_date_times,0,beginning_date_time}'::text[]) > '2015-10-06T23:59:59+00:00'::text) OR ((properties #>> '{temporal_extent,single_d ate_times,0}'::text[]) > '2015-10-06T23:59:59+00:00'::text) OR ((properties #>> '{temporal_extent,periodic_date_times,0,start_date}'::text[]) > '2015-10-06T23:59:59+00:00'::text)) AND (((properties #>> '{temporal_extent,range_date_times,0,end_ date_time}'::text[]) < '2015-10-09T00:00:00+00:00'::text) OR ((properties #>> '{temporal_extent,single_date_times,0}'::text[]) < '2015-10-09T00:00:00+00:00'::text) OR ((properties #>> '{temporal_extent,periodic_date_times,0,end_date}'::text[]) < '2015-10-09T00:00:00+00:00'::text)))
-> Index Scan using collection_pkey on collection collection_1
(cost=0.28..7.99 rows=1 width=56)
Index Cond: (id = granule.collection_id) ->
Hash (cost=1.52..1.52 rows=52 width=16) ->
Seq Scan on visibility visibility_1
(cost=0.00..1.52 rows=52 width=16) Heres a bit about the tables – Granule Collection Granule_file Visibility Granule: public | granule
| table | ims_api_writer | 36 GB
| ims_api=# \d+ granule
Table "public.granule" Column
|
Type
| Collation | Nullable | Default | Storage
| Stats target | Description -----------------------------+-----------------------------+-----------+----------+---------+----------+--------------+------------- collection_id
| integer
|
| not null |
| plain
|
| create_date
| timestamp without time zone |
| not null |
| plain
|
| delete_date
| timestamp without time zone |
|
|
| plain |
| geometry
| geometry(Geometry,4326)
|
| |
| main
|
| is_active
| boolean
|
|
|
| plain |
| properties
| jsonb
|
| |
| extended |
| update_date
| timestamp without time zone |
| not null |
| plain
|
| uuid
| uuid
|
| not null |
| plain |
| visibility_id
| integer
|
| not null |
| plain
|
| geography
| geography(Geometry,4326)
|
| |
| main
|
| visibility_last_update_date | timestamp without time zone |
|
|
| plain |
| Indexes: "granule_pkey" PRIMARY KEY, btree (uuid) "granule_is_active_idx" btree (is_active) "granule_properties_producer_id_idx" btree ((properties ->> 'producer_granule_id'::text)) "granule_update_date_idx" btree (update_date) "idx_granule_geometry" gist (geometry) "ix_granule_collection_id" btree (collection_id) Foreign-key constraints: "granule_collection_id_fkey" FOREIGN KEY (collection_id) REFERENCES collection(id) "granule_visibility_id_fkey" FOREIGN KEY (visibility_id) REFERENCES visibility(id) Referenced by: TABLE "granule_file" CONSTRAINT "granule_file_granule_uuid_fkey" FOREIGN KEY (granule_uuid) REFERENCES granule(uuid) TABLE "granule_temporal_range" CONSTRAINT "granule_temporal_range_granule_uuid_fkey" FOREIGN KEY (granule_uuid) REFERENCES granule(uuid) Triggers: granule_temporal_range_trigger AFTER INSERT OR DELETE OR UPDATE ON granule FOR EACH ROW EXECUTE FUNCTION sync_granule_temporal_range() Access method: heap Collection: public | collection
| table | ims_api_writer | 39 MB
| ims_api=# \d collection
Table "public.collection" Column
|
Type
| Collation | Nullable |
Default ------------------------------+-----------------------------+-----------+----------+---------------------------------------- id
| integer
|
| not null | nextval('collection_id_seq'::regclass) access_constraints
| text
|
| | additional_attributes
| jsonb
|
| | ancillary_keywords
| character varying(160)[]
|
| | create_date
| timestamp without time zone |
| not null | dataset_language
| character varying(80)[]
|
|
| dataset_progress
| text
|
| | data_resolutions
| jsonb
|
|
| dataset_citation
| jsonb
|
|
| delete_date
| timestamp without time zone |
|
| distribution
| jsonb
|
|
| doi
| character varying(220)
|
| | entry_id
| character varying(80)
|
| not null | entry_title
| character varying(1030)
|
| | geometry
| geometry(Geometry,4326)
|
|
| is_active
| boolean
|
| not null | iso_topic_categories
| character varying[]
|
|
| last_update_date
| timestamp without time zone |
| not null | locations
| jsonb
|
| | long_name
| character varying(1024)
|
| | metadata_associations
| jsonb
|
| | metadata_dates
| jsonb
|
|
| personnel
| jsonb
|
| | platforms
| jsonb
|
| | processing_level_id
| integer
|
| | product_flag
| text
|
| | project_id
| integer
|
|
| properties
| jsonb
|
|
| quality
| jsonb
|
| | references
| character varying(12000)[]
|
| | related_urls
| jsonb
|
|
| summary
| jsonb
|
| | short_name
| character varying(80)
|
|
| temporal_extents
| jsonb
|
|
| version
| character varying(80)
|
| | use_constraints
| jsonb
|
| | version_description
| text
|
| | visibility_id
| integer
|
| not null | world_date
| timestamp without time zone |
|
| tiling_identification_system | jsonb
|
|
| collection_data_type
| text
|
| | standard_product
| boolean
|
| not null | false Indexes: "collection_pkey" PRIMARY KEY, btree (id) "collection_entry_id_key" UNIQUE CONSTRAINT, btree (entry_id) "idx_collection_geometry" gist (geometry) Foreign-key constraints: "collection_processing_level_id_fkey" FOREIGN KEY (processing_level_id) REFERENCES processing_level(id) "collection_project_id_fkey" FOREIGN KEY (project_id) REFERENCES project(id) "collection_visibility_id_fkey" FOREIGN KEY (visibility_id) REFERENCES visibility(id) Referenced by: TABLE "collection_organization" CONSTRAINT "collection_organization_collection_id_fkey" FOREIGN KEY (collection_id) REFERENCES collection(id) TABLE "collection_science_keyword" CONSTRAINT "collection_science_keyword_collection_id_fkey" FOREIGN KEY (collection_id) REFERENCES collection(id) TABLE "collection_spatial_processing_hint" CONSTRAINT "collection_spatial_processing_hint_collection_id_fkey" FOREIGN KEY (collection_id) REFERENCES collection(id) TABLE "granule" CONSTRAINT "granule_collection_id_fkey" FOREIGN KEY (collection_id) REFERENCES collection(id) TABLE "granule_temporal_range" CONSTRAINT "granule_temporal_range_collection_id_fkey" FOREIGN KEY (collection_id) REFERENCES collection(id) Granule_file: public | granule_file
| table | ims_api_writer | 1108 MB | \d granule_file Table "public.granule_file" Column
| Type
| Collation | Nullable | Default --------------+---------+-----------+----------+--------- granule_uuid | uuid
|
| | file_id
| integer |
|
| Foreign-key constraints: "granule_file_file_id_fkey" FOREIGN KEY (file_id) REFERENCES file(id) "granule_file_granule_uuid_fkey" FOREIGN KEY (granule_uuid) REFERENCES granule(uuid) Visibility: public | visibility
| table | ims_api_writer | 40 kB
| \d visibility
Table "public.visibility" Column |
Type
| Collation | Nullable |
Default --------+-----------------------+-----------+----------+---------------------------------------- id
| integer
|
| not null | nextval('visibility_id_seq'::regclass) name
| character varying(80) |
| not null | value
| integer
|
| not null | Indexes: "visibility_pkey" PRIMARY KEY, btree (id) "visibility_name_key" UNIQUE CONSTRAINT, btree (name) "visibility_value_key" UNIQUE CONSTRAINT, btree (value) Referenced by: TABLE "collection" CONSTRAINT "collection_visibility_id_fkey" FOREIGN KEY (visibility_id) REFERENCES visibility(id) TABLE "granule" CONSTRAINT "granule_visibility_id_fkey" FOREIGN KEY (visibility_id) REFERENCES visibility(id) Thanks for the help! Maria Wilson Nasa/Langley Research Center Hampton, Virginia USA m.l.wilson@xxxxxxxx |