Hello,
I am trying to optimize a complex query and while doing some explains, I
stumbled upon this :
CTE cfg
-> Result (cost=2.02..2.03 rows=1 width=25) (actual
time=7167.478..7167.481 rows=1 loops=1)
Buffers: shared hit=2
InitPlan 1 (returns $0)
-> Limit (cost=0.00..1.01 rows=1 width=1) (actual
time=0.058..0.058 rows=1 loops=1)
Buffers: shared hit=1
-> Seq Scan on config (cost=0.00..1.01 rows=1
width=1) (actual time=0.024..0.024 rows=1 loops=1)
Buffers: shared hit=1
InitPlan 2 (returns $1)
-> Limit (cost=0.00..1.01 rows=1 width=4) (actual
time=0.003..0.004 rows=1 loops=1)
Buffers: shared hit=1
-> Seq Scan on config config_1 (cost=0.00..1.01
rows=1 width=4) (actual time=0.002..0.002 rows=1 loops=1)
Buffers: shared hit=1
The CTE query is this:
WITH cfg AS (
SELECT
(SELECT multidevise FROM config LIMIT 1) AS p_multidevise
,(SELECT monnaie FROM config LIMIT 1) AS p_defaultdevise
,:datedu::DATE AS p_datedu
,:dateau::DATE AS p_dateau
)
Table config table only has one row. :datedu and :dateau are named params.
How can this take 7 seconds?
I am creating this CTE at the start of the query and CROSS JOIN it all
along the query. Is it a bad practice to do so? Are these 7 seconds an
artefact?
Also, when that cfg CTE is being used, sometimes it uses close to nothing:
-> CTE Scan on cfg cfg_3 (cost=0.00..0.02 rows=1 width=4) (actual
time=0.000..0.001 rows=1 loops=1)
And sometimes it takes 7 seconds ?!
-> CTE Scan on cfg cfg_7 (cost=0.00..0.02 rows=1 width=16) (actual
time=7167.481..7167.482 rows=1 loops=1)
This really looks like an artefact (maybe in relation to the JIT compiler?)
Thanks for your enlightenments.
JC
Here's the full EXPLAIN PLAN:
Sort (cost=3837999522.01..3838152992.01 rows=61388000 width=1454)
(actual time=117437.996..117438.093 rows=492 loops=1)
Sort Key: s.nom, cl.name, a.nom
Sort Method: quicksort Memory: 251kB
Buffers: shared hit=71920
CTE cfg
-> Result (cost=2.02..2.03 rows=1 width=25) (actual
time=7167.478..7167.481 rows=1 loops=1)
Buffers: shared hit=2
InitPlan 1 (returns $0)
-> Limit (cost=0.00..1.01 rows=1 width=1) (actual
time=0.058..0.058 rows=1 loops=1)
Buffers: shared hit=1
-> Seq Scan on config (cost=0.00..1.01 rows=1
width=1) (actual time=0.024..0.024 rows=1 loops=1)
Buffers: shared hit=1
InitPlan 2 (returns $1)
-> Limit (cost=0.00..1.01 rows=1 width=4) (actual
time=0.003..0.004 rows=1 loops=1)
Buffers: shared hit=1
-> Seq Scan on config config_1 (cost=0.00..1.01
rows=1 width=4) (actual time=0.002..0.002 rows=1 loops=1)
Buffers: shared hit=1
CTE daz_adinroy
-> HashAggregate (cost=209985.73..241521.32 rows=3153559
width=12) (never executed)
Group Key: ra.idad, ra.idoeu, (COALESCE(ra.controllingsoc,
o.idsociete))
-> Append (cost=786.61..186334.04 rows=3153559 width=12)
(never executed)
-> HashAggregate (cost=786.61..806.47 rows=1986
width=12) (never executed)
Group Key: ra.idad, ra.idoeu,
COALESCE(ra.controllingsoc, o.idsociete)
-> Nested Loop (cost=0.43..771.72 rows=1986
width=12) (never executed)
-> Seq Scan on royaltiesad ra
(cost=0.00..50.86 rows=1986 width=12) (never executed)
-> Memoize (cost=0.43..5.34 rows=1
width=8) (never executed)
Cache Key: ra.idoeu
Cache Mode: logical
-> Index Scan using oeu_pkey on oeu
o (cost=0.42..5.33 rows=1 width=8) (never executed)
Index Cond: (idoeu = ra.idoeu)
-> HashAggregate (cost=106708.45..138224.18
rows=3151573 width=12) (never executed)
Group Key: ra_1.idad, o_1.idoeu,
COALESCE(ra_1.controllingsoc, a_1.idsociete, o_1.idsociete)
-> Hash Join (cost=14973.25..83071.65
rows=3151573 width=12) (never executed)
Hash Cond: (ra_1.idagreement = a_1.idagreement)
-> Hash Join (cost=14923.91..80302.56
rows=1033462 width=24) (never executed)
Hash Cond: (og.idoeu = o_1.idoeu)
-> Hash Join (cost=264.24..62930.01
rows=1033462 width=20) (never executed)
Hash Cond: (og.idgroupe =
g.idgroupe)
-> Seq Scan on oegroupes og
(cost=0.00..45363.20 rows=1858120 width=8) (never executed)
-> Hash (cost=248.34..248.34
rows=1272 width=20) (never executed)
-> Hash Join
(cost=85.46..248.34 rows=1272 width=20) (never executed)
Hash Cond:
(ra_1.idagreement = g.idagreement)
-> Seq Scan on
royaltiesad ra_1 (cost=0.00..50.86 rows=1986 width=12) (never executed)
-> Hash
(cost=56.87..56.87 rows=2287 width=8) (never executed)
-> Seq Scan
on groupes g (cost=0.00..56.87 rows=2287 width=8) (never executed)
-> Hash (cost=11666.52..11666.52
rows=239452 width=8) (never executed)
-> Seq Scan on oeu o_1
(cost=0.00..11666.52 rows=239452 width=8) (never executed)
-> Hash (cost=34.71..34.71 rows=1171
width=8) (never executed)
-> Seq Scan on agreements a_1
(cost=0.00..34.71 rows=1171 width=8) (never executed)
CTE currentsoldes2
-> Subquery Scan on currentsoldes (cost=1197.97..1301.70 rows=23
width=27) (actual time=17.699..18.476 rows=1767 loops=1)
Filter: (currentsoldes.rang = 1)
Buffers: shared hit=304
-> HashAggregate (cost=1197.97..1244.07 rows=4610 width=39)
(actual time=17.695..18.209 rows=1767 loops=1)
Group Key: soldes_2.idad, soldes_2.idsociete, rank()
OVER (?), soldes_2.newbalance, soldes_2.postponed_gross_master,
COALESCE(soldes_2.laststatementnet, '0'::double precision)
Batches: 1 Memory Usage: 473kB
Buffers: shared hit=304
-> WindowAgg (cost=997.16..1117.65 rows=5355
width=39) (actual time=10.749..16.554 rows=1767 loops=1)
Run Condition: (rank() OVER (?) <= 1)
Buffers: shared hit=304
-> Sort (cost=997.16..1010.55 rows=5355
width=31) (actual time=10.712..11.828 rows=10412 loops=1)
Sort Key: soldes_2.idad,
soldes_2.idsociete, (COALESCE(soldes_2.date_closingperiod,
'1900-01-01'::date)) DESC
Sort Method: quicksort Memory: 1117kB
Buffers: shared hit=304
-> Nested Loop (cost=0.00..665.50
rows=5355 width=31) (actual time=0.017..5.694 rows=10412 loops=1)
Join Filter:
((soldes_2.date_closingperiod < cfg_3.p_datedu) OR
(soldes_2.date_closingperiod IS NULL))
Rows Removed by Join Filter: 5654
Buffers: shared hit=304
-> CTE Scan on cfg cfg_3
(cost=0.00..0.02 rows=1 width=4) (actual time=0.000..0.003 rows=1 loops=1)
-> Seq Scan on soldes soldes_2
(cost=0.00..464.66 rows=16066 width=31) (actual time=0.009..2.751
rows=16066 loops=1)
Buffers: shared hit=304
CTE detailcalcul
-> Append (cost=68592.14..497586.31 rows=2597561 width=248)
(actual time=1639.872..11346.625 rows=2598337 loops=1)
Buffers: shared hit=55228
" -> Subquery Scan on ""*SELECT* 1_1""
(cost=68592.14..484569.77 rows=2597528 width=236) (actual
time=1639.870..11004.550 rows=2598255 loops=1)"
Buffers: shared hit=55217
-> Hash Join (cost=68592.14..445606.85 rows=2597528
width=228) (actual time=1639.867..10540.052 rows=2598255 loops=1)
Hash Cond: (q.idzdroits = d.idzdroits)
Buffers: shared hit=55217
-> Seq Scan on zquoteparts q
(cost=0.00..68558.26 rows=2597528 width=28) (actual time=40.897..766.174
rows=2598255 loops=1)
Filter: (selectedqp > '0'::double precision)
Rows Removed by Filter: 103467
Buffers: shared hit=34784
-> Hash (cost=55214.69..55214.69 rows=1070196
width=45) (actual time=1595.683..1595.686 rows=1070196 loops=1)
Buckets: 2097152 Batches: 1 Memory Usage:
75956kB
Buffers: shared hit=20433
-> Hash Left Join (cost=1.02..55214.69
rows=1070196 width=45) (actual time=0.069..1275.813 rows=1070196 loops=1)
Hash Cond: ((upper((d.devise)::text)
= upper((p_1.code)::text)) AND (upper((CASE WHEN cfg_4.p_multidevise
THEN d.devise ELSE cfg_4.p_defaultdevise END)::text) =
upper((p_1.codedest)::text)))
Buffers: shared hit=20433
-> Nested Loop (cost=0.00..41835.94
rows=1070196 width=37) (actual time=0.030..359.845 rows=1070196 loops=1)
Buffers: shared hit=20432
-> CTE Scan on cfg cfg_4
(cost=0.00..0.02 rows=1 width=17) (actual time=0.003..0.020 rows=1 loops=1)
-> Seq Scan on zdroits d
(cost=0.00..31133.96 rows=1070196 width=20) (actual time=0.016..120.020
rows=1070196 loops=1)
Buffers: shared hit=20432
-> Hash (cost=1.01..1.01 rows=1
width=16) (actual time=0.023..0.023 rows=1 loops=1)
Buckets: 1024 Batches: 1
Memory Usage: 9kB
Buffers: shared hit=1
-> Seq Scan on parites p_1
(cost=0.00..1.01 rows=1 width=16) (actual time=0.008..0.009 rows=1 loops=1)
Buffers: shared hit=1
" -> Subquery Scan on ""*SELECT* 2_1"" (cost=26.90..28.74
rows=33 width=232) (actual time=0.322..0.395 rows=82 loops=1)"
Buffers: shared hit=11
-> Nested Loop (cost=26.90..27.91 rows=33 width=64)
(actual time=0.319..0.356 rows=82 loops=1)
Buffers: shared hit=11
-> CTE Scan on cfg cfg_5 (cost=0.00..0.02
rows=1 width=16) (actual time=0.001..0.002 rows=1 loops=1)
-> HashAggregate (cost=26.90..27.23 rows=33
width=24) (actual time=0.314..0.334 rows=82 loops=1)
Group Key: ce.idsociete, ce.idad
Batches: 1 Memory Usage: 32kB
Buffers: shared hit=11
-> Nested Loop (cost=0.00..26.57 rows=33
width=17) (actual time=0.183..0.262 rows=151 loops=1)
Join Filter: ((ce.datecredit >=
cfg_6.p_datedu) AND (ce.datecredit <= cfg_6.p_dateau))
Rows Removed by Join Filter: 738
Buffers: shared hit=11
-> CTE Scan on cfg cfg_6
(cost=0.00..0.02 rows=1 width=8) (actual time=0.001..0.001 rows=1 loops=1)
-> Seq Scan on creditsex ce
(cost=0.00..22.11 rows=296 width=21) (actual time=0.031..0.180 rows=889
loops=1)
Filter: (COALESCE(idcredextype,
0) < 1000)
Buffers: shared hit=11
CTE result1
-> WindowAgg (cost=3780661766.78..3780662817.80 rows=32339
width=259) (actual time=117198.780..117199.680 rows=742 loops=1)
Buffers: shared hit=58377
-> HashAggregate (cost=3780661766.78..3780662090.17
rows=32339 width=251) (actual time=117198.771..117199.261 rows=742 loops=1)
" Group Key: ""*SELECT* 1_2"".idad, ((""*SELECT*
1_2"".collecte)::numeric), ((""*SELECT*
1_2"".collectepondere)::numeric), ((""*SELECT* 1_2"".droits)::numeric),
((""*SELECT* 1_2"".droitsmaster)::numeric), ((""*SELECT*
1_2"".droitsdep)::numeric), ((""*SELECT* 1_2"".droitsdrm)::numeric),
((""*SELECT* 1_2"".credex)::double precision), ((""*SELECT*
1_2"".avances)::double precision), ""*SELECT* 1_2"".idsoc, ""*SELECT*
1_2"".devise, (false), (false), (false)"
Batches: 1 Memory Usage: 1705kB
Buffers: shared hit=58377
-> Append (cost=118530.92..3780660634.92 rows=32339
width=251) (actual time=21679.748..117196.878 rows=742 loops=1)
Buffers: shared hit=58377
" -> Subquery Scan on ""*SELECT* 1_2""
(cost=118530.92..118778.04 rows=16 width=235) (actual
time=21679.746..21681.827 rows=532 loops=1)"
Buffers: shared hit=58193
-> Nested Loop (cost=118530.92..118777.56
rows=16 width=59) (actual time=21679.743..21681.564 rows=532 loops=1)
Buffers: shared hit=58193
-> Subquery Scan on dc
(cost=118530.63..118532.03 rows=31 width=56) (actual
time=21679.708..21680.034 rows=540 loops=1)
Filter: (NOT (hashed SubPlan 7))
Rows Removed by Filter: 2
Buffers: shared hit=56573
-> HashAggregate
(cost=118529.62..118530.24 rows=62 width=56) (actual
time=21639.945..21640.121 rows=542 loops=1)
Group Key: a_3.idad,
a_3.forcedecomptesoc, cfg_7.p_defaultdevise, (0), (0), (0), (0), (0),
(0), (0), (0)
Batches: 1 Memory Usage:
129kB
Buffers: shared hit=56572
-> Append
(cost=58445.12..118527.92 rows=62 width=56) (actual
time=20816.522..21639.564 rows=556 loops=1)
Buffers: shared
hit=56572
-> Nested Loop
(cost=58445.12..60081.10 rows=51 width=56) (actual
time=20816.521..20826.515 rows=20 loops=1)
Buffers:
shared hit=56268
-> CTE Scan
on cfg cfg_7 (cost=0.00..0.02 rows=1 width=16) (actual
time=7167.481..7167.482 rows=1 loops=1)
Buffers: shared hit=2
-> Seq Scan
on ad a_3 (cost=58445.12..60080.57 rows=51 width=8) (actual
time=13649.036..13659.022 rows=20 loops=1)
Filter: ((forcedecomptesoc IS NOT NULL) AND (NOT (hashed SubPlan 8)))
Rows
Removed by Filter: 47779
Buffers: shared hit=56266
SubPlan 8
-> CTE Scan on detailcalcul (cost=0.00..51951.22 rows=2597561 width=4)
(actual time=1639.877..13071.959 rows=2598337 loops=1)
Buffers: shared hit=55228
-> Nested Loop
(cost=58445.12..58445.88 rows=11 width=56) (actual time=811.132..812.981
rows=536 loops=1)
Buffers:
shared hit=304
-> CTE Scan
on cfg cfg_8 (cost=0.00..0.02 rows=1 width=16) (actual
time=0.000..0.002 rows=1 loops=1)
-> CTE Scan
on currentsoldes2 cs (cost=58445.12..58445.75 rows=11 width=8) (actual
time=811.127..812.898 rows=536 loops=1)
Filter: ((NOT (hashed SubPlan 9)) AND ((newbalance > '0'::double
precision) OR (laststatementnet <> '0'::double precision)))
Rows
Removed by Filter: 1231
Buffers: shared hit=304
SubPlan 9
-> CTE Scan on detailcalcul detailcalcul_1 (cost=0.00..51951.22
rows=2597561 width=4) (actual time=39.106..363.440 rows=2598337 loops=1)
SubPlan 7
-> Seq Scan on
deceasedadlinks (cost=0.00..1.01 rows=1 width=4) (actual
time=38.904..38.906 rows=1 loops=1)
Buffers: shared hit=1
-> Index Scan using ad_pkey on ad
a_2 (cost=0.29..7.92 rows=1 width=4) (actual time=0.002..0.002 rows=1
loops=540)
Index Cond: (idad = dc.idad)
Filter: (NOT
COALESCE(isgroupead, false))
Rows Removed by Filter: 0
Buffers: shared hit=1620
-> Subquery Scan on p_2
(cost=63302.48..3628482823.36 rows=31024 width=251) (actual
time=13645.266..93288.857 rows=209 loops=1)
Buffers: shared hit=180
-> HashAggregate (cost=63302.48..64078.08
rows=31024 width=248) (actual time=13273.998..13275.661 rows=209 loops=1)
Group Key: a_4.idad, dc_1.idsoc,
dc_1.devise
Batches: 1 Memory Usage: 2065kB
Buffers: shared hit=180
-> Hash Join (cost=432.55..62449.32
rows=31024 width=248) (actual time=7.477..3304.431 rows=19190470 loops=1)
Hash Cond: (dc_1.idad =
gl.idadmembre)
Buffers: shared hit=180
-> CTE Scan on detailcalcul
dc_1 (cost=0.00..51951.22 rows=2597561 width=248) (actual
time=0.001..349.551 rows=2598337 loops=1)
-> Hash (cost=432.41..432.41
rows=11 width=8) (actual time=7.463..7.465 rows=9850 loops=1)
Buckets: 16384
(originally 1024) Batches: 1 (originally 1) Memory Usage: 513kB
Buffers: shared hit=180
-> Nested Loop
(cost=0.30..432.41 rows=11 width=8) (actual time=0.029..5.794 rows=9850
loops=1)
Buffers: shared hit=180
-> Seq Scan on
groupesadlink gl (cost=0.00..152.50 rows=9850 width=8) (actual
time=0.011..1.113 rows=9850 loops=1)
Buffers:
shared hit=54
-> Memoize
(cost=0.30..0.79 rows=1 width=4) (actual time=0.000..0.000 rows=1
loops=9850)
Cache Key:
gl.idadgroupe
Cache Mode:
logical
Hits: 9808
Misses: 42 Evictions: 0 Overflows: 0 Memory Usage: 5kB
Buffers:
shared hit=126
-> Index Scan
using ad_pkey on ad a_4 (cost=0.29..0.78 rows=1 width=4) (actual
time=0.003..0.003 rows=1 loops=42)
Index Cond: (idad = gl.idadgroupe)
Filter: isgroupead
Buffers: shared hit=126
SubPlan 10
-> Aggregate (cost=58477.59..58477.60
rows=1 width=8) (actual time=188.655..188.655 rows=1 loops=209)
-> CTE Scan on detailcalcul tdc
(cost=0.00..58445.12 rows=12988 width=8) (actual time=188.651..188.651
rows=0 loops=209)
Filter: (idad = p_2.idad)
Rows Removed by Filter: 2598337
SubPlan 11
-> Aggregate (cost=58477.59..58477.60
rows=1 width=8) (actual time=194.170..194.170 rows=1 loops=209)
-> CTE Scan on detailcalcul tdc_1
(cost=0.00..58445.12 rows=12988 width=8) (actual time=194.166..194.166
rows=0 loops=209)
Filter: (idad = p_2.idad)
Rows Removed by Filter: 2598337
-> Subquery Scan on p_3
(cost=133539.19..152058548.58 rows=1299 width=251) (actual
time=2225.769..2225.777 rows=1 loops=1)
Buffers: shared hit=4
-> GroupAggregate
(cost=133539.19..133711.31 rows=1299 width=297) (actual
time=1864.488..1864.493 rows=1 loops=1)
Group Key: a_5.idad, dc_2.idsoc,
dc_2.devise, dal.is_heir
Buffers: shared hit=4
-> Sort (cost=133539.19..133542.44
rows=1299 width=257) (actual time=1864.454..1864.458 rows=1 loops=1)
Sort Key: a_5.idad, dc_2.idsoc,
dc_2.devise, dal.is_heir
Sort Method: quicksort Memory: 25kB
Buffers: shared hit=4
-> Hash Join
(cost=123393.48..133472.01 rows=1299 width=257) (actual
time=1862.196..1864.432 rows=1 loops=1)
Hash Cond: (dc_2.idad =
dal.idaddeceased)
Buffers: shared hit=4
-> HashAggregate
(cost=123384.15..129878.05 rows=259756 width=248) (actual
time=1861.461..1864.170 rows=1275 loops=1)
Group Key:
dc_2.idad, dc_2.idsoc, dc_2.devise
Batches: 1 Memory
Usage: 16401kB
-> CTE Scan on
detailcalcul dc_2 (cost=0.00..51951.22 rows=2597561 width=248) (actual
time=0.001..294.781 rows=2598337 loops=1)
-> Hash (cost=9.32..9.32
rows=1 width=17) (actual time=0.085..0.087 rows=1 loops=1)
Buckets: 1024
Batches: 1 Memory Usage: 9kB
Buffers: shared hit=4
-> Nested Loop
(cost=0.29..9.32 rows=1 width=17) (actual time=0.080..0.082 rows=1 loops=1)
Buffers:
shared hit=4
-> Seq Scan
on deceasedadlinks dal (cost=0.00..1.01 rows=1 width=17) (actual
time=0.031..0.032 rows=1 loops=1)
Buffers: shared hit=1
-> Index Only
Scan using ad_pkey on ad a_5 (cost=0.29..8.31 rows=1 width=4) (actual
time=0.029..0.029 rows=1 loops=1)
Index Cond: (idad = dal.idadalive)
Heap
Fetches: 1
Buffers: shared hit=3
SubPlan 12
-> Aggregate (cost=58477.59..58477.60
rows=1 width=8) (actual time=176.146..176.147 rows=1 loops=1)
-> CTE Scan on detailcalcul tdc_2
(cost=0.00..58445.12 rows=12988 width=8) (actual time=176.130..176.130
rows=0 loops=1)
Filter: (idad = p_3.idad)
Rows Removed by Filter: 2598337
SubPlan 13
-> Aggregate (cost=58477.59..58477.60
rows=1 width=8) (actual time=185.099..185.100 rows=1 loops=1)
-> CTE Scan on detailcalcul tdc_3
(cost=0.00..58445.12 rows=12988 width=8) (actual time=185.084..185.084
rows=0 loops=1)
Filter: (idad = p_3.idad)
Rows Removed by Filter: 2598337
CTE allannuaires
-> HashAggregate (cost=4874.10..4876.86 rows=276 width=40)
(actual time=5.365..5.479 rows=513 loops=1)
Group Key: r_1.idad, (NULL::integer), (array_agg(DISTINCT
laa.idannuaire))
Batches: 1 Memory Usage: 105kB
Buffers: shared hit=3233
-> Append (cost=3069.41..4872.03 rows=276 width=40) (actual
time=1.434..5.119 rows=513 loops=1)
Buffers: shared hit=3233
-> GroupAggregate (cost=3069.41..4023.14 rows=200
width=40) (actual time=1.434..4.505 rows=509 loops=1)
Group Key: r_1.idad, NULL::integer
Buffers: shared hit=3215
-> Merge Join (cost=3069.41..3769.62 rows=33469
width=16) (actual time=1.380..3.651 rows=532 loops=1)
Merge Cond: (laa.idacteur = r_1.idad)
Buffers: shared hit=3215
-> Index Scan using
liensacteursannuaire_idacteur on liensacteursannuaire laa
(cost=0.28..188.46 rows=3997 width=12) (actual time=0.012..1.606
rows=3960 loops=1)
Buffers: shared hit=3215
-> Sort (cost=3069.13..3149.98 rows=32339
width=4) (actual time=1.325..1.384 rows=747 loops=1)
Sort Key: r_1.idad
Sort Method: quicksort Memory: 25kB
-> CTE Scan on result1 r_1
(cost=0.00..646.78 rows=32339 width=4) (actual time=0.002..1.223
rows=742 loops=1)
-> GroupAggregate (cost=835.43..844.75 rows=76
width=40) (actual time=0.467..0.544 rows=4 loops=1)
Group Key: NULL::integer, s_1.idsociete
Buffers: shared hit=18
-> Sort (cost=835.43..837.52 rows=837 width=16)
(actual time=0.445..0.470 rows=289 loops=1)
Sort Key: s_1.idsociete
Sort Method: quicksort Memory: 40kB
Buffers: shared hit=18
-> Hash Join (cost=18.66..794.79 rows=837
width=16) (actual time=0.133..0.398 rows=289 loops=1)
Hash Cond: (r_2.idsoc = s_1.idsociete)
Buffers: shared hit=18
-> CTE Scan on result1 r_2
(cost=0.00..646.78 rows=32339 width=4) (actual time=0.000..0.100
rows=742 loops=1)
-> Hash (cost=18.60..18.60 rows=5
width=12) (actual time=0.121..0.123 rows=8 loops=1)
Buckets: 1024 Batches: 1
Memory Usage: 9kB
Buffers: shared hit=18
-> Nested Loop
(cost=0.29..18.60 rows=5 width=12) (actual time=0.074..0.116 rows=8 loops=1)
Buffers: shared hit=18
-> Seq Scan on societes
s_1 (cost=0.00..2.76 rows=76 width=8) (actual time=0.007..0.016 rows=77
loops=1)
Buffers: shared hit=2
-> Memoize
(cost=0.29..2.36 rows=1 width=12) (actual time=0.001..0.001 rows=0 loops=77)
Cache Key:
s_1.idactorsolorealm
Cache Mode: logical
Hits: 71 Misses: 6
Evictions: 0 Overflows: 0 Memory Usage: 1kB
Buffers: shared hit=16
-> Index Scan
using liensacteursannuaire_idacteur on liensacteursannuaire laa_1
(cost=0.28..2.35 rows=1 width=12) (actual time=0.005..0.005 rows=1 loops=6)
Index Cond:
(idacteur = s_1.idactorsolorealm)
Buffers:
shared hit=16
-> Nested Loop Left Join (cost=4941.07..9833311.11 rows=61388000
width=1454) (actual time=117307.683..117434.084 rows=492 loops=1)
Buffers: shared hit=71920
-> Hash Left Join (cost=4940.78..11230.83 rows=61388
width=526) (actual time=117307.188..117323.931 rows=492 loops=1)
Hash Cond: ((a.idad = ap.idad) AND (s.idsociete =
ap.idsociete))
Buffers: shared hit=66286
-> Hash Left Join (cost=3589.51..9557.27 rows=61388
width=518) (actual time=117289.523..117305.951 rows=492 loops=1)
Hash Cond: (a.idclient = cl.idclient)
Buffers: shared hit=65963
-> Hash Left Join (cost=3588.44..9394.89
rows=61388 width=505) (actual time=117289.502..117305.645 rows=492 loops=1)
Hash Cond: (r.idsoc = aa2.idsociete)
Buffers: shared hit=65962
-> Hash Left Join (cost=3579.47..7103.89
rows=44484 width=473) (actual time=117289.389..117305.239 rows=492 loops=1)
Hash Cond: (r.idad = aa.idad)
Buffers: shared hit=65962
-> Hash Left Join
(cost=3570.50..5441.27 rows=32235 width=441) (actual
time=117283.600..117299.104 rows=492 loops=1)
Hash Cond: ((a.idad = x.idad) AND
(s.idsociete = x.idsociete))
Buffers: shared hit=62729
-> Hash Left Join
(cost=2268.46..3816.86 rows=32235 width=419) (actual
time=117262.207..117277.319 rows=490 loops=1)
Hash Cond: ((a.idad =
sl.idad) AND (s.idsociete = sl.idsociete))
Buffers: shared hit=62425
-> Hash Left Join
(cost=2267.65..3574.29 rows=32235 width=385) (actual
time=117261.493..117276.208 rows=489 loops=1)
Hash Cond: (r.idsoc =
s.idsociete)
Buffers: shared hit=62425
-> Hash Left Join
(cost=2263.94..3484.17 rows=32235 width=362) (actual
time=117261.404..117275.751 rows=489 loops=1)
Hash Cond:
(idannuaire_main(a.*) = ann.idannuaire)
Buffers: shared
hit=62423
-> Hash Join
(cost=2111.50..2843.18 rows=32235 width=1596) (actual
time=117259.217..117260.097 rows=489 loops=1)
Hash
Cond: (r.idad = a.idad)
Buffers: shared hit=59415
-> CTE
Scan on result1 r (cost=0.00..646.78 rows=32339 width=259) (actual
time=117198.783..117198.965 rows=742 loops=1)
Buffers: shared hit=58377
-> Hash
(cost=1515.96..1515.96 rows=47643 width=1337) (actual
time=60.315..60.316 rows=47648 loops=1)
Buckets: 65536 Batches: 1 Memory Usage: 10979kB
Buffers: shared hit=1038
-> Seq Scan on ad a (cost=0.00..1515.96 rows=47643 width=1337) (actual
time=0.047..46.338 rows=47648 loops=1)
Filter: calculatestatements
Rows Removed by Filter: 151
Buffers: shared hit=1038
-> Hash
(cost=103.31..103.31 rows=3931 width=34) (actual time=1.792..1.792
rows=3937 loops=1)
Buckets: 4096 Batches: 1 Memory Usage: 232kB
Buffers: shared hit=64
-> Seq
Scan on annuaire ann (cost=0.00..103.31 rows=3931 width=34) (actual
time=0.016..0.927 rows=3937 loops=1)
Buffers: shared hit=64
-> Hash
(cost=2.76..2.76 rows=76 width=23) (actual time=0.079..0.080 rows=77
loops=1)
Buckets: 1024
Batches: 1 Memory Usage: 13kB
Buffers: shared
hit=2
-> Seq Scan on
societes s (cost=0.00..2.76 rows=76 width=23) (actual time=0.025..0.052
rows=77 loops=1)
Buffers: shared hit=2
-> Hash (cost=0.46..0.46
rows=23 width=42) (actual time=0.703..0.703 rows=1767 loops=1)
Buckets: 2048
(originally 1024) Batches: 1 (originally 1) Memory Usage: 116kB
-> CTE Scan on
currentsoldes2 sl (cost=0.00..0.46 rows=23 width=42) (actual
time=0.003..0.254 rows=1767 loops=1)
-> Hash (cost=1301.70..1301.70
rows=23 width=30) (actual time=21.382..21.385 rows=2041 loops=1)
Buckets: 2048 (originally
1024) Batches: 1 (originally 1) Memory Usage: 104kB
Buffers: shared hit=304
-> Subquery Scan on x
(cost=1197.97..1301.70 rows=23 width=30) (actual time=20.156..20.915
rows=2041 loops=1)
Filter: (x.rang = 1)
Buffers: shared hit=304
-> HashAggregate
(cost=1197.97..1244.07 rows=4610 width=50) (actual time=20.154..20.632
rows=2041 loops=1)
Group Key:
soldes.idad, soldes.idsociete, rank() OVER (?), soldes.newbalance,
soldes.grossamountearnedexternally, soldes.date_closingperiod
Batches: 1
Memory Usage: 473kB
Buffers: shared
hit=304
-> WindowAgg
(cost=997.16..1117.65 rows=5355 width=50) (actual time=13.213..19.195
rows=2041 loops=1)
Run
Condition: (rank() OVER (?) <= 1)
Buffers: shared hit=304
-> Sort
(cost=997.16..1010.55 rows=5355 width=42) (actual time=13.200..14.167
rows=14598 loops=1)
Sort Key: soldes.idad, soldes.idsociete,
(COALESCE(soldes.date_closingperiod, '1900-01-01'::date)) DESC
Sort Method: quicksort Memory: 1411kB
Buffers: shared hit=304
-> Nested Loop (cost=0.00..665.50 rows=5355 width=42) (actual
time=0.014..5.814 rows=14598 loops=1)
Join Filter: ((soldes.date_closingperiod <= cfg.p_dateau) OR
(soldes.date_closingperiod IS NULL))
Rows Removed by Join Filter: 1468
Buffers: shared hit=304
-> CTE Scan on cfg (cost=0.00..0.02 rows=1 width=4) (actual
time=0.001..0.001 rows=1 loops=1)
-> Seq Scan on soldes (cost=0.00..464.66 rows=16066 width=38) (actual
time=0.008..2.592 rows=16066 loops=1)
Buffers: shared hit=304
-> Hash (cost=5.52..5.52 rows=276
width=36) (actual time=5.779..5.780 rows=509 loops=1)
Buckets: 1024 Batches: 1 Memory
Usage: 42kB
Buffers: shared hit=3233
-> CTE Scan on allannuaires aa
(cost=0.00..5.52 rows=276 width=36) (actual time=5.368..5.665 rows=513
loops=1)
Buffers: shared hit=3233
-> Hash (cost=5.52..5.52 rows=276 width=36)
(actual time=0.105..0.106 rows=4 loops=1)
Buckets: 1024 Batches: 1 Memory
Usage: 9kB
-> CTE Scan on allannuaires aa2
(cost=0.00..5.52 rows=276 width=36) (actual time=0.002..0.065 rows=513
loops=1)
-> Hash (cost=1.03..1.03 rows=3 width=17) (actual
time=0.012..0.014 rows=3 loops=1)
Buckets: 1024 Batches: 1 Memory Usage: 9kB
Buffers: shared hit=1
-> Seq Scan on clients cl (cost=0.00..1.03
rows=3 width=17) (actual time=0.006..0.007 rows=3 loops=1)
Buffers: shared hit=1
-> Hash (cost=1351.26..1351.26 rows=1 width=16) (actual
time=17.652..17.658 rows=190 loops=1)
Buckets: 1024 Batches: 1 Memory Usage: 17kB
Buffers: shared hit=323
-> Subquery Scan on ap (cost=1351.23..1351.26
rows=1 width=16) (actual time=17.500..17.618 rows=190 loops=1)
Buffers: shared hit=323
-> GroupAggregate (cost=1351.23..1351.25
rows=1 width=16) (actual time=17.498..17.593 rows=190 loops=1)
Group Key: p.idad, p.idsociete
Buffers: shared hit=323
-> Sort (cost=1351.23..1351.23 rows=1
width=16) (actual time=17.491..17.510 rows=190 loops=1)
Sort Key: p.idad, p.idsociete
Sort Method: quicksort Memory: 35kB
Buffers: shared hit=323
-> Nested Loop
(cost=1246.18..1351.22 rows=1 width=16) (actual time=16.185..17.447
rows=190 loops=1)
Join Filter:
(p.dateinperiod <= cfg_1.p_dateau)
Rows Removed by Join
Filter: 111
Buffers: shared hit=323
-> Hash Join
(cost=1246.18..1351.19 rows=1 width=20) (actual time=16.174..17.303
rows=301 loops=1)
Hash Cond: ((x_1.idad
= p.idad) AND (x_1.idsociete = p.idsociete))
Join Filter:
(p.dateinperiod > x_1.date_closingperiod)
Rows Removed by Join
Filter: 1380
Buffers: shared hit=323
-> Subquery Scan on
x_1 (cost=1184.58..1288.31 rows=23 width=12) (actual
time=15.506..16.172 rows=1922 loops=1)
Filter:
(x_1.rang = 1)
Buffers: shared
hit=304
->
HashAggregate (cost=1184.58..1230.68 rows=4610 width=32) (actual
time=15.504..15.928 rows=1922 loops=1)
Group
Key: soldes_1.idad, soldes_1.idsociete, rank() OVER (?),
soldes_1.newbalance, soldes_1.date_closingperiod
Batches: 1 Memory Usage: 473kB
Buffers: shared hit=304
->
WindowAgg (cost=997.16..1117.65 rows=5355 width=32) (actual
time=9.371..14.611 rows=1923 loops=1)
Run Condition: (rank() OVER (?) <= 1)
Buffers: shared hit=304
-> Sort (cost=997.16..1010.55 rows=5355 width=24) (actual
time=9.360..10.177 rows=12988 loops=1)
Sort Key: soldes_1.idad, soldes_1.idsociete,
(COALESCE(soldes_1.date_closingperiod, '1900-01-01'::date)) DESC
Sort Method: quicksort Memory: 1298kB
Buffers: shared hit=304
-> Nested Loop (cost=0.00..665.50 rows=5355 width=24) (actual
time=0.008..4.374 rows=12988 loops=1)
Join Filter: ((soldes_1.date_closingperiod < cfg_2.p_dateau) OR
(soldes_1.date_closingperiod IS NULL))
Rows Removed by Join Filter: 3078
Buffers: shared hit=304
-> CTE Scan on cfg cfg_2 (cost=0.00..0.02 rows=1 width=4) (actual
time=0.000..0.001 rows=1 loops=1)
-> Seq Scan on soldes soldes_1 (cost=0.00..464.66 rows=16066 width=20)
(actual time=0.003..1.879 rows=16066 loops=1)
Buffers: shared hit=304
-> Hash
(cost=36.04..36.04 rows=1704 width=20) (actual time=0.643..0.644
rows=1704 loops=1)
Buckets: 2048
Batches: 1 Memory Usage: 103kB
Buffers: shared
hit=19
-> Seq Scan on
payments p (cost=0.00..36.04 rows=1704 width=20) (actual
time=0.009..0.248 rows=1704 loops=1)
Buffers: shared hit=19
-> CTE Scan on cfg cfg_1
(cost=0.00..0.02 rows=1 width=4) (actual time=0.000..0.000 rows=1 loops=301)
-> Function Scan on calculate_net cn (cost=0.29..10.29
rows=1000 width=168) (actual time=0.211..0.211 rows=1 loops=492)
Buffers: shared hit=5634
Planning:
Buffers: shared hit=106
Planning Time: 15.825 ms
JIT:
Functions: 458
Options: Inlining true, Optimization true, Expressions true,
Deforming true
Timing: Generation 90.276 ms, Inlining 44.404 ms, Optimization
4297.544 ms, Emission 2940.759 ms, Total 7372.983 ms
Execution Time: 117642.499 ms
And this is the query:
EXPLAIN(ANALYZE, BUFFERS)
WITH cfg AS (
SELECT
(SELECT multidevise FROM config LIMIT 1) AS p_multidevise
,(SELECT monnaie FROM config LIMIT 1) AS p_defaultdevise
,:datedu::DATE AS p_datedu
,:dateau::DATE AS p_dateau
)
, daz_adinroy AS (
SELECT DISTINCT idad, idoeu, COALESCE(ra.controllingsoc, o.idsociete)
AS idsociete
FROM royaltiesad ra
JOIN oeu o USING(idoeu)
UNION
SELECT DISTINCT ra.idad, o.idoeu, COALESCE(ra.controllingsoc,
a.idsociete, o.idsociete) AS idsociete
FROM royaltiesad ra
JOIN agreements a using(idagreement)
JOIN groupes g USING(idagreement)
JOIN oegroupes og USING(idgroupe)
JOIN oeu o ON og.idoeu=o.idoeu
)
, daz_allad AS (
SELECT idad, idoeu, COALESCE(a.stmt_idsociete_forced, idsociete) AS
idsociete
FROM daz_adinroy
JOIN ad a USING(idad)
WHERE NULLIF(specialsplit,0) IS NULL
UNION
SELECT ca.idad, air.idoeu, COALESCE(a.stmt_idsociete_forced,
idsociete) AS idsociete
FROM daz_adinroy air
JOIN ad a USING(idad)
JOIN copyrightad ca ON ca.idoeu=air.idoeu AND ca.iscontrolled and
a.idad=ca.idad
AND ( (specialsplit=1 AND
ca.role IN ('A','C','CA','AC','AD','AR','I'))
OR (specialsplit=2 AND
ca.role IN ('E','CE','SE','ES'))
OR (specialsplit=3) )
WHERE specialsplit>0
)
,payablead AS (
SELECT DISTINCT idad FROM royaltiesad
)
,currentsoldes AS (
SELECT DISTINCT idad,idsociete,rank() OVER (PARTITION BY
idad,idsociete ORDER BY COALESCE(date_closingperiod,'1900-01-01') DESC )
AS rang, newbalance, postponed_gross_master,
COALESCE(laststatementnet,0) AS laststatementnet
FROM soldes
CROSS JOIN cfg
-- attention : < et pas <=
WHERE date_closingperiod<p_datedu OR date_closingperiod IS NULL
)
,currentsoldes2 AS (
SELECT idad,idsociete,newbalance, postponed_gross_master,
laststatementnet
FROM currentsoldes
WHERE rang=1
)
,detailcalcul AS (
SELECT q.idad
,ARRONDIS4(coalesce(p.taux,1)*d.montant) AS collecte
,ARRONDIS4(coalesce(p.taux,1)*d.montant*q.baseredevance/100) AS
collectepondere
,CASE WHEN d.typedroits BETWEEN 1 AND 20 THEN
ARRONDIS4(coalesce(p.taux,1)*(q.selectedqp/100)*d.montant*q.baseredevance/100)
ELSE NULL END AS droits
,CASE WHEN d.typedroits BETWEEN 21 AND 22 THEN
ARRONDIS4(coalesce(p.taux,1)*(q.selectedqp/100)*d.montant*q.baseredevance/100)
ELSE NULL END AS droitsmaster
,CASE WHEN d.typedroits IN (1,9) THEN
ARRONDIS4(coalesce(p.taux,1)*(q.selectedqp/100)*d.montant*q.baseredevance/100)
ELSE NULL END AS droitsDEP
,CASE WHEN d.typedroits IN (2,10) THEN
ARRONDIS4(coalesce(p.taux,1)*(q.selectedqp/100)*d.montant*q.baseredevance/100)
ELSE NULL END AS droitsDRM
,0 AS credex
,0 AS avances
,q.idsoc
,CAST(CASE WHEN p_multidevise THEN d.devise ELSE
p_defaultdevise END AS VARCHAR(4)) AS devise
FROM zDroits d
CROSS JOIN cfg
LEFT JOIN parites p ON UPPER(p.code)=UPPER(d.devise) AND
UPPER(p.codedest)=UPPER(CASE WHEN p_multidevise THEN d.devise ELSE
p_defaultdevise END)
JOIN zQuoteParts q USING(idzdroits)
WHERE q.selectedqp>0
UNION ALL
-- Ajouter les crédits exceptionnels pour faire apparaître les
décomptes pour ceux qui n'ont pas de droits, juste des crédits ex
SELECT cr.idad, 0, 0, 0, 0, 0, 0, cr.credex, cr.avances,
cr.idsociete, p_defaultdevise AS devise
FROM (
SELECT idsociete
,idad
,COALESCE(sum(CASE WHEN NOT COALESCE(isnet,FALSE) THEN
montant ELSE 0 END),0) as credex
,COALESCE(sum(CASE WHEN isnet THEN montant ELSE 0 END),0)
as avances
FROM creditsex ce
CROSS JOIN cfg
WHERE datecredit BETWEEN p_datedu AND p_dateau
AND COALESCE(ce.idcredextype,0)<1000
GROUP BY idsociete,idad
) cr
CROSS JOIN cfg
)
, detailcalcul2 AS (
-- forcer un décompte sur la société XXX
SELECT a.idad, a.forcedecomptesoc AS idsoc, p_defaultdevise AS
devise, 0 AS collecte, 0 AS collectepondere, 0 AS droits, 0 AS
droitsmaster, 0 AS droitsDEP, 0 AS droitsDRM, 0 AS credex, 0 AS avances
FROM ad a
CROSS JOIN cfg
WHERE a.forcedecomptesoc IS NOT NULL
AND a.idad NOT IN (SELECT idad FROM detailcalcul)
-- UNION les AD qui ont un solde brut > 0 ou net <> 0
UNION
SELECT cs.idad, cs.idsociete, p_defaultdevise AS devise, 0 AS
collecte, 0 AS collectepondere, 0 AS droits, 0 AS droitsmaster, 0 AS
droitsDEP, 0 AS droitsDRM, 0 AS credex, 0 AS avances
FROM currentsoldes2 cs
CROSS JOIN cfg
WHERE (cs.newbalance>0 OR cs.laststatementnet<>0)
AND cs.idad NOT IN (SELECT idad FROM detailcalcul)
-- UNION detailcalcul pour daz in [0,2]
-- &union1
-- UNION daz_allad pour daz in [1,2]
-- &union2
)
, detailscalcul2groupe_pre AS (
SELECT a.idad
,dc.idsoc
,dc.devise
,SUM(dc.collecte) AS collecte
,SUM(dc.collectepondere) AS collectepondere
,SUM(dc.droits) AS droits
,SUM(dc.droitsmaster) AS droitsmaster
,SUM(dc.droitsDEP) AS droitsDEP
,SUM(dc.droitsDRM) AS droitsDRM
,SUM(dc.credex) AS credex
,SUM(dc.avances) AS avances
FROM detailcalcul dc
JOIN groupesadlink gl ON gl.idadmembre=dc.idad
JOIN ad a ON a.idad=gl.idadgroupe
WHERE a.isgroupead
GROUP BY a.idad,idsoc, dc.devise
)
, detailscalcul2groupe AS (
SELECT idad
,idsoc
,devise
,collecte
,collectepondere
,droits
,droitsmaster
,droitsDEP
,droitsDRM
,credex + COALESCE((SELECT SUM(credex) FROM detailcalcul
tdc WHERE tdc.idad=p.idad),0) AS credex
,avances + COALESCE((SELECT SUM(avances) FROM detailcalcul
tdc WHERE tdc.idad=p.idad),0) AS avances
FROM detailscalcul2groupe_pre p
)
,detailscalcul2heritiers_pre1 AS (
SELECT dc.idad
,dc.idsoc
,dc.devise
,SUM(dc.collecte) AS collecte
,SUM(dc.collectepondere) AS collectepondere
,SUM(dc.droits) as droits
,SUM(dc.droitsmaster) as droitsmaster
,SUM(dc.droitsDEP) as droitsDEP
,SUM(dc.droitsDRM) as droitsDRM
,SUM(dc.credex) AS credex
,SUM(dc.avances) AS avances
FROM detailcalcul dc
GROUP BY dc.idad, dc.idsoc, dc.devise
-- &union2
)
,detailscalcul2heritiers_pre2 AS (
SELECT a.idad
,dc.idsoc
,dc.devise
,dal.is_heir
,SUM(dc.collecte) AS collecte
,SUM(dc.collectepondere) AS collectepondere
,SUM( ARRONDIS4(dc.droits * COALESCE(dal.share,0)/100) )
as droits
,SUM( ARRONDIS4(dc.droitsmaster *
COALESCE(dal.share,0)/100) ) as droitsmaster
,SUM( ARRONDIS4(dc.droitsDEP * COALESCE(dal.share,0)/100)
) as droitsDEP
,SUM( ARRONDIS4(dc.droitsDRM * COALESCE(dal.share,0)/100)
) as droitsDRM
,SUM( ARRONDIS4(dc.credex * COALESCE(dal.share,0)/100) )
AS credex
,SUM( ARRONDIS4(dc.avances * COALESCE(dal.share,0)/100) )
AS avances
FROM detailscalcul2heritiers_pre1 dc
JOIN deceasedadlinks dal ON dal.idaddeceased=dc.idad
JOIN ad a on a.idad=dal.idadalive
GROUP BY a.idad, idsoc, dc.devise, dal.is_heir
)
,detailscalcul2heritiers AS (
SELECT idad
,idsoc
,devise
,collecte
,collectepondere
,droits
,droitsmaster
,droitsDEP
,droitsDRM
,credex + COALESCE((SELECT SUM(credex) FROM
detailcalcul tdc WHERE tdc.idad=p.idad),0) AS credex
,avances + COALESCE((SELECT SUM(avances) FROM
detailcalcul tdc WHERE tdc.idad=p.idad),0) AS avances
,is_heir
FROM detailscalcul2heritiers_pre2 p
)
, result1 AS (
SELECT z.*, row_number() OVER() AS position
FROM (
SELECT dc.idad,dc.collecte, dc.collectepondere, dc.droits,
dc.droitsmaster, dc.droitsDEP, dc.droitsDRM, dc.credex, dc.avances,
dc.idsoc, dc.devise, false AS isgroup, false AS isheritier, false AS
cotisationsheritier
FROM detailcalcul2 dc
JOIN ad a USING(idad)
WHERE NOT COALESCE(a.isgroupead,FALSE)
AND NOT idad IN (SELECT idadalive FROM deceasedadlinks)
UNION
SELECT dc.idad,dc.collecte, dc.collectepondere, dc.droits,
dc.droitsmaster, dc.droitsDEP, dc.droitsDRM, dc.credex, dc.avances,
dc.idsoc, dc.devise, true AS isgroup, false AS isheritier, false AS
cotisationsheritier
FROM detailscalcul2groupe dc
UNION
SELECT dc.idad,dc.collecte, dc.collectepondere, dc.droits,
dc.droitsmaster, dc.droitsDEP, dc.droitsDRM, dc.credex, dc.avances,
dc.idsoc, dc.devise, false AS isgroup, true AS isheritier, is_heir AS
cotisationsheritier
FROM detailscalcul2heritiers dc
) z
)
,lastsoldes AS (
SELECT idad,idsociete,newbalance, date_closingperiod,
GrossAmountEarnedExternally
FROM (
SELECT DISTINCT idad,idsociete,rank() OVER (PARTITION BY
idad,idsociete ORDER BY COALESCE(date_closingperiod,'1900-01-01') DESC )
AS rang, newbalance, GrossAmountEarnedExternally, date_closingperiod
FROM soldes
CROSS JOIN cfg
-- attention : <= et pas <
WHERE date_closingperiod<=p_dateau OR date_closingperiod IS NULL
) x
WHERE x.rang=1
)
,lastsoldesforpayments AS (
SELECT idad,idsociete,newbalance, date_closingperiod
FROM (
SELECT DISTINCT idad,idsociete,rank() OVER (PARTITION BY
idad,idsociete ORDER BY COALESCE(date_closingperiod,'1900-01-01') DESC )
AS rang, newbalance, date_closingperiod
FROM soldes
CROSS JOIN cfg
-- attention : < et pas <= car si la période a déjà été
clôturée, on ne voit aucun paiement
WHERE date_closingperiod<p_dateau OR date_closingperiod IS NULL
) x
WHERE rang=1
)
,apayments AS (
SELECT p.idad,p.idsociete,SUM(amount) AS totpayments
FROM payments p
CROSS JOIN cfg
LEFT JOIN lastsoldesforpayments ls ON ls.idad=p.idad AND
ls.idsociete=p.idsociete
WHERE p.dateinperiod>date_closingperiod AND p.dateinperiod<=p_dateau
GROUP BY p.idad,p.idsociete
)
,allannuaires AS (
SELECT r.idad, NULL::INT AS idsociete, array_agg(DISTINCT
idannuaire) AS idannuaires
FROM result1 r
JOIN LiensActeursAnnuaire laa ON laa.idacteur=r.idad
GROUP BY 1,2
UNION
SELECT NULL::INT AS idad, s.idsociete, array_agg(DISTINCT
idannuaire) AS idannuaires
FROM result1 r
JOIN societes s ON r.idsoc=s.idsociete
JOIN LiensActeursAnnuaire laa ON laa.idacteur=s.idactorsolorealm
GROUP BY 1,2
)
SELECT r.idad
,r.collecte
,r.collectepondere
,ARRONDIS(r.droits) AS droits
,ARRONDIS(r.droitsmaster) AS droitsmaster
,ARRONDIS(r.droitsDEP) AS droitsDEP
,ARRONDIS(r.droitsDRM) AS droitsDRM
,r.credex
,r.avances
,ARRONDIS(COALESCE(sl.newbalance,0)+r.droits+r.credex) AS montantdu
,ARRONDIS(COALESCE(sl.postponed_gross_master,0)+r.droitsmaster) AS
montantdumaster
,r.idsoc
,r.devise
,isgroup
,r.isheritier
,(a.nom || COALESCE(' (' || NULLIF(TRIM(a.libelledecompte),'') ||
')', ''))::VARCHAR(100) AS nomad
,NULLIF(TRIM(COALESCE(ann.email,a.email)),'')::VARCHAR(200) AS email
,NULLIF(TRIM(COALESCE(ann.email,a.email)),'') IS NOT NULL AS hasemail
,COALESCE(s.nom,'Société indéfinie')::VARCHAR(30) AS nomsociete
,sl.newbalance
,sl.postponed_gross_master
,cn.*
,r.position
-- ,CASE WHEN ARRONDIS(COALESCE(sl.newbalance,0)+r.droits+r.credex)
>= cn.paymentthreshold THEN
ARRONDIS(COALESCE(sl.newbalance,0)+r.droits+r.credex) ELSE 0 END AS apayer
-- ,CASE WHEN ARRONDIS(COALESCE(sl.newbalance,0)+r.droits+r.credex)
< cn.paymentthreshold THEN
ARRONDIS(COALESCE(sl.newbalance,0)+r.droits+r.credex) ELSE 0 END AS
areporter
,CASE WHEN ARRONDIS( cn.netpayable +
COALESCE(sl.laststatementnet,0) - COALESCE(ap.totpayments,0) ) >=
cn.paymentthreshold THEN ARRONDIS( cn.netpayable +
COALESCE(sl.laststatementnet,0) - COALESCE(ap.totpayments,0) ) ELSE 0
END AS apayer
,CASE WHEN ARRONDIS( cn.netpayable +
COALESCE(sl.laststatementnet,0) - COALESCE(ap.totpayments,0) ) <
cn.paymentthreshold THEN
ARRONDIS(COALESCE(sl.newbalance,0)+r.droits+r.credex) ELSE 0 END AS
areporter
,lc.date_closingperiod
,a.idclient
,cl.name AS clientname
,-ap.totpayments AS totpayments
,COALESCE(sl.laststatementnet,0) - COALESCE(ap.totpayments,0) AS
openingbalance
,COALESCE(sl.laststatementnet,0) AS laststatementnet
,a.ispayable
,r.cotisationsheritier
,s.idrealm
,ann.idannuaire
,COALESCE(ann.wantsenglish,FALSE) AS wantsenglish
,aa.idannuaires
,aa2.idannuaires AS idannuaires2
,COALESCE(ann.disablenotifications,FALSE) AS DisableNotifications
,ann.iscompany
FROM result1 r
JOIN ad a USING(idad)
LEFT JOIN allannuaires aa USING(idad)
LEFT JOIN allannuaires aa2 ON r.idsoc=aa2.idsociete
LEFT JOIN annuaire ann ON a.idannuaire_main=ann.idannuaire
LEFT JOIN societes s ON s.idsociete=r.idsoc
LEFT JOIN currentsoldes2 sl ON sl.idad=a.idad AND sl.idsociete=s.idsociete
LEFT JOIN lastsoldes lc ON lc.idad=a.idad AND lc.idsociete=s.idsociete
LEFT JOIN
calculate_net(a.idad,s.idsociete,ARRONDIS(COALESCE(sl.newbalance,0)+r.droits+r.credex),r.droitsDEP,r.droitsDRM,ARRONDIS(COALESCE(sl.postponed_gross_master,0)+r.droitsmaster),lc.GrossAmountEarnedExternally,r.cotisationsheritier)
cn ON TRUE
LEFT JOIN clients cl ON cl.idclient=a.idclient
LEFT JOIN apayments ap ON ap.idad=a.idad AND ap.idsociete=s.idsociete
WHERE a.calculatestatements
ORDER BY s.nom,cl.name,a.nom;