programing

복잡한 선택 CASE 식(하위 쿼리 포함)의 쿼리 시간을 줄이는 데 도움이 필요합니다.

topblog 2023. 9. 10. 11:53
반응형

복잡한 선택 CASE 식(하위 쿼리 포함)의 쿼리 시간을 줄이는 데 도움이 필요합니다.

쿼리를 더 빨리 실행하려고 합니다.질의는 크지만, 복잡한 선택 CASE 질의 부분에 중점을 두어야 한다고 생각합니다.

        (CASE 
            WHEN (SELECT
                g2.montant_ht_actualise_echeance 
            FROM
                base_gid g2 
            WHERE
                g.num_contrat = g2.num_contrat 
                AND g.code_nidt = g2.code_nidt 
                AND g.libelle_rubrique_echeance = g2.libelle_rubrique_echeance 
                AND g.nom_tiers = g2.nom_tiers 
                AND (
                    g.year_echeance - g2.year_echeance
                ) = 1 LIMIT 1) IS NULL THEN g.montant_ht_actualise_echeance 
            WHEN g.montant_ht_actualise_echeance > ((SELECT
                g4.montant_ht_actualise_echeance 
            FROM
                base_gid g4 
            WHERE
                g.num_contrat = g4.num_contrat 
                AND g.code_nidt = g4.code_nidt 
                AND g.libelle_rubrique_echeance = g4.libelle_rubrique_echeance 
                AND g.nom_tiers = g4.nom_tiers 
                AND (
                    g.year_echeance - g4.year_echeance
                ) = 1 LIMIT 1) * 1.1) THEN g.montant_ht_actualise_echeance 
            WHEN g.code_indice LIKE 'ICC%' 
            OR g.code_indice = '' THEN CASE 
                WHEN g.periode_courante_indice_echeance IN (SELECT
                    indice_icc.icc_periode 
                FROM
                    indice_icc) THEN ROUND(g.montant_ht_actualise_echeance,
                2) 
                ELSE ROUND((g.montant_ht_actualise_echeance * :filtre_indice_icc),
                2) 
            END 
            ELSE g.montant_ht_actualise_echeance 
        END) montant_ht_actualise_echeance 

case statement의 논리는 다음과 같습니다.

'montant_actualis_echeance' 열을 편집하려고 합니다.

  • CASE 1 : 전년도 청구서 없음 -> 'montant_actualis_echeance' 변경 없음

  • CASE 2 : 전년도 청구서 * 1.1이 montant_actualis_echeance -> 'montant_actualis_echeance'로 변경되지 않음

  • 케이스 3: ICC 열이 ICC와 같거나 비어 있는 경우:

    • icc 테이블에 현재 행의 타임스탬프가 있는 경우 -> 'montant_actualis_echeance'로 변경되지 않습니다.

    • 기타 -> montant_ht_actualis_echance * icc (사용자입력)

  • ELSE -> 'montant_actualis_echeance'로 변경되지 않음

설명 결과는 다음과 같습니다.

저는 MariaDB 10.1을 사용하고 있습니다.

우선 당신의 서브쿼리가 "컨버팅 인덱스"를 사용할 수 있는지 확인하는 것부터 시작하겠습니다.존재 여부를 확인하는 인덱스는 다음과 같습니다.

create index ix1 on base_gid (
  num_contrat, code_nidt, libelle_rubrique_echeance,
  nom_tiers, year_echeance, montant_ht_actualise_echeance
);

다른 유용한 인덱스(아직 없는 경우)는 다음과 같습니다.

create index ix2 on indice_icc (icc_periode);

언급URL : https://stackoverflow.com/questions/55222905/i-need-help-reducing-query-time-of-complex-select-case-expression-with-subqueri

반응형