Skip to main content Link Menu Expand (external link) Document Search Copy Copied

created at 2023-06-26

์ €๋Š” JPA, Data-JPA, JPQL๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ฑ„ํŒ… ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์„ฑ๋Šฅ์ด ์ƒ๊ฐ๋ณด๋‹ค ๋‚ฎ์•˜์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ NativeQuery(=SQL query)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ข€ ๋” ์ตœ์ ํ™”์‹œํ‚ค๋ ค ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๊ธฐ ์œ„ํ•ด์„œ ๋‹ค์–‘ํ•œ ์ตœ์ ํ™” ๋ฐฉ์‹๋“ค์„ ์ •๋ฆฌํ•ด๋ณด๋ ค๊ณ  ํ•˜๋Š”๋ฐ์š”. ์•„๋ž˜์™€ ๊ฐ™์ด 7๊ฐ€์ง€ ์ฟผ๋ฆฌ ์ตœ์ ํ™” ๋ฐฉ์‹๋“ค์„ ์ •๋ฆฌํ•˜์˜€์Šต๋‹ˆ๋‹ค.

์ฟผ๋ฆฌ ์ตœ์ ํ™” ๋ฐฉ๋ฒ•๋“ค

๋ณธ ๊ธ€์€ ์œ„์˜ ๊ธ€์„ ๋ฒˆ์—ญํ•˜๊ณ  ์ •๋ฆฌ ๋ฐ ์ถ”๊ฐ€ํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค.

  1. SELECT * ์ž์ œ
    • ์ด์œ  : ํ•„์š”์—†๋Š” ์นผ๋Ÿผ๊นŒ์ง€ ์กฐํšŒํ•œ๋‹ค๋ฉด ๋„คํŠธ์›ŒํฌํŒจํ‚ท์˜ ํฌ๊ธฐ๊ฐ€ ์ฆ๊ฐ€ํ•˜๋ฉฐ, ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ฆฌ์†Œ์Šค๋ฅผ ์†Œ๋ชจํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

    ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์ด๋ฉฐ, ์„ฑ๋Šฅ์„ ์•ฝ 120% ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    img

  2. LIKE ๊ฒ€์ƒ‰์‹œ ์™€์ผ๋“œ์นด๋“œ(%)๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ฑฐ๋‚˜, ์‚ฌ์šฉํ•˜๋”๋ผ๋„ ๋์— ์ž‘์„ฑ

     SELECT name FROM sys.databases
     WHERE name LIKE 'm_d%';
    
    • ์ด์œ  : %๋ฅผ ์•ž์— ๋‘๊ฒŒ๋œ๋‹ค๋ฉด, ์‚ฌ์‹ค์ƒ ๋ชจ๋“  row๋ฅผ ๋๊นŒ์ง€ ์ฝ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ฆฌ์†Œ์Šค๋ฅผ ์†Œ๋ชจํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  3. ORDER BY ์‚ฌ์šฉ ์ž์ œ
    • ์ด์œ  : ๋Œ€๋ถ€๋ถ„์˜ RDB๋“ค์€ ์ •๋ ฌํ•˜๋Š”๋ฐ ๋งŽ์€ ๋ฆฌ์†Œ์Šค๋ฅผ ์†Œ๋ชจํ•˜๊ธฐ ๋–„๋ฌธ์ž…๋‹ˆ๋‹ค.
  4. OR ์‚ฌ์šฉ ์ž์ œ
    • ์ด์œ  : OR์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด Index๋ฅผ ํ™œ์šฉํ•œ ๊ฒ€์ƒ‰์„ ํ•˜์ง€ ๋ชปํ•˜๊ณ , Full-Scan์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

    ๊ทธ๋ ‡๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ฐ”๊พธ์–ด์•ผ ํ• ๊นŒ์š”?

    ์˜ˆ์ œ 1

    FROM

    SELECT
    *
    FROM USER
    WHERE Name = "a"
    OR Email LIKE "a@%";
    

    TO

    SELECT * FROM USER
    WHERE Name = "a"
    UNION
    SELECT * FROM USER
    WHERE Email LIKE "a@%";
    

    ์˜ˆ์ œ 2

    FROM

    SELECT * 
    FROM SH.costs c 
       INNER JOIN SH.products p 
           ON c.unit_price = p.prod_min_price OR c.unit_price = p.prod_list_price;
    

    TO

    SELECT * 
    FROM SH.costs c 
       INNER JOIN SH.products p 
           ON c.unit_price = p.prod_min_price 
    UNION
    SELECT * 
    FROM SH.costs c 
     INNER JOIN SH.products p 
         ON c.unit_price = p.prod_list_price;
    
  5. SELECT DISTINCT * ๋กœ ๊ฒ€์ƒ‰ํ•˜์ง€ ์•Š๊ธฐ
    • ์ด์œ  : DISTINCT๋Š” ์ฃผ๋กœ ์ค‘๋ณต์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ DISTINCT *๋กœ ๋ชจ๋“  row์˜ ์ค‘๋ณต์ฒดํฌ๋ฅผ ์‹คํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด, ๋ฆฌ์†Œ์Šค ์†Œ๋ชจ๊ฐ€ ์ƒ๋‹นํžˆ ์ปค์ง‘๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์šฐ๋ฆฌ๋Š” ํ…Œ์ด๋ธ”์— UNIQUE, PK ์™€ ๊ฐ™์€ ์ œ์•ฝ์กฐ๊ฑด์„ ๋ถ™์—ฌ ๋†“์Šต๋‹ˆ๋‹ค. ์ฆ‰ ์ผ๋ฐ˜์ ์œผ๋กœ๋Š” ์œ ๋‹ˆํฌํ•œ ์ œ์•ฝ๋•์— ์ค‘๋ณต๋˜๋Š” ๊ฐ’์ด ์—†๋‹ค๋Š” ์†Œ๋ฆฌ๊ฑฐ๋“ ์š”. ๋”ฐ๋ผ์„œ ๋ถˆํ•„์š”ํ•˜๊ฒŒ DISTINCT *๋ฅผ ์‹คํ–‰ํ–‰ํ•˜๊ธฐ ๋ณด๋‹ค, DISTINCT {Column}์œผ๋กœ ์‹ค์งˆ์ ์ธ ์นผ๋Ÿผ๋ช…์„ ์ ๋Š” ๊ฒƒ์ด ์„ฑ๋Šฅ์ƒ์—์„œ ์ด์ ์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ๋งŒ์•ฝ ๋˜ ๋‹ค์‹œ ๋ถˆํ•„์š”ํ•œ DISTINCT๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด 600% ์„ฑ๋Šฅ๊ฐ์†Œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

    img

    • Original: SELECT DISTINCT * FROM SH.Sales s INNER JOIN SH.Customer c ON s.cust_id = c.cust_id WHERE c.cust_marital_status = โ€˜singleโ€™;
    • Improved: SELECT * FROM SH.Sales s INNER JOIN SH.Customer c ON s.cust_id = c.cust_id WHERE c.cust_marital_status = โ€˜singleโ€™;
  6. ์ค‘๋ณต๊ฒ€์‚ฌ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋Š” UNION ๋Œ€์‹  UNION ALL ์‚ฌ์šฉ
    • ์ด์œ  : ์ค‘๋ณต๊ฒ€์‚ฌ๊ฐ€ ํ•„์š”์—†๋Š” ๊ฒฝ์šฐ์—๋Š” UNION ALL์„ ์‚ฌ์šฉํ•จ์œผ๋กœ์„œ ์•„๋ž˜์™€ ๊ฐ™์ด 500%์˜ ์„ฑ๋Šฅํ–ฅ์ƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

    img

  7. WHERE ๋Œ€์‹  INNER JOIN ์‚ฌ์šฉํ•˜๊ธฐ
    • ์ด์œ  : ์ด ๋ถ€๋ถ„์€ ์„ฑ๋Šฅ์ƒ์˜ ์ฐจ์ด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ SQL์˜ ๋ณดํŽธ์ ์ธ ๋ฌธ๋ฒ•์ธ ANSI Query์ด๋ƒ ์•„๋‹ˆ๋ƒ์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค(INNER JOIN์€ ANSI Query์ด๋ฉฐ, WHERE์€ Non-ANSI Query์ž…๋‹ˆ๋‹ค). ๊ทธ๋ƒฅ ์“ฐ๊ธฐ ํŽธํ•˜์‹  ๋ฌธ๋ฒ•์œผ๋กœ ์‚ฌ์šฉํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

    • ์•„๋ž˜์˜ ๋‘๊ฐ€์ง€ statement๋Š” ๋˜‘๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

    SELECT
    d.DepartmentID
    ,d.Name
    ,d.GroupName
    FROM HumanResources.Department d
    INNER JOIN HumanResources.EmployeeDepartmentHistory edh
    ON d.DepartmentID = edh.DepartmentID
    
    SELECT
    d.Name
    ,d.GroupName
    ,d.DepartmentID
    FROM HumanResources.Department d
    ,HumanResources.EmployeeDepartmentHistory edh
    WHERE d.DepartmentID = edh.DepartmentID