복잡한 선택 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
'programing' 카테고리의 다른 글
Windows : 크기와 마지막 액세스 날짜로 파일을 재귀적으로 나열하는 방법? (0) | 2023.09.10 |
---|---|
Oracle 11g dmp 가져오기.ORA-39000 / ORA-39143 오류 (0) | 2023.09.10 |
프로그램 stdout 및 stderr을 개별 변수로 캡처 (0) | 2023.09.10 |
cs 플렉스박스에 래핑할 요소를 지정하는 방법? (0) | 2023.09.10 |
jQuery getJ올바른 JSON에 대한 SON 구문 오류 (0) | 2023.09.10 |