쿼리를 최적화하는 가장 쉬운 방법으로 필요한 칼럼만 조회하는 것입니다. 아스타리스크(*)를 사용하여 필요하지 않은 칼럼을 조회해야 하는 경우 불필요하게 리소스를 소모합니다.
가능하면 와일드카드를 끝에 작성하는 것이 좋습니다.
-- 비추천
SELECT *
FROM TABLE
WHERE COL LIKE '%ABC%'
-- 추천
SELECT *
FROM TABLE
WHERE COL LIKE 'ABC%'
LIKE 검색시 와일드카드가 시작 부분에 있는 경우 인덱스를 활용하지 않습니다. 따라서 데이터베이스는 모든 레코드를 검색하므로 검색 속도가 느릴 수밖에 없습니다.
UNION과 DISTINCT를 같이 사용하지 마십시오. UNION에는 중복 값을 제거하는 기능이 존재하므로 DISTINCT와 함께 사용할 필요가 없습니다.
Distinct와 Group By를 함꼐 사용하지 마십시오. Group By절에 입력된 칼럼을 그룹화하므로 DISTINCT와 사용할 필요가 없습니다.
RDBMS마다 다르지만 서브 쿼리(Sub Query)에서 Order By를 사용하는 경우 많은 비용이 발생합니다. 그러므로 서브 쿼리에서 Order By를 사용하지 않도록 합니다.
WHERE문에서 서브 쿼리의 값을 확인하려는 경우 IN 또는 EXISTS를 사용할 수 있습니다. IN과 EXISTS는 검색 결과에 따라 어느 것을 사용할지 결정해야 합니다. 서브 쿼리의 결과가 많으면 EXISTS가 나은 성능을 제공하며 그렇지 않으면 IN을 사용하는 것이 좋습니다.
EXISTS는 일치하는 항목이 발견되는 즉시 검색 프로세스를 종료하지만 IN은 모든 항목을 비교하기 때문입니다.
SELECT *
FROM TABLE
WHERE CONCAT(COL1, ' ') = 'ABC'
COL1이라는 컬럼이 인덱스로 잡혀있는데 WHERE문에서 함수와 함께 사용되면 인덱스가 깨지므로 검색 속도가 느려집니다. 인덱스로 잡혀있는 칼럼은 WHERE문 또는 JOIN에서 함수와 사용하는 것을 피해야 합니다.
암시적 변환은 데이터베이스에서 값을 비교할 때, 데이터 타입이 다른 경우 데이터베이스에서 자동으로 타입을 변환 후 값을 비교하는 방식입니다.
암시적 변환을 수행하는데 불필요한 리소스가 소모되므로 동일한 타입으로 값을 비교하는 것이 좋습니다