티스토리 뷰

SQL

SQL 레벨업 - 3장 SQL의 조건분기

chaewonni 2023. 9. 24. 00:35

8강 UNION을 사용한 쓸데없이 긴 표현

1, 정확한 판단 없는 UNION 사용 회피

SELECT item_name, year, price_tax_ex AS price
	FROM Items
  WHERE year <= 2001
 UNION ALL
 SELECT item_name, year, price_tax_in AS price
 	FROM Items
  WHERE year >= 2002;

UNION 을 사용했을 때

-쓸데 없이 긴 SQL문, Items 테이블에 2회 접근 + 그때마다 TABLE ACCESS FULL 발생

  -> 쓸데없는 테이블 접근을 발생시키며 SQL의 성능을 나쁘게 만듦

 

2. WHERE 구에서 조건 분기

   "조건 분기를 WHERE 구로 하는 사람들은 초보자다. 잘 하는 사람은 SELECT 구만으로 조건 분기를 한다."

 

3. SELECT 구문에서 CASE 식을 사용한 조건분기

SELECT item_name, year,
		CASE WHEN year <= 2001 THEN price_tax_ex
        CASE WHEN year >= 2002 THEN price_tax_in END AS price
   FROM Items;

-> Items 테이블에 대한 접근이 1회로 줄어듦 

 

'구문'에서 '식'으로 사고를 변경하기

 

 

9강 집계와 조건 분기

1。 집계 대상으로 조건 분기

   - UNOIN을 사용한 방법

SELECT prefecture, SUM(pop_men) AS pop_men, SUM(pop_men) AS pop_wom
   FROM (SELECT prefecture, pop AS pop_men. null AS pop_wom
             FROM Population
            WHERE sex = '1'
            UNOIN
           SELECT prefecture, NULL AS pop_men, pop AS pop_wom
              FROM Population
            WHERE sex = '2') TMP
   GROUP BY prefecture;

WHERE 구에서 sex 로 분기, 결과를 UNOIN으로 머지

Population 테이블에 풀 스캔이 2회 수행됨

 

  - CASE 식을 사용한 방법

SELECT prefecture,
       SUM(CASE WHEN SEX = '1' THEN pop ELSE 0 END) AS pop_men,
       SUM(CASE WHEN SEX = '2' THEN pop ELSE 0 END) AS pop_wom
   FROM Population
  GROUP BY prefecture;

외관이 간단해질 뿐만 아니라 성능도 향상

Population 테이블로의 풀 스캔이 1회로 감소

 

10강 그래도 UNOIN이 필요한 경우

1. UNION 을 사용할 수밖에 없는 경우

    - 머지 대상이 되는 SELECT 구문들에서 사용되는 테이블이 다른 경우

SELECT col_1
   FROM Table_A
  WHERE col_2 = 'A'
UNOIN ALL
SELECT col_3
   FROM Table_B
  WHERE col_4 = 'B';

 

2. UNOIN을 사용하는 것이 성능적으로 더 좋은 경우

   -UNION을 사용했을 때 좋은 인덱스를 사용하지만, 이외의 경우에는 테이블 풀 스캔이 발생하는 경우

    인덱스 설정

CREATE INDEX IDX_1 ON ThreeElements (date_1, flg_1);
CREATE INDEX IDX_2 ON ThreeElements (date_2, flg_2);
CREATE INDEX IDX_3 ON ThreeElements (date_3, flg_3);

 

11강 절차 지향형과 선언형

예외적인 몇 가지 상황을 제외하면 UNOIN을 사용하지 않는 것이 성능적으로도 좋고 가독성도 좋다는 것

 

1. 구문 기반과 식 기반

 

   대부분 처음 배우는 프로그래밍 언어가 절차 지향형 프로그래밍 언어이기 때문에 절차 지향에 익숙하지만, SQL의 기본     적인 체계는 '선언형' --> '구문' 이 아니라 '식'

 

   절차 지향형 언어가 CASE 구문으로 분기하는 것을, SQL은 CASE식으로 분기

   SQL 구문의 각 부분(SELECT, FROM, WHERE, GROUP BY, HAVING, ORDER BY)에 작성하는 것은 모두 식

 

2. 선언형의 세계로 도약

 

   절차 지향형 세계에서 선언형 세계로 도약하는 것이 곧 SQL 능력 향상의 핵심

'SQL' 카테고리의 다른 글

SQL 5장 - 반복문  (1) 2023.10.08
SQL 레벨업 4장 - 집약과 자르기  (1) 2023.09.30
SQL 레벨업 - 2장 SQL 기초  (1) 2023.09.16
SQL 레벨업 - 1장 DBMS 아키텍쳐  (2) 2023.09.07
SQL - SQL 최적화 기본 원리  (0) 2023.09.02
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함