QUERY PLAN
Limit (cost=4529.69..4529.79 rows=40 width=936)
-> Sort (cost=4529.69..4534.68 rows=1998 width=936)
Sort Key: c.updated_at DESC
-> Subquery Scan on c (cost=2271.40..4466.53 rows=1998 width=936)
-> GroupAggregate (cost=2271.40..4406.59 rows=1998 width=840)
Group Key: c_1.id
-> Merge Left Join (cost=2271.40..3932.07 rows=1998 width=936)
Merge Cond: (c_1.id = scs.client_id)
-> Merge Left Join (cost=2191.63..3846.62 rows=1998 width=872)
Merge Cond: (c_1.id = "*SELECT* 1".client_id)
-> Merge Left Join (cost=1296.46..1356.35 rows=1998 width=864)
Merge Cond: (c_1.id = esgs.client_id)
-> Merge Left Join (cost=1267.01..1320.91 rows=1998 width=832)
Merge Cond: (c_1.id = t_9.client_id)
-> Merge Left Join (cost=1186.81..1235.66 rows=1998 width=800)
Merge Cond: (c_1.id = t_8.client_id)
-> Merge Left Join (cost=1185.61..1229.42 rows=1998 width=768)
Merge Cond: (c_1.id = ectt.client_id)
-> Merge Left Join (cost=1107.80..1145.73 rows=1998 width=736)
Merge Cond: (c_1.id = cpc_1.client_id)
-> Merge Left Join (cost=1073.46..1106.36 rows=1998 width=704)
Merge Cond: (c_1.id = t_5.client_id)
-> Merge Left Join (cost=1070.05..1097.87 rows=1998 width=672)
Merge Cond: (c_1.id = c_2.client_id)
-> Merge Left Join (cost=970.97..993.41 rows=1998 width=640)
Merge Cond: (c_1.id = t_3.client_id)
-> Merge Left Join (cost=967.93..985.33 rows=1998 width=608)
Merge Cond: (c_1.id = t_2.client_id)
-> Merge Left Join (cost=764.86..774.89 rows=1998 width=600)
Merge Cond: (c_1.id = t_1.client_id)
-> Sort (cost=249.45..254.44 rows=1998 width=568)
Sort Key: c_1.id
-> Hash Left Join (cost=25.68..139.91 rows=1998 width=568)
Hash Cond: (c_1.id = o.client_id)
-> Seq Scan on tbl_clients c_1 (cost=0.00..108.98 rows=1998 width=504)
-> Hash (cost=25.16..25.16 rows=41 width=68)
-> Subquery Scan on o (cost=24.14..25.16 rows=41 width=68)
-> HashAggregate (cost=24.14..24.75 rows=41 width=68)
Group Key: t.client_id
-> Hash Right Join (cost=8.95..23.10 rows=138 width=14)
Hash Cond: (eipss.erp_sales_outbound_id = t.id)
-> Seq Scan on tbl_erp_inventory_product_spents eipss (cost=0.00..12.65 rows=565 width=14)
-> Hash (cost=8.36..8.36 rows=47 width=8)
-> Seq Scan on tbl_erp_sales_outbounds t (cost=0.00..8.36 rows=47 width=8)
Filter: ((client_id IS NOT NULL) AND (created_at >= '2026-01-01 00:00:00+08'::timestamp with time zone) AND (created_at <= '2026-12-31 23:59:59+08'::timestamp with time zone) AND (status = 2))
-> GroupAggregate (cost=515.41..515.44 rows=1 width=36)
Group Key: t_1.client_id
-> Sort (cost=515.41..515.42 rows=1 width=9)
Sort Key: t_1.client_id
-> Hash Left Join (cost=1.09..515.40 rows=1 width=9)
Hash Cond: (t_1.id = cpc.erp_cash_cost_ticket_id)
Filter: (cpc.id IS NULL)
-> Seq Scan on tbl_erp_cash_cost_tickets t_1 (cost=0.00..513.31 rows=198 width=13)
Filter: ((client_id IS NOT NULL) AND (created_at >= '2026-01-01 00:00:00+08'::timestamp with time zone) AND (created_at <= '2026-12-31 23:59:59+08'::timestamp with time zone) AND (status = 2))
-> Hash (cost=1.04..1.04 rows=4 width=8)
-> Seq Scan on tbl_erp_cash_cost_ticket_client_project_costs cpc (cost=0.00..1.04 rows=4 width=8)
-> GroupAggregate (cost=203.07..204.11 rows=59 width=12)
Group Key: t_2.client_id
-> Sort (cost=203.07..203.22 rows=60 width=8)
Sort Key: t_2.client_id
-> Seq Scan on tbl_projects t_2 (cost=0.00..201.30 rows=60 width=8)
Filter: ((client_id IS NOT NULL) AND (bargain_date >= '2026-01-01'::date) AND (bargain_date <= '2026-12-31'::date) AND (project_status = 3))
-> GroupAggregate (cost=3.04..3.06 rows=1 width=36)
Group Key: t_3.client_id
-> Sort (cost=3.04..3.05 rows=1 width=9)
Sort Key: t_3.client_id
-> Seq Scan on tbl_erp_cost_tickets t_3 (cost=0.00..3.03 rows=1 width=9)
Filter: ((client_id IS NOT NULL) AND (created_at >= '2026-01-01 00:00:00+08'::timestamp with time zone) AND (created_at <= '2026-12-31 23:59:59+08'::timestamp with time zone) AND (status = 2))
-> GroupAggregate (cost=99.08..99.26 rows=9 width=36)
Group Key: c_2.client_id
-> Sort (cost=99.08..99.10 rows=9 width=9)
Sort Key: c_2.client_id
-> Nested Loop (cost=0.28..98.94 rows=9 width=9)
-> Seq Scan on tbl_erp_cost_tickets t_4 (cost=0.00..3.03 rows=13 width=9)
Filter: ((created_at >= '2026-01-01 00:00:00+08'::timestamp with time zone) AND (created_at <= '2026-12-31 23:59:59+08'::timestamp with time zone) AND (status = 2))
-> Index Scan using tbl_contacts_pkey on tbl_contacts c_2 (cost=0.28..7.38 rows=1 width=8)
Index Cond: (id = t_4.contact_id)
Filter: (client_id IS NOT NULL)
-> GroupAggregate (cost=3.41..3.45 rows=2 width=36)
Group Key: t_5.client_id
-> Sort (cost=3.41..3.42 rows=2 width=10)
Sort Key: t_5.client_id
-> Seq Scan on tbl_erp_other_income_tickets t_5 (cost=0.00..3.40 rows=2 width=10)
Filter: ((client_id IS NOT NULL) AND (created_at >= '2026-01-01 00:00:00+08'::timestamp with time zone) AND (created_at <= '2026-12-31 23:59:59+08'::timestamp with time zone) AND (status = 2))
-> GroupAggregate (cost=34.34..34.36 rows=1 width=36)
Group Key: cpc_1.client_id
-> Sort (cost=34.34..34.34 rows=1 width=9)
Sort Key: cpc_1.client_id
-> Nested Loop (cost=0.29..34.33 rows=1 width=9)
-> Seq Scan on tbl_erp_cash_cost_ticket_client_project_costs cpc_1 (cost=0.00..1.04 rows=4 width=13)
Filter: (client_id IS NOT NULL)
-> Index Scan using tbl_erp_cash_cost_tickets_pkey on tbl_erp_cash_cost_tickets t_6 (cost=0.29..8.31 rows=1 width=4)
Index Cond: (id = cpc_1.erp_cash_cost_ticket_id)
Filter: ((created_at >= '2026-01-01 00:00:00+08'::timestamp with time zone) AND (created_at <= '2026-12-31 23:59:59+08'::timestamp with time zone) AND (status = 2))
-> Sort (cost=77.81..77.96 rows=59 width=36)
Sort Key: ectt.client_id
-> Subquery Scan on ectt (cost=74.75..76.07 rows=59 width=36)
-> HashAggregate (cost=74.75..75.48 rows=59 width=36)
Group Key: t_7.client_id
-> Seq Scan on tbl_erp_collect_tickets t_7 (cost=0.00..74.43 rows=63 width=10)
Filter: ((client_id IS NOT NULL) AND (created_at >= '2026-01-01 00:00:00+08'::timestamp with time zone) AND (created_at <= '2026-12-31 23:59:59+08'::timestamp with time zone) AND (status = 2))
-> GroupAggregate (cost=1.20..1.22 rows=1 width=36)
Group Key: t_8.client_id
-> Sort (cost=1.20..1.21 rows=1 width=10)
Sort Key: t_8.client_id
-> Seq Scan on tbl_erp_cost_convert_tickets t_8 (cost=0.00..1.19 rows=1 width=10)
Filter: ((client_id IS NOT NULL) AND (created_at >= '2026-01-01 00:00:00+08'::timestamp with time zone) AND (created_at <= '2026-12-31 23:59:59+08'::timestamp with time zone) AND (status = 2))
-> GroupAggregate (cost=80.21..80.23 rows=1 width=36)
Group Key: t_9.client_id
-> Sort (cost=80.21..80.21 rows=1 width=10)
Sort Key: t_9.client_id
-> Seq Scan on tbl_erp_payment_tickets t_9 (cost=0.00..80.20 rows=1 width=10)
Filter: (is_payment_settle AND (client_id IS NOT NULL) AND (created_at >= '2026-01-01 00:00:00+08'::timestamp with time zone) AND (created_at <= '2026-12-31 23:59:59+08'::timestamp with time zone) AND (status = 2))
-> Sort (cost=29.44..29.61 rows=67 width=36)
Sort Key: esgs.client_id
-> Subquery Scan on esgs (cost=25.90..27.41 rows=67 width=36)
-> HashAggregate (cost=25.90..26.74 rows=67 width=36)
Group Key: t_10.client_id
-> Hash Right Join (cost=8.04..22.18 rows=496 width=14)
Hash Cond: (eipss_1.erp_sales_gift_id = t_10.id)
-> Seq Scan on tbl_erp_inventory_product_spents eipss_1 (cost=0.00..12.65 rows=565 width=14)
-> Hash (cost=6.15..6.15 rows=151 width=8)
-> Seq Scan on tbl_erp_sales_gifts t_10 (cost=0.00..6.15 rows=151 width=8)
Filter: ((client_id IS NOT NULL) AND (status = 2))
-> GroupAggregate (cost=895.18..2484.10 rows=52 width=12)
Group Key: "*SELECT* 1".client_id
-> Sort (cost=895.18..895.31 rows=52 width=65)
Sort Key: "*SELECT* 1".client_id
-> Nested Loop Left Join (cost=63.29..893.70 rows=52 width=65)
Join Filter: (ps.id = psrr.punch_strategy_id)
-> Hash Left Join (cost=63.29..890.70 rows=52 width=52)
Hash Cond: ("*SELECT* 1".engineer_id = psrr.user_id)
-> Hash Left Join (cost=61.97..889.04 rows=52 width=52)
Hash Cond: (("*SELECT* 1".engineer_id = payroll.user_id) AND ("*SELECT* 1".settle_month = payroll.settle_month))
-> Append (cost=0.29..827.08 rows=52 width=24)
-> Subquery Scan on "*SELECT* 1" (cost=0.29..163.33 rows=8 width=24)
-> Nested Loop Left Join (cost=0.29..163.25 rows=8 width=280)
Filter: (COALESCE(p.client_id, c_3.client_id) IS NOT NULL)
-> Seq Scan on tbl_pre_sales p (cost=0.00..100.65 rows=8 width=28)
Filter: ((start_at IS NOT NULL) AND ((NOT is_draft) OR (is_draft IS NULL)) AND (end_at IS NOT NULL) AND (engineer_id IS NOT NULL) AND (start_at >= '2026-01-01 00:00:00+08'::timestamp with time zone) AND (start_at <= '2026-12-31 23:59:59+08'::timestamp with time zone) AND (end_at > start_at))
-> Index Scan using tbl_cases_pkey on tbl_cases c_3 (cost=0.29..7.80 rows=1 width=12)
Index Cond: (id = p.case_id)
-> Subquery Scan on "*SELECT* 2" (cost=0.29..663.75 rows=44 width=24)
-> Nested Loop (cost=0.29..663.31 rows=44 width=280)
-> Seq Scan on tbl_implement_records i (cost=0.00..393.01 rows=44 width=24)
Filter: ((arrived_at IS NOT NULL) AND ((NOT is_draft) OR (is_draft IS NULL)) AND (left_at IS NOT NULL) AND (arrived_at >= '2026-01-01 00:00:00+08'::timestamp with time zone) AND (arrived_at <= '2026-12-31 23:59:59+08'::timestamp with time zone) AND (left_at > arrived_at))
-> Index Scan using tbl_cases_pkey on tbl_cases c_4 (cost=0.29..6.12 rows=1 width=16)
Index Cond: (id = i.case_id)
Filter: ((last_engineer IS NOT NULL) AND (COALESCE(i.client_id, client_id) IS NOT NULL))
-> Hash (cost=58.69..58.69 rows=200 width=40)
-> Subquery Scan on payroll (cost=54.19..58.69 rows=200 width=40)
-> HashAggregate (cost=54.19..56.69 rows=200 width=40)
Group Key: am.user_id, t_11.settle_month
-> Append (cost=12.02..48.96 rows=697 width=40)
-> HashAggregate (cost=12.02..14.62 rows=208 width=40)
Group Key: am.user_id, t_11.settle_month
-> Hash Join (cost=1.34..9.95 rows=276 width=11)
Hash Cond: (am.erp_wage_ticket_id = t_11.id)
-> Seq Scan on tbl_erp_wage_ticket_amounts am (cost=0.00..7.45 rows=345 width=11)
Filter: (user_id IS NOT NULL)
-> Hash (cost=1.19..1.19 rows=12 width=8)
-> Seq Scan on tbl_erp_wage_tickets t_11 (cost=0.00..1.19 rows=12 width=8)
Filter: (status = 2)
-> HashAggregate (cost=9.56..12.33 rows=222 width=40)
Group Key: am_1.user_id, t_12.settle_month
-> Hash Join (cost=1.27..7.89 rows=222 width=11)
Hash Cond: (am_1.erp_social_insurance_id = t_12.id)
-> Seq Scan on tbl_erp_social_insurance_amounts am_1 (cost=0.00..5.67 rows=267 width=11)
Filter: (user_id IS NOT NULL)
-> Hash (cost=1.15..1.15 rows=10 width=8)
-> Seq Scan on tbl_erp_social_insurances t_12 (cost=0.00..1.15 rows=10 width=8)
Filter: (status = 2)
-> HashAggregate (cost=7.54..9.82 rows=182 width=40)
Group Key: am_2.user_id, t_13.settle_month
-> Hash Join (cost=1.21..6.13 rows=188 width=11)
Hash Cond: (am_2.erp_provident_fund_id = t_13.id)
-> Seq Scan on tbl_erp_provident_fund_amounts am_2 (cost=0.00..4.11 rows=211 width=11)
Filter: (user_id IS NOT NULL)
-> Hash (cost=1.11..1.11 rows=8 width=8)
-> Seq Scan on tbl_erp_provident_funds t_13 (cost=0.00..1.11 rows=8 width=8)
Filter: (status = 2)
-> HashAggregate (cost=4.16..5.22 rows=85 width=40)
Group Key: am_3.user_id, t_14.settle_month
-> Hash Join (cost=1.24..3.52 rows=85 width=11)
Hash Cond: (am_3.erp_personal_tax_id = t_14.id)
-> Seq Scan on tbl_erp_personal_tax_amounts am_3 (cost=0.00..1.94 rows=94 width=11)
Filter: (user_id IS NOT NULL)
-> Hash (cost=1.12..1.12 rows=9 width=8)
-> Seq Scan on tbl_erp_personal_taxs t_14 (cost=0.00..1.12 rows=9 width=8)
Filter: (status = 2)
-> Hash (cost=1.14..1.14 rows=14 width=8)
-> Seq Scan on tbl_punch_strategy_resource_rels psrr (cost=0.00..1.14 rows=14 width=8)
-> Materialize (cost=0.00..1.04 rows=3 width=17)
-> Seq Scan on tbl_punch_strategies ps (cost=0.00..1.03 rows=3 width=17)
SubPlan 1
-> Aggregate (cost=30.50..30.51 rows=1 width=8)
-> Hash Left Join (cost=5.78..29.25 rows=500 width=0)
Hash Cond: ((work_dates.work_date)::date = lh.edate)
Filter: CASE WHEN (ps.id IS NULL) THEN (((date_part('isodow'::text, work_dates.work_date))::integer >= 1) AND ((date_part('isodow'::text, work_dates.work_date))::integer <= 5)) WHEN (pss.id IS NOT NULL) THEN pss.need_work WHEN (ps.legal_holiday AND (lh.id IS NOT NULL)) THEN lh.is_exchange ELSE (((ps.week)::integer & (1 << ((date_part('isodow'::text, work_dates.work_date))::integer - 1))) <> 0) END
-> Hash Left Join (cost=1.50..22.00 rows=1000 width=13)
Hash Cond: ((work_dates.work_date)::date = pss.edate)
-> Function Scan on generate_series work_dates (cost=0.01..10.01 rows=1000 width=8)
-> Hash (cost=1.36..1.36 rows=10 width=9)
-> Seq Scan on tbl_punch_strategy_schedules pss (cost=0.00..1.36 rows=10 width=9)
Filter: (punch_strategy_id = ps.id)
-> Hash (cost=2.46..2.46 rows=146 width=9)
-> Seq Scan on tbl_legal_holidays lh (cost=0.00..2.46 rows=146 width=9)
-> Sort (cost=79.76..79.88 rows=46 width=68)
Sort Key: scs.client_id
-> Subquery Scan on scs (cost=77.34..78.49 rows=46 width=68)
-> HashAggregate (cost=77.34..78.03 rows=46 width=68)
Group Key: t_15.client_id
-> Seq Scan on tbl_sales_contracts t_15 (cost=0.00..76.98 rows=48 width=13)
Filter: (build_by_project AND (client_id IS NOT NULL) AND (created_at >= '2026-01-01 00:00:00+08'::timestamp with time zone) AND (created_at <= '2026-12-31 23:59:59+08'::timestamp with time zone))