seanmuth commented on PR #65602:
URL: https://github.com/apache/airflow/pull/65602#issuecomment-4290178592

   ## 0114 dag_id updated_at
   
   _(Note: the actual query produced here ends with a `WHERE ... 
task_instance.dag_id IN ('list', 'of', 'dag_ids')` but the resulting query is 
longer than the psql default 4096 char limit, so I've substituted `... IN 
(select dag_id from dag)` to mimic the "worst-case" scenario where the query is 
being run over a list of 1000s of dags, which is the scenario we found this 
query from)_
   
   Before:
   ```
   => EXPLAIN ANALYZE SELECT task_instance.rendered_map_index, 
task_instance.task_display_name, task_instance.id, task_instance.task_id, 
task_instance.dag_id, task_instance.run_id, task_instance.map_index, 
task_instance.start_date, task_instance.end_date, task_instance.duration, 
task_instance.state, task_instance.try_number, task_instance.max_tries, 
task_instance.hostname, task_instance.unixname, task_instance.pool, 
task_instance.pool_slots, task_instance.queue, task_instance.priority_weight, 
task_instance.operator, task_instance.custom_operator_name, 
task_instance.queued_dttm, task_instance.scheduled_dttm, 
task_instance.queued_by_job_id, task_instance.last_heartbeat_at, 
task_instance.pid, task_instance.executor, task_instance.executor_config, 
task_instance.updated_at, task_instance.context_carrier, 
task_instance.span_status, task_instance.external_executor_id, 
task_instance.trigger_id, task_instance.trigger_timeout, 
task_instance.next_method, task_instance.next_kwargs, task_instance
 .dag_version_id, dag_bundle_1.name, dag_bundle_1.active, dag_bundle_1.version, 
dag_bundle_1.last_refreshed, dag_bundle_1.signed_url_template, 
dag_bundle_1.template_params, dag_version_1.id AS id_1, 
dag_version_1.version_number, dag_version_1.dag_id AS dag_id_1, 
dag_version_1.bundle_name, dag_version_1.bundle_version, 
dag_version_1.created_at, dag_version_1.last_updated, dag_run_1.state AS 
state_1, dag_1.dag_display_name, dag_1.deadline, dag_1.dag_id AS dag_id_2, 
dag_1.is_paused, dag_1.is_stale, dag_1.last_parsed_time, 
dag_1.last_parse_duration, dag_1.last_expired, dag_1.fileloc, 
dag_1.relative_fileloc, dag_1.bundle_name AS bundle_name_1, 
dag_1.bundle_version AS bundle_version_1, dag_1.owners, dag_1.description, 
dag_1.timetable_summary, dag_1.timetable_description, dag_1.asset_expression, 
dag_1.max_active_tasks, dag_1.max_active_runs, 
dag_1.max_consecutive_failed_dag_runs, dag_1.has_task_concurrency_limits, 
dag_1.has_import_errors, dag_1.next_dagrun, dag_1.next_dagrun_data_interval_s
 tart, dag_1.next_dagrun_data_interval_end, dag_1.next_dagrun_create_after, 
dag_run_1.id AS id_2, dag_run_1.dag_id AS dag_id_3, dag_run_1.queued_at, 
dag_run_1.logical_date, dag_run_1.start_date AS start_date_1, 
dag_run_1.end_date AS end_date_1, dag_run_1.run_id AS run_id_1, 
dag_run_1.creating_job_id, dag_run_1.run_type, dag_run_1.triggered_by, 
dag_run_1.triggering_user_name, dag_run_1.conf, dag_run_1.data_interval_start, 
dag_run_1.data_interval_end, dag_run_1.run_after, 
dag_run_1.last_scheduling_decision, dag_run_1.log_template_id, 
dag_run_1.updated_at AS updated_at_1, dag_run_1.clear_number, 
dag_run_1.backfill_id, dag_run_1.bundle_version AS bundle_version_2, 
dag_run_1.scheduled_by_job_id, dag_run_1.context_carrier AS context_carrier_1, 
dag_run_1.span_status AS span_status_1, dag_run_1.created_dag_version_id, 
task_instance_note_1.ti_id, task_instance_note_1.user_id, 
task_instance_note_1.content, task_instance_note_1.created_at AS created_at_1, 
task_instance_note_1.updated_at AS upda
 ted_at_2
   FROM task_instance JOIN dag_run ON dag_run.dag_id = task_instance.dag_id AND 
dag_run.run_id = task_instance.run_id LEFT OUTER JOIN dag_version ON 
dag_version.id = task_instance.dag_version_id LEFT OUTER JOIN dag_version
   AS dag_version_1 ON dag_version_1.id = task_instance.dag_version_id LEFT 
OUTER JOIN dag_bundle AS dag_bundle_1 ON dag_version_1.bundle_name = 
dag_bundle_1.name JOIN dag_run AS dag_run_1 ON dag_run_1.dag_id = 
task_instance.dag_id AND dag_run_1.run_id = task_instance.run_id LEFT OUTER 
JOIN dag AS dag_1 ON dag_run_1.dag_id = dag_1.dag_id LEFT OUTER JOIN 
task_instance_note AS task_instance_note_1 ON task_instance.id = 
task_instance_note_1.ti_id
   WHERE task_instance.updated_at >= '2026-04-21T07:00:00+00:00'::timestamptz 
AND task_instance.updated_at < '2026-04-21T15:00:00+00:00'::timestamptz AND 
task_instance.dag_id IN (select dag_id from dag);
                                                                                
                 QUERY PLAN
   
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    Gather  (cost=81632.46..923436.39 rows=68310 width=3169) (actual 
time=2525.796..35686.290 rows=58040 loops=1)
      Workers Planned: 2
      Workers Launched: 0
      ->  Hash Join  (cost=80632.46..915605.39 rows=28462 width=3169) (actual 
time=2524.265..35569.585 rows=58040 loops=1)
            Hash Cond: ((dag_run.dag_id)::text = (dag.dag_id)::text)
            ->  Hash Left Join  (cost=80261.97..915160.13 rows=28462 
width=3198) (actual time=2522.938..35534.218 rows=58040 loops=1)
                  Hash Cond: (task_instance.id = task_instance_note_1.ti_id)
                  ->  Nested Loop Left Join  (cost=80260.84..915084.28 
rows=28462 width=2376) (actual time=2522.915..35503.392 rows=58040 loops=1)
                        ->  Hash Left Join  (cost=80260.54..913816.48 
rows=28462 width=1865) (actual time=2522.895..35434.210 rows=58040 loops=1)
                              Hash Cond: ((dag_version_1.bundle_name)::text = 
(dag_bundle_1.name)::text)
                              ->  Nested Loop Left Join  
(cost=80255.48..913631.16 rows=28462 width=1573) (actual 
time=2522.871..35401.171 rows=58040 loops=1)
                                    ->  Nested Loop  (cost=80255.05..907034.29 
rows=28462 width=1446) (actual time=2522.853..35339.836 rows=58040 loops=1)
                                          ->  Parallel Hash Join  
(cost=80254.48..166321.31 rows=237683 width=425) (actual 
time=2068.636..3370.229 rows=1018592 loops=1)
                                                Hash Cond: 
(((dag_run.dag_id)::text = (dag_run_1.dag_id)::text) AND 
((dag_run.run_id)::text = (dag_run_1.run_id)::text))
                                                ->  Parallel Seq Scan on 
dag_run  (cost=0.00..53982.79 rows=424579 width=68) (actual time=0.006..237.348 
rows=1018592 loops=1)
                                                ->  Parallel Hash  
(cost=53982.79..53982.79 rows=424579 width=357) (actual time=1453.041..1453.041 
rows=1018592 loops=1)
                                                      Buckets: 32768  Batches: 
64  Memory Usage: 5824kB
                                                      ->  Parallel Seq Scan on 
dag_run dag_run_1  (cost=0.00..53982.79 rows=424579 width=357) (actual 
time=0.005..442.481 rows=1018592 loops=1)
                                          ->  Memoize  (cost=0.57..3.22 rows=1 
width=1060) (actual time=0.031..0.031 rows=0 loops=1018592)
                                                Cache Key: dag_run.dag_id, 
dag_run.run_id
                                                Cache Mode: logical
                                                Hits: 0  Misses: 1018592  
Evictions: 965176  Overflows: 0  Memory Usage: 8193kB
                                                ->  Index Scan using ti_dag_run 
on task_instance  (cost=0.56..3.21 rows=1 width=1060) (actual time=0.029..0.030 
rows=0 loops=1018592)
                                                      Index Cond: 
(((dag_id)::text = (dag_run.dag_id)::text) AND ((run_id)::text = 
(dag_run.run_id)::text))
                                                      Filter: ((updated_at >= 
'2026-04-21 07:00:00+00'::timestamp with time zone) AND (updated_at < 
'2026-04-21 15:00:00+00'::timestamp with time zone))
                                                      Rows Removed by Filter: 13
                                    ->  Memoize  (cost=0.43..0.72 rows=1 
width=127) (actual time=0.001..0.001 rows=1 loops=58040)
                                          Cache Key: 
task_instance.dag_version_id
                                          Cache Mode: logical
                                          Hits: 57006  Misses: 1034  Evictions: 
0  Overflows: 0  Memory Usage: 247kB
                                          ->  Index Scan using dag_version_pkey 
on dag_version dag_version_1  (cost=0.42..0.71 rows=1 width=127) (actual 
time=0.015..0.015 rows=1 loops=1034)
                                                Index Cond: (id = 
task_instance.dag_version_id)
                              ->  Hash  (cost=5.03..5.03 rows=3 width=292) 
(actual time=0.013..0.014 rows=3 loops=1)
                                    Buckets: 1024  Batches: 1  Memory Usage: 9kB
                                    ->  Seq Scan on dag_bundle dag_bundle_1  
(cost=0.00..5.03 rows=3 width=292) (actual time=0.004..0.010 rows=3 loops=1)
                        ->  Memoize  (cost=0.29..0.31 rows=1 width=511) (actual 
time=0.000..0.000 rows=1 loops=58040)
                              Cache Key: dag_run_1.dag_id
                              Cache Mode: logical
                              Hits: 57131  Misses: 909  Evictions: 0  
Overflows: 0  Memory Usage: 516kB
                              ->  Index Scan using dag_pkey on dag dag_1  
(cost=0.28..0.30 rows=1 width=511) (actual time=0.008..0.008 rows=1 loops=909)
                                    Index Cond: ((dag_id)::text = 
(dag_run_1.dag_id)::text)
                  ->  Hash  (cost=1.06..1.06 rows=6 width=822) (actual 
time=0.016..0.016 rows=6 loops=1)
                        Buckets: 1024  Batches: 1  Memory Usage: 9kB
                        ->  Seq Scan on task_instance_note task_instance_note_1 
 (cost=0.00..1.06 rows=6 width=822) (actual time=0.005..0.006 rows=6 loops=1)
            ->  Hash  (cost=309.47..309.47 rows=4881 width=30) (actual 
time=1.285..1.285 rows=2953 loops=1)
                  Buckets: 8192  Batches: 1  Memory Usage: 244kB
                  ->  Index Only Scan using dag_pkey on dag  (cost=0.28..309.47 
rows=4881 width=30) (actual time=0.014..0.673 rows=2953 loops=1)
                        Heap Fetches: 552
    Planning Time: 6.166 ms
    Execution Time: 35692.160 ms
   ```
   
   After:
   ```
                                                                                
                         QUERY PLAN
   
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    Nested Loop  (cost=1008.87..234132.43 rows=65663 width=3190) (actual 
time=1.395..616.512 rows=58040 loops=1)
      ->  Gather  (cost=1008.58..231946.95 rows=65663 width=3219) (actual 
time=1.385..537.908 rows=58040 loops=1)
            Workers Planned: 2
            Workers Launched: 2
            ->  Hash Left Join  (cost=8.58..224380.65 rows=27360 width=3219) 
(actual time=0.226..559.899 rows=19347 loops=3)
                  Hash Cond: (task_instance.id = task_instance_note_1.ti_id)
                  ->  Nested Loop Left Join  (cost=7.45..224307.70 rows=27360 
width=2397) (actual time=0.202..550.350 rows=19347 loops=3)
                        ->  Nested Loop  (cost=7.16..223072.07 rows=27360 
width=1886) (actual time=0.181..522.064 rows=19347 loops=3)
                              ->  Hash Left Join  (cost=6.61..199875.17 
rows=27360 width=1568) (actual time=0.156..297.605 rows=19347 loops=3)
                                    Hash Cond: 
((dag_version_1.bundle_name)::text = (dag_bundle_1.name)::text)
                                    ->  Nested Loop Left Join  
(cost=1.54..199696.82 rows=27360 width=1276) (actual time=0.120..287.439 
rows=19347 loops=3)
                                          ->  Nested Loop  
(cost=1.11..193158.23 rows=27360 width=1149) (actual time=0.102..267.731 
rows=19347 loops=3)
                                                ->  Parallel Index Scan using 
idx_cre_ti_updated_at_dag_id on task_instance  (cost=0.56..117343.78 rows=27360 
width=1081) (actual time=0.030..18.357 rows=19347 loops=3)
                                                      Index Cond: ((updated_at 
>= '2026-04-21 07:00:00+00'::timestamp with time zone) AND (updated_at < 
'2026-04-21 15:00:00+00'::timestamp with time zone))
                                                ->  Index Only Scan using 
dag_run_dag_id_run_id_key on dag_run  (cost=0.55..2.77 rows=1 width=68) (actual 
time=0.012..0.012 rows=1 loops=58040)
                                                      Index Cond: ((dag_id = 
(task_instance.dag_id)::text) AND (run_id = (task_instance.run_id)::text))
                                                      Heap Fetches: 22022
                                          ->  Memoize  (cost=0.43..0.73 rows=1 
width=127) (actual time=0.001..0.001 rows=1 loops=58040)
                                                Cache Key: 
task_instance.dag_version_id
                                                Cache Mode: logical
                                                Hits: 16810  Misses: 880  
Evictions: 0  Overflows: 0  Memory Usage: 210kB
                                                Worker 0:  Hits: 19679  Misses: 
910  Evictions: 0  Overflows: 0  Memory Usage: 217kB
                                                Worker 1:  Hits: 18876  Misses: 
885  Evictions: 0  Overflows: 0  Memory Usage: 212kB
                                                ->  Index Scan using 
dag_version_pkey on dag_version dag_version_1  (cost=0.42..0.72 rows=1 
width=127) (actual time=0.004..0.004 rows=1 loops=2675)
                                                      Index Cond: (id = 
task_instance.dag_version_id)
                                    ->  Hash  (cost=5.03..5.03 rows=3 
width=292) (actual time=0.020..0.020 rows=3 loops=3)
                                          Buckets: 1024  Batches: 1  Memory 
Usage: 9kB
                                          ->  Seq Scan on dag_bundle 
dag_bundle_1  (cost=0.00..5.03 rows=3 width=292) (actual time=0.008..0.013 
rows=3 loops=3)
                              ->  Index Scan using dag_run_dag_id_run_id_key on 
dag_run dag_run_1  (cost=0.55..0.85 rows=1 width=357) (actual time=0.011..0.011 
rows=1 loops=58040)
                                    Index Cond: (((dag_id)::text = 
(dag_run.dag_id)::text) AND ((run_id)::text = (dag_run.run_id)::text))
                        ->  Memoize  (cost=0.29..0.31 rows=1 width=511) (actual 
time=0.001..0.001 rows=1 loops=58040)
                              Cache Key: dag_run_1.dag_id
                              Cache Mode: logical
                              Hits: 16896  Misses: 794  Evictions: 0  
Overflows: 0  Memory Usage: 454kB
                              Worker 0:  Hits: 19772  Misses: 817  Evictions: 0 
 Overflows: 0  Memory Usage: 465kB
                              Worker 1:  Hits: 18957  Misses: 804  Evictions: 0 
 Overflows: 0  Memory Usage: 459kB
                              ->  Index Scan using dag_pkey on dag dag_1  
(cost=0.28..0.30 rows=1 width=511) (actual time=0.006..0.006 rows=1 loops=2415)
                                    Index Cond: ((dag_id)::text = 
(dag_run_1.dag_id)::text)
                  ->  Hash  (cost=1.06..1.06 rows=6 width=822) (actual 
time=0.012..0.013 rows=6 loops=3)
                        Buckets: 1024  Batches: 1  Memory Usage: 9kB
                        ->  Seq Scan on task_instance_note task_instance_note_1 
 (cost=0.00..1.06 rows=6 width=822) (actual time=0.008..0.008 rows=6 loops=3)
      ->  Memoize  (cost=0.29..0.31 rows=1 width=30) (actual time=0.000..0.000 
rows=1 loops=58040)
            Cache Key: dag_run.dag_id
            Cache Mode: logical
            Hits: 57131  Misses: 909  Evictions: 0  Overflows: 0  Memory Usage: 
141kB
            ->  Index Only Scan using dag_pkey on dag  (cost=0.28..0.30 rows=1 
width=30) (actual time=0.004..0.004 rows=1 loops=909)
                  Index Cond: (dag_id = (dag_run.dag_id)::text)
                  Heap Fetches: 595
    Planning Time: 7.390 ms
    Execution Time: 619.691 ms
   ```


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to