created at 2023-06-26
์ ๋ JPA, Data-JPA, JPQL๋ฅผ ์ฌ์ฉํด์ ์ฑํ ํ๋ก์ ํธ์์ ์ฌ์ฉํฉ๋๋ค. ํ์ง๋ง ์ฑ๋ฅ์ด ์๊ฐ๋ณด๋ค ๋ฎ์์ต๋๋ค.
๋ฐ๋ผ์ NativeQuery(=SQL query)๋ฅผ ์ฌ์ฉํ์ฌ ์ข ๋ ์ต์ ํ์ํค๋ ค ํฉ๋๋ค. ๊ทธ๋ฌ๊ธฐ ์ํด์ ๋ค์ํ ์ต์ ํ ๋ฐฉ์๋ค์ ์ ๋ฆฌํด๋ณด๋ ค๊ณ ํ๋๋ฐ์. ์๋์ ๊ฐ์ด 7๊ฐ์ง ์ฟผ๋ฆฌ ์ต์ ํ ๋ฐฉ์๋ค์ ์ ๋ฆฌํ์์ต๋๋ค.
์ฟผ๋ฆฌ ์ต์ ํ ๋ฐฉ๋ฒ๋ค
- https://blog.devart.com/how-to-optimize-sql-query.html#Non-used-indexes
- https://developer-talk.tistory.com/420
- Query Optimization Techniques - Tips For Writing Efficient And Faster SQL Queries
๋ณธ ๊ธ์ ์์ ๊ธ์ ๋ฒ์ญํ๊ณ ์ ๋ฆฌ ๋ฐ ์ถ๊ฐํ ๊ธ์ ๋๋ค.
- SELECT * ์์
- ์ด์ : ํ์์๋ ์นผ๋ผ๊น์ง ์กฐํํ๋ค๋ฉด ๋คํธ์ํฌํจํท์ ํฌ๊ธฐ๊ฐ ์ฆ๊ฐํ๋ฉฐ, ๋ถํ์ํ๊ฒ ๋ฆฌ์์ค๋ฅผ ์๋ชจํ๊ฒ ๋ฉ๋๋ค.
๊ฐ๋จํ ๋ฐฉ๋ฒ์ด๋ฉฐ, ์ฑ๋ฅ์ ์ฝ 120% ํฅ์์ํฌ ์ ์์ต๋๋ค.
LIKE ๊ฒ์์ ์์ผ๋์นด๋(%)๋ ์ฌ์ฉํ์ง ์๊ฑฐ๋, ์ฌ์ฉํ๋๋ผ๋ ๋์ ์์ฑ
SELECT name FROM sys.databases WHERE name LIKE 'm_d%';
- ์ด์ :
%
๋ฅผ ์์ ๋๊ฒ๋๋ค๋ฉด, ์ฌ์ค์ ๋ชจ๋ row๋ฅผ ๋๊น์ง ์ฝ์ด์ผ ํฉ๋๋ค. ๋ฐ๋ผ์ ๋ถํ์ํ๊ฒ ๋ฆฌ์์ค๋ฅผ ์๋ชจํ๊ฒ ๋ฉ๋๋ค.
- ์ด์ :
- ORDER BY ์ฌ์ฉ ์์
- ์ด์ : ๋๋ถ๋ถ์ RDB๋ค์ ์ ๋ ฌํ๋๋ฐ ๋ง์ ๋ฆฌ์์ค๋ฅผ ์๋ชจํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
- 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;
- SELECT DISTINCT * ๋ก ๊ฒ์ํ์ง ์๊ธฐ
- ์ด์ :
DISTINCT
๋ ์ฃผ๋ก ์ค๋ณต์ ๋ฐฉ์งํ๊ธฐ ์ํด์ ์ฌ์ฉํฉ๋๋ค. ๋ง์ฝDISTINCT *
๋ก ๋ชจ๋ row์ ์ค๋ณต์ฒดํฌ๋ฅผ ์คํํ๊ฒ ๋๋ค๋ฉด, ๋ฆฌ์์ค ์๋ชจ๊ฐ ์๋นํ ์ปค์ง๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ฐ๋ฆฌ๋ ํ ์ด๋ธ์ UNIQUE, PK ์ ๊ฐ์ ์ ์ฝ์กฐ๊ฑด์ ๋ถ์ฌ ๋์ต๋๋ค. ์ฆ ์ผ๋ฐ์ ์ผ๋ก๋ ์ ๋ํฌํ ์ ์ฝ๋์ ์ค๋ณต๋๋ ๊ฐ์ด ์๋ค๋ ์๋ฆฌ๊ฑฐ๋ ์. ๋ฐ๋ผ์ ๋ถํ์ํ๊ฒDISTINCT *
๋ฅผ ์คํํํ๊ธฐ ๋ณด๋ค,DISTINCT {Column}
์ผ๋ก ์ค์ง์ ์ธ ์นผ๋ผ๋ช ์ ์ ๋ ๊ฒ์ด ์ฑ๋ฅ์์์ ์ด์ ์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
๋ง์ฝ ๋ ๋ค์ ๋ถํ์ํ DISTINCT๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ค๋ฉด ์๋์ ๊ฐ์ด 600% ์ฑ๋ฅ๊ฐ์๊ฐ ๋ฐ์ํฉ๋๋ค.
- 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โ;
- ์ด์ :
- ์ค๋ณต๊ฒ์ฌ๊ฐ ํ์ํ์ง ์๋ ๊ฒฝ์ฐ์๋ UNION ๋์ UNION ALL ์ฌ์ฉ
- ์ด์ : ์ค๋ณต๊ฒ์ฌ๊ฐ ํ์์๋ ๊ฒฝ์ฐ์๋ UNION ALL์ ์ฌ์ฉํจ์ผ๋ก์ ์๋์ ๊ฐ์ด 500%์ ์ฑ๋ฅํฅ์์ด ๊ฐ๋ฅํฉ๋๋ค.
- 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