explain.depesz.com

PostgreSQL's explain analyze made readable

Result: bIEm : Optimization for: Optimization for: plan #Y6bw; plan #traj

Settings

Optimization path:

Optimization(s) for this plan:

# exclusive inclusive rows x rows loops node
1. 0.000 0.000 ↓ 0.0

GroupAggregate (cost=872,713.89..872,713.98 rows=1 width=91) (actual rows= loops=)

  • Group Key: a.gene, e_1.cell_type, a.perturbation, a.sibling_set
  • Filter: ((percentile_cont('0.5'::double precision) WITHIN GROUP (ORDER BY (((((jsonb_each_text(cp.angle_to_sibling_sets)).value)::numeric))::double precision)) < '75'::double precision) AND (percentile_cont('0.9'::double precision) WITHIN GROUP (ORDER BY ((('6'::numeric * pow(('1'::numeric - a.zfactor), '2'::numeric)))::double precision)) <= '12'::double precision))
2. 0.000 0.000 ↓ 0.0

Sort (cost=872,713.89..872,713.90 rows=1 width=131) (actual rows= loops=)

  • Sort Key: a.gene, e_1.cell_type, a.perturbation, a.sibling_set
3. 0.000 0.000 ↓ 0.0

Nested Loop (cost=614,044.49..872,713.88 rows=1 width=131) (actual rows= loops=)

  • Join Filter: (e_1.id = e_4.id)
4. 0.000 0.000 ↓ 0.0

Hash Join (cost=474,905.76..732,920.11 rows=1 width=135) (actual rows= loops=)

  • Hash Cond: (((cp.experiment_label)::text = (a.experiment_label)::text) AND ((cp.perturbation)::text = (a.perturbation)::text) AND (((jsonb_each_text(cp.angle_to_sibling_sets)).key) = a.sibling_set) AND ((e_1.cell_type)::text = (e.cell_type)::text))
5. 0.000 0.000 ↓ 0.0

Hash Join (cost=17,641.99..271,721.25 rows=87,446 width=135) (actual rows= loops=)

  • Hash Cond: ((cp.experiment_label)::text = (e_1.label)::text)
6. 0.000 0.000 ↓ 0.0

Hash Join (cost=16,509.41..195,981.21 rows=5,362,400 width=102) (actual rows= loops=)

  • Hash Cond: (cp.result_set_id = aspe.result_set_id)
7. 0.000 0.000 ↓ 0.0

Seq Scan on crispr_phenoscreen_perturbation_metrics cp (cost=0.00..148,634.71 rows=858,861 width=441) (actual rows= loops=)

  • Filter: (NULLIF(angle_to_sibling_sets, 'null'::jsonb) IS NOT NULL)
8. 0.000 0.000 ↓ 0.0

Hash (cost=16,508.64..16,508.64 rows=61 width=16) (actual rows= loops=)

9. 0.000 0.000 ↓ 0.0

Subquery Scan on aspe (cost=16,507.67..16,508.64 rows=61 width=16) (actual rows= loops=)

10. 0.000 0.000 ↓ 0.0

Unique (cost=16,507.67..16,508.03 rows=61 width=353) (actual rows= loops=)

11. 0.000 0.000 ↓ 0.0

Sort (cost=16,507.67..16,507.85 rows=73 width=353) (actual rows= loops=)

  • Sort Key: all_sets_per_experiment.experiment_label, (COALESCE(all_sets_per_experiment.is_active, false)) DESC, (COALESCE(all_sets_per_experiment.is_active, true)) DESC, all_sets_per_experiment.created_at DESC
12. 0.000 0.000 ↓ 0.0

Subquery Scan on all_sets_per_experiment (cost=15,778.94..16,505.41 rows=73 width=353) (actual rows= loops=)

  • Filter: (((all_sets_per_experiment.is_active IS NULL) OR all_sets_per_experiment.is_active) AND ((all_sets_per_experiment.labels -> 'use_embeddings'::text) = 'true'::jsonb))
13. 0.000 0.000 ↓ 0.0

Unique (cost=15,778.94..16,068.85 rows=29,104 width=351) (actual rows= loops=)

14.          

CTE latest_labels

15. 0.000 0.000 ↓ 0.0

Unique (cost=8,015.55..8,365.82 rows=37,404 width=153) (actual rows= loops=)

16. 0.000 0.000 ↓ 0.0

Sort (cost=8,015.55..8,190.68 rows=70,054 width=153) (actual rows= loops=)

  • Sort Key: result_set_labels_1.result_set_id, result_set_labels_1.created_at DESC
17. 0.000 0.000 ↓ 0.0

Seq Scan on result_set_labels result_set_labels_1 (cost=0.00..2,377.54 rows=70,054 width=153) (actual rows= loops=)

18. 0.000 0.000 ↓ 0.0

Sort (cost=7,413.13..7,509.76 rows=38,654 width=351) (actual rows= loops=)

  • Sort Key: ds.experiment_label, ds.result_set_id, rs.created_at DESC, ds.created_at DESC
19. 0.000 0.000 ↓ 0.0

Hash Join (cost=2,445.05..4,468.01 rows=38,654 width=351) (actual rows= loops=)

  • Hash Cond: (ll.result_set_id = ds.result_set_id)
20. 0.000 0.000 ↓ 0.0

CTE Scan on latest_labels ll (cost=0.00..748.08 rows=37,404 width=48) (actual rows= loops=)

21. 0.000 0.000 ↓ 0.0

Hash (cost=2,069.09..2,069.09 rows=30,077 width=71) (actual rows= loops=)

22. 0.000 0.000 ↓ 0.0

Hash Join (cost=944.19..2,069.09 rows=30,077 width=71) (actual rows= loops=)

  • Hash Cond: (ds.result_set_id = rs.id)
23. 0.000 0.000 ↓ 0.0

Seq Scan on dart_statuses ds (cost=0.00..715.77 rows=30,077 width=47) (actual rows= loops=)

24. 0.000 0.000 ↓ 0.0

Hash (cost=585.75..585.75 rows=28,675 width=24) (actual rows= loops=)

25. 0.000 0.000 ↓ 0.0

Seq Scan on result_sets rs (cost=0.00..585.75 rows=28,675 width=24) (actual rows= loops=)

26. 0.000 0.000 ↓ 0.0

Hash (cost=1,129.87..1,129.87 rows=217 width=33) (actual rows= loops=)

27. 0.000 0.000 ↓ 0.0

Seq Scan on experiments e_1 (cost=0.00..1,129.87 rows=217 width=33) (actual rows= loops=)

  • Filter: (pass_data_qc AND ((tags IS NULL) OR (NOT ('{DEVELOPMENT}'::character varying[] && tags))) AND ((assay_type)::text = '1536-crispr_lipofection'::text) AND ((experiment_team)::text = 'HTS'::text))
28. 0.000 0.000 ↓ 0.0

Hash (cost=457,118.33..457,118.33 rows=7,272 width=126) (actual rows= loops=)

29. 0.000 0.000 ↓ 0.0

Hash Join (cost=203,411.02..457,118.33 rows=7,272 width=126) (actual rows= loops=)

  • Hash Cond: ((a.gene)::text = (r.gene)::text)
30. 0.000 0.000 ↓ 0.0

Subquery Scan on a (cost=16,509.41..250,487.34 rows=5,254,993 width=108) (actual rows= loops=)

  • Filter: (a.zfactor IS NOT NULL)
31. 0.000 0.000 ↓ 0.0

Hash Join (cost=16,509.41..197,673.34 rows=5,281,400 width=108) (actual rows= loops=)

  • Hash Cond: (cp_1.result_set_id = aspe_1.result_set_id)
32. 0.000 0.000 ↓ 0.0

Seq Scan on crispr_phenoscreen_perturbation_metrics cp_1 (cost=0.00..150,792.65 rows=845,884 width=681) (actual rows= loops=)

  • Filter: ((NULLIF(zfactor_6x_siblings_set, 'null'::jsonb) IS NOT NULL) AND ((gene)::text !~~ '%%_control'::text))
33. 0.000 0.000 ↓ 0.0

Hash (cost=16,508.64..16,508.64 rows=61 width=16) (actual rows= loops=)

34. 0.000 0.000 ↓ 0.0

Subquery Scan on aspe_1 (cost=16,507.67..16,508.64 rows=61 width=16) (actual rows= loops=)

35. 0.000 0.000 ↓ 0.0

Unique (cost=16,507.67..16,508.03 rows=61 width=353) (actual rows= loops=)

36. 0.000 0.000 ↓ 0.0

Sort (cost=16,507.67..16,507.85 rows=73 width=353) (actual rows= loops=)

  • Sort Key: all_sets_per_experiment_1.experiment_label, (COALESCE(all_sets_per_experiment_1.is_active, false)) DESC, (COALESCE(all_sets_per_experiment_1.is_active, true)) DESC, all_sets_per_experiment_1.created_at DESC
37. 0.000 0.000 ↓ 0.0

Subquery Scan on all_sets_per_experiment_1 (cost=15,778.94..16,505.41 rows=73 width=353) (actual rows= loops=)

  • Filter: (((all_sets_per_experiment_1.is_active IS NULL) OR all_sets_per_experiment_1.is_active) AND ((all_sets_per_experiment_1.labels -> 'use_embeddings'::text) = 'true'::jsonb))
38. 0.000 0.000 ↓ 0.0

Unique (cost=15,778.94..16,068.85 rows=29,104 width=351) (actual rows= loops=)

39.          

CTE latest_labels

40. 0.000 0.000 ↓ 0.0

Unique (cost=8,015.55..8,365.82 rows=37,404 width=153) (actual rows= loops=)

41. 0.000 0.000 ↓ 0.0

Sort (cost=8,015.55..8,190.68 rows=70,054 width=153) (actual rows= loops=)

  • Sort Key: result_set_labels.result_set_id, result_set_labels.created_at DESC
42. 0.000 0.000 ↓ 0.0

Seq Scan on result_set_labels (cost=0.00..2,377.54 rows=70,054 width=153) (actual rows= loops=)

43. 0.000 0.000 ↓ 0.0

Sort (cost=7,413.13..7,509.76 rows=38,654 width=351) (actual rows= loops=)

  • Sort Key: ds_1.experiment_label, ds_1.result_set_id, rs_1.created_at DESC, ds_1.created_at DESC
44. 0.000 0.000 ↓ 0.0

Hash Join (cost=2,445.05..4,468.01 rows=38,654 width=351) (actual rows= loops=)

  • Hash Cond: (ll_1.result_set_id = ds_1.result_set_id)
45. 0.000 0.000 ↓ 0.0

CTE Scan on latest_labels ll_1 (cost=0.00..748.08 rows=37,404 width=48) (actual rows= loops=)

46. 0.000 0.000 ↓ 0.0

Hash (cost=2,069.09..2,069.09 rows=30,077 width=71) (actual rows= loops=)

47. 0.000 0.000 ↓ 0.0

Hash Join (cost=944.19..2,069.09 rows=30,077 width=71) (actual rows= loops=)

  • Hash Cond: (ds_1.result_set_id = rs_1.id)
48. 0.000 0.000 ↓ 0.0

Seq Scan on dart_statuses ds_1 (cost=0.00..715.77 rows=30,077 width=47) (actual rows= loops=)

49. 0.000 0.000 ↓ 0.0

Hash (cost=585.75..585.75 rows=28,675 width=24) (actual rows= loops=)

50. 0.000 0.000 ↓ 0.0

Seq Scan on result_sets rs_1 (cost=0.00..585.75 rows=28,675 width=24) (actual rows= loops=)

51. 0.000 0.000 ↓ 0.0

Hash (cost=186,901.50..186,901.50 rows=9 width=31) (actual rows= loops=)

52. 0.000 0.000 ↓ 0.0

Nested Loop (cost=186,450.37..186,901.50 rows=9 width=31) (actual rows= loops=)

53. 0.000 0.000 ↓ 0.0

Merge Join (cost=186,449.93..186,452.72 rows=53 width=33) (actual rows= loops=)

  • Merge Cond: (((m.cell_type)::text) = (e.cell_type)::text)
54. 0.000 0.000 ↓ 0.0

Sort (cost=33.81..33.98 rows=66 width=12) (actual rows= loops=)

  • Sort Key: ((m.cell_type)::text)
55. 0.000 0.000 ↓ 0.0

Seq Scan on rnaseq_metadata m (cost=0.00..31.82 rows=66 width=12) (actual rows= loops=)

  • Filter: hts_protocol
56. 0.000 0.000 ↓ 0.0

Sort (cost=186,416.12..186,416.52 rows=160 width=21) (actual rows= loops=)

  • Sort Key: e.cell_type
57. 0.000 0.000 ↓ 0.0

Subquery Scan on e (cost=186,403.06..186,410.26 rows=160 width=21) (actual rows= loops=)

58. 0.000 0.000 ↓ 0.0

GroupAggregate (cost=186,403.06..186,408.66 rows=160 width=21) (actual rows= loops=)

  • Group Key: cpgm.gene, e_2.cell_type
  • Filter: ((count(DISTINCT e_2.label) >= 2) AND (percentile_cont('0.5'::double precision) WITHIN GROUP (ORDER BY ((cpgm.avg_cvangle_gene_pval)::double precision)) < '0.01'::double precision))
59. 0.000 0.000 ↓ 0.0

Sort (cost=186,403.06..186,403.46 rows=160 width=40) (actual rows= loops=)

  • Sort Key: cpgm.gene, e_2.cell_type
60. 0.000 0.000 ↓ 0.0

Hash Join (cost=157,297.96..186,397.20 rows=160 width=40) (actual rows= loops=)

  • Hash Cond: ((cpgm.experiment_label)::text = (e_2.label)::text)
61. 0.000 0.000 ↓ 0.0

Nested Loop (cost=16,513.12..45,578.94 rows=8,484 width=33) (actual rows= loops=)

62. 0.000 0.000 ↓ 0.0

Unique (cost=16,507.67..16,508.03 rows=61 width=353) (actual rows= loops=)

63. 0.000 0.000 ↓ 0.0

Sort (cost=16,507.67..16,507.85 rows=73 width=353) (actual rows= loops=)

  • Sort Key: all_sets_per_experiment_2.experiment_label, (COALESCE(all_sets_per_experiment_2.is_active, false)) DESC, (COALESCE(all_sets_per_experiment_2.is_active, true)) DESC, all_sets_per_experiment_2.created_at DESC
64. 0.000 0.000 ↓ 0.0

Subquery Scan on all_sets_per_experiment_2 (cost=15,778.94..16,505.41 rows=73 width=353) (actual rows= loops=)

  • Filter: (((all_sets_per_experiment_2.is_active IS NULL) OR all_sets_per_experiment_2.is_active) AND ((all_sets_per_experiment_2.labels -> 'use_embeddings'::text) = 'true'::jsonb))
65. 0.000 0.000 ↓ 0.0

Unique (cost=15,778.94..16,068.85 rows=29,104 width=351) (actual rows= loops=)

66.          

CTE latest_labels

67. 0.000 0.000 ↓ 0.0

Unique (cost=8,015.55..8,365.82 rows=37,404 width=153) (actual rows= loops=)

68. 0.000 0.000 ↓ 0.0

Sort (cost=8,015.55..8,190.68 rows=70,054 width=153) (actual rows= loops=)

  • Sort Key: result_set_labels_2.result_set_id, result_set_labels_2.created_at DESC
69. 0.000 0.000 ↓ 0.0

Seq Scan on result_set_labels result_set_labels_2 (cost=0.00..2,377.54 rows=70,054 width=153) (actual rows= loops=)

70. 0.000 0.000 ↓ 0.0

Sort (cost=7,413.13..7,509.76 rows=38,654 width=351) (actual rows= loops=)

  • Sort Key: ds_2.experiment_label, ds_2.result_set_id, rs_2.created_at DESC, ds_2.created_at DESC
71. 0.000 0.000 ↓ 0.0

Hash Join (cost=2,445.05..4,468.01 rows=38,654 width=351) (actual rows= loops=)

  • Hash Cond: (ll_2.result_set_id = ds_2.result_set_id)
72. 0.000 0.000 ↓ 0.0

CTE Scan on latest_labels ll_2 (cost=0.00..748.08 rows=37,404 width=48) (actual rows= loops=)

73. 0.000 0.000 ↓ 0.0

Hash (cost=2,069.09..2,069.09 rows=30,077 width=71) (actual rows= loops=)

74. 0.000 0.000 ↓ 0.0

Hash Join (cost=944.19..2,069.09 rows=30,077 width=71) (actual rows= loops=)

  • Hash Cond: (ds_2.result_set_id = rs_2.id)
75. 0.000 0.000 ↓ 0.0

Seq Scan on dart_statuses ds_2 (cost=0.00..715.77 rows=30,077 width=47) (actual rows= loops=)

76. 0.000 0.000 ↓ 0.0

Hash (cost=585.75..585.75 rows=28,675 width=24) (actual rows= loops=)

77. 0.000 0.000 ↓ 0.0

Seq Scan on result_sets rs_2 (cost=0.00..585.75 rows=28,675 width=24) (actual rows= loops=)

78. 0.000 0.000 ↓ 0.0

Bitmap Heap Scan on crispr_phenoscreen_gene_metrics cpgm (cost=5.45..475.17 rows=139 width=49) (actual rows= loops=)

  • Recheck Cond: (result_set_id = all_sets_per_experiment_2.result_set_id)
  • Filter: ((gene)::text !~~ '%%_control'::text)
79. 0.000 0.000 ↓ 0.0

Bitmap Index Scan on ix_exploration_crispr_phenoscreen_gene_metrics_result_set_id (cost=0.00..5.41 rows=141 width=0) (actual rows= loops=)

  • Index Cond: (result_set_id = all_sets_per_experiment_2.result_set_id)
80. 0.000 0.000 ↓ 0.0

Hash (cost=140,781.71..140,781.71 rows=251 width=29) (actual rows= loops=)

81. 0.000 0.000 ↓ 0.0

Merge Join (cost=140,277.02..140,781.71 rows=251 width=29) (actual rows= loops=)

  • Merge Cond: (e_3.id = e_2.id)
82. 0.000 0.000 ↓ 0.0

GroupAggregate (cost=139,138.73..139,446.99 rows=15,413 width=340) (actual rows= loops=)

  • Group Key: e_3.id, et.label, b.seed_at
83. 0.000 0.000 ↓ 0.0

Sort (cost=139,138.73..139,177.26 rows=15,413 width=230) (actual rows= loops=)

  • Sort Key: e_3.id, et.label, b.seed_at
84. 0.000 0.000 ↓ 0.0

Hash Left Join (cost=4,469.10..138,066.61 rows=15,413 width=230) (actual rows= loops=)

  • Hash Cond: (e_3.batch_id = b.id)
85. 0.000 0.000 ↓ 0.0

Hash Left Join (cost=4,425.08..137,898.66 rows=15,413 width=226) (actual rows= loops=)

  • Hash Cond: (e_3.experiment_type_id = et.id)
86. 0.000 0.000 ↓ 0.0

Hash Right Join (cost=4,407.88..137,669.53 rows=15,413 width=12) (actual rows= loops=)

  • Hash Cond: ((j.experiment_label)::text = (e_3.label)::text)
87. 0.000 0.000 ↓ 0.0

Hash Right Join (cost=3,211.47..136,261.19 rows=15,413 width=28) (actual rows= loops=)

  • Hash Cond: (jc.job_id = j.id)
  • Join Filter: (NOT (SubPlan 4))
88. 0.000 0.000 ↓ 0.0

Seq Scan on job_events jc (cost=0.00..1,373.69 rows=11,393 width=16) (actual rows= loops=)

  • Filter: ((event)::text = 'experiment_evaluation_pipeline_completed'::text)
89. 0.000 0.000 ↓ 0.0

Hash (cost=3,018.81..3,018.81 rows=15,413 width=36) (actual rows= loops=)

90. 0.000 0.000 ↓ 0.0

Seq Scan on jobs j (cost=0.00..3,018.81 rows=15,413 width=36) (actual rows= loops=)

  • Filter: (deleted_at IS NULL)
91.          

SubPlan (for Hash Right Join)

92. 0.000 0.000 ↓ 0.0

Index Scan using ix_ccc_job_events_job_id_event_time on job_events (cost=0.41..12.04 rows=1 width=0) (actual rows= loops=)

  • Index Cond: ((job_id = j.id) AND (event_time >= jc.event_time))
  • Filter: ((event)::text = 'experiment_evaluation_pipeline_invalidated'::text)
93. 0.000 0.000 ↓ 0.0

Hash (cost=1,030.07..1,030.07 rows=13,307 width=35) (actual rows= loops=)

94. 0.000 0.000 ↓ 0.0

Seq Scan on experiments e_3 (cost=0.00..1,030.07 rows=13,307 width=35) (actual rows= loops=)

95. 0.000 0.000 ↓ 0.0

Hash (cost=13.20..13.20 rows=320 width=222) (actual rows= loops=)

96. 0.000 0.000 ↓ 0.0

Seq Scan on experiment_types et (cost=0.00..13.20 rows=320 width=222) (actual rows= loops=)

97. 0.000 0.000 ↓ 0.0

Hash (cost=24.01..24.01 rows=1,601 width=8) (actual rows= loops=)

98. 0.000 0.000 ↓ 0.0

Seq Scan on batches b (cost=0.00..24.01 rows=1,601 width=8) (actual rows= loops=)

99. 0.000 0.000 ↓ 0.0

Sort (cost=1,138.29..1,138.84 rows=217 width=33) (actual rows= loops=)

  • Sort Key: e_2.id
100. 0.000 0.000 ↓ 0.0

Seq Scan on experiments e_2 (cost=0.00..1,129.87 rows=217 width=33) (actual rows= loops=)

  • Filter: (pass_data_qc AND ((tags IS NULL) OR (NOT ('{DEVELOPMENT}'::character varying[] && tags))) AND ((assay_type)::text = '1536-crispr_lipofection'::text) AND ((experiment_team)::text = 'HTS'::text))
101. 0.000 0.000 ↓ 0.0

Index Scan using rnaseq_gene_expression_gene_metadata_id_key on rnaseq_gene_expression r (cost=0.43..8.46 rows=1 width=14) (actual rows= loops=)

  • Index Cond: (((gene)::text = (e.gene)::text) AND (metadata_id = m.id))
  • Filter: (zfpkm >= '-3'::numeric)
102. 0.000 0.000 ↓ 0.0

GroupAggregate (cost=139,138.73..139,446.99 rows=15,413 width=340) (actual rows= loops=)

  • Group Key: e_4.id, et_1.label, b_1.seed_at
103. 0.000 0.000 ↓ 0.0

Sort (cost=139,138.73..139,177.26 rows=15,413 width=230) (actual rows= loops=)

  • Sort Key: e_4.id, et_1.label, b_1.seed_at
104. 0.000 0.000 ↓ 0.0

Hash Left Join (cost=4,469.10..138,066.61 rows=15,413 width=230) (actual rows= loops=)

  • Hash Cond: (e_4.batch_id = b_1.id)
105. 0.000 0.000 ↓ 0.0

Hash Left Join (cost=4,425.08..137,898.66 rows=15,413 width=226) (actual rows= loops=)

  • Hash Cond: (e_4.experiment_type_id = et_1.id)
106. 0.000 0.000 ↓ 0.0

Hash Right Join (cost=4,407.88..137,669.53 rows=15,413 width=12) (actual rows= loops=)

  • Hash Cond: ((j_1.experiment_label)::text = (e_4.label)::text)
107. 0.000 0.000 ↓ 0.0

Hash Right Join (cost=3,211.47..136,261.19 rows=15,413 width=28) (actual rows= loops=)

  • Hash Cond: (jc_1.job_id = j_1.id)
  • Join Filter: (NOT (SubPlan 5))
108. 0.000 0.000 ↓ 0.0

Seq Scan on job_events jc_1 (cost=0.00..1,373.69 rows=11,393 width=16) (actual rows= loops=)

  • Filter: ((event)::text = 'experiment_evaluation_pipeline_completed'::text)
109. 0.000 0.000 ↓ 0.0

Hash (cost=3,018.81..3,018.81 rows=15,413 width=36) (actual rows= loops=)

110. 0.000 0.000 ↓ 0.0

Seq Scan on jobs j_1 (cost=0.00..3,018.81 rows=15,413 width=36) (actual rows= loops=)

  • Filter: (deleted_at IS NULL)
111.          

SubPlan (for Hash Right Join)

112. 0.000 0.000 ↓ 0.0

Index Scan using ix_ccc_job_events_job_id_event_time on job_events job_events_1 (cost=0.41..12.04 rows=1 width=0) (actual rows= loops=)

  • Index Cond: ((job_id = j_1.id) AND (event_time >= jc_1.event_time))
  • Filter: ((event)::text = 'experiment_evaluation_pipeline_invalidated'::text)
113. 0.000 0.000 ↓ 0.0

Hash (cost=1,030.07..1,030.07 rows=13,307 width=35) (actual rows= loops=)

114. 0.000 0.000 ↓ 0.0

Seq Scan on experiments e_4 (cost=0.00..1,030.07 rows=13,307 width=35) (actual rows= loops=)

115. 0.000 0.000 ↓ 0.0

Hash (cost=13.20..13.20 rows=320 width=222) (actual rows= loops=)

116. 0.000 0.000 ↓ 0.0

Seq Scan on experiment_types et_1 (cost=0.00..13.20 rows=320 width=222) (actual rows= loops=)

117. 0.000 0.000 ↓ 0.0

Hash (cost=24.01..24.01 rows=1,601 width=8) (actual rows= loops=)

118. 0.000 0.000 ↓ 0.0

Seq Scan on batches b_1 (cost=0.00..24.01 rows=1,601 width=8) (actual rows= loops=)