query-smaller.sql

application/sql

Filename: query-smaller.sql
Type: application/sql
Part: 1
Message: Re: AW: Wrong rows estimations with joins of CTEs slows queries by more than factor 500
explain
with
qup as (
    select
         curr_season -- all xxx_seasosn are always smallint
        ,curr_code-- all xx_code are always varchar(10)
        ,array_agg(id_up order by id_up)||array_fill(0::smallint,array[10]) as mat_arr
        ,array_agg(curr_mat_code order by id_up) as matcode_arr
        ,bit_or(imask) as ibitmask
    from(
        select
             sup_season as curr_season
            ,sup_sa_code as curr_code
            ,sup_mat_code as curr_mat_code
            ,sup_clr_code as curr_clr_code
            ,id_up
            ,coalesce(id_up,-1) as imask
        from only sa_upper
        left join upper_target on up_mat_code=sup_mat_code and id_up <= (512-1-16)
    ) qr
    group by 1,2
)
,qli as (
    select
         curr_season
        ,curr_code
        ,array_agg(id_li order by id_li)||array_fill(0::smallint,array[4]) as mat_arr
        ,array_agg(curr_mat_code order by id_li) as matcode_arr
        ,bit_or(imask) as ibitmask
    from(
        select
             sli_season as curr_season
            ,sli_sa_code as curr_code
            ,sli_mat_code as curr_mat_code
            ,sli_clr_code as curr_clr_code
            ,id_li
            ,coalesce(id_li,-1) as imask
        from only sa_lining
        left join lining_target on li_mat_code=sli_mat_code and id_li <= (128-1-8)
    ) qr
    group by 1,2
)
,qin as (
select
     curr_season
    ,curr_code
    ,array_agg(id_in order by id_in)||array_fill(0::smallint,array[4]) as mat_arr
    ,array_agg(curr_mat_code order by id_in) as matcode_arr
    ,bit_or(imask) as ibitmask
    from(
        select
             sin_season as curr_season
            ,sin_sa_code as curr_code
            ,sin_mat_code as curr_mat_code
            ,sin_clr_code as curr_clr_code
            ,id_in
            ,coalesce(id_in,-1) as imask
        from only sa_insole
        left join insole_target on in_mat_code=sin_mat_code and id_in <= (128-1-8)
    ) qr
    group by 1,2
)
,qou as (
    select
         curr_season
        ,curr_code
        ,array_agg(id_ou order by id_ou)||array_fill(0::smallint,array[6]) as mat_arr
        ,array_agg(curr_mat_code order by id_ou) as matcode_arr
        ,bit_or(imask) as ibitmask
    from(
        select
             sou_season as curr_season
            ,sou_sa_code as curr_code
            ,sou_mat_code as curr_mat_code
            ,sou_clr_code as curr_clr_code
            ,id_ou
            ,coalesce(id_ou,-1) as imask
        from only sa_outsole
        left join outsole_target on ou_mat_code=sou_mat_code and id_ou <= (32-1-2)
    ) qr
    group by 1,2
)
,qupd as (
    select * from (
        select
             qup.curr_season
            ,qup.curr_code
            ,qup.ibitmask|qin.ibitmask|qli.ibitmask|qou.ibitmask as ibitmask
            -- the calculations of new_mat_x are simplified here
            -- in the production version they are a more complex combination of bit masks, bit shifts and bit or of different elements of the arrays
            ,(qup.mat_arr[1]|qli.mat_arr[1]|qin.mat_arr[1]|qou.mat_arr[1])::bigint as new_mat_1
            
            ,(qup.mat_arr[2]|qli.mat_arr[2]|qin.mat_arr[2]|qou.mat_arr[2])::bigint as new_mat_2
            
            ,(qup.mat_arr[3]|qli.mat_arr[3]|qin.mat_arr[3]|qou.mat_arr[3])::bigint as new_mat_3
        
        from qup
        left join qli on (qli.curr_season=qup.curr_season and qli.curr_code=qup.curr_code)
        left join qin on (qin.curr_season=qup.curr_season and qin.curr_code=qup.curr_code)
        left join qou on (qou.curr_season=qup.curr_season and qou.curr_code=qup.curr_code)
        where qup.ibitmask>0 and cardinality(qup.mat_arr) <=21
    )qj
    where ibitmask is not null
)
select
 curr_season
,curr_code
,new_mat_1
,new_mat_2
,new_mat_3
,NULL::bigint as new_mattype_bitmask
,NULL as new_mat_codes
from qupd;