varchar_patteren_ops는 잘모르겠는데
그냥 각 컬럼 별로 단일 인덱스 추가했다고 가정하자.
여긴 OK
Lower(term.name) 이렇게 칼럼에 함수를 쓰면 당연히 풀스캔함
함수형 인덱스를 만드는 곳은 응급처방에 불과하고
정책 자체를 자동완성 term 테이블에는 항상 소문자로 변환해서 저장되게 해야함
테이블 설계가 잘못됐으니 lower 인덱스 이런걸 쓰는거
이건 내용이 완전히 틀림
exist로 바꾸면 옵티마이저가 내부적으로 semi join으로 다시 바꿔준다 헛고생하는거
INNER JOIN은 모든 행의 매칭 조합을 모두 계산해야 합니다. 반면에 EXISTS는 데이터 존재 여부만 확인하기에 확인만 되면 바로 스캔이 끝나기에 더 유리합니다.
>>> 조인 동작을 잘못 이해하고 있음 선행테이블에서 좁힌 후 하지, 모든 조합 계산 안함
like로 접두사로 하면 충분히 좁혀질텐데 굳이 반정규화도 안할듯
커버링 인덱스는 자제합시다.
저기서 pg는 OR이 인덱스 잘탈지 모르겠는데 해봐야 알음
결론적으로 튜닝을 한다면
1. 정책 자체를 자동완성 키워드는 항상 소문자로 변환 후 저장 후
검색어 like abc%로 타게 / 쿼리 파라미터도 소문자로 넣어줘
2. join은 냅둬라
3. or은 인덱스 안타면 union으로 함
4. 반정규화도 굳이 안해도 됨 저기선 오버엔지니어링임
이정도만 해도 저렇게 인덱스 덕지덕지 안붙여도
충분히 빠름
반정규화 칼럼 업데이트도 필요없어
JPQL은 모르겠고
native query로 쓰면
얼추 아래처럼 짜면 됨
union 각각 안에서 like 인덱스 타면서
결과 뽑고 -> 거기에 대해서 조인 매칭
-> 좁혀진 집합에서 union 처리
->집계 및 정렬 처리 필요시 limit 도
SELECT term, SUM(score) AS total
FROM (
SELECT t.term, a.score
FROM term t
JOIN article a ON ...
WHERE t.col1 LIKE 'b%'
UNION
SELECT t.term, a.score
FROM term t
JOIN article a ON ...
WHERE t.col2 LIKE 'b%'
UNION
SELECT t.term, a.score
FROM term t
JOIN article a ON ...
WHERE t.col3 LIKE 'b%'
) s
GROUP BY term
ORDER BY SUM(score) DESC;
전체적으로 흐름은 괜찮아보였는데... 역시 깊게 알아야 제대로 튜닝하는구나 - dc App
결국 거창하게 썼지만 그냥 함수형인덱스 추가해서 해결했다 한줄이 끝임.. dba한테 가져가면 욕먹는 방법 - dc App
와 뭐임 저거 글
내용이 좋은 글은 아님 - dc App
커버링인덱스는 왜 자제해야함??
(a,b,c) (a) (a,d) (a,e) 이렇게 계속 하나씩 쌓아가다보면 옵티마이저가 판단을 잘 못해서 쿼리 실행계획이 꼬임 인덱스 갱신해야해서 CUD도 느려지고 인덱스가 많아지면 버퍼풀 캐싱 효율도 떨어짐 - dc App
다른 조건이 추가되면 커버링인덱스가 안먹음 - dc App
글 읽으면서 커버링 자제 있길래 왜지 생각하고 실운영시 이런식으러 추가하다보면 갱신시에도 그렇고 인덱스 늘어나면서 효율떨어지니까 그런가 싶었는데 얼추 맞았네.. 이지 조금은 파딱 db 글이 이해되는것같아서 기분좋다.. - dc App
그것도 그렇고 나중에 요구사항이 늘어나서 sel.ect 나 wher.e에 뭔가 추가되면 커버링인덱스가 깨져버림 그럼 잘되던게 갑자기 느려지고.. - dc App
@딘퐁 그럼 처음 설계 때부터 커버링은 안쓰는편인가요? 후에 요구사항 변동 리스크 같은 것 때문에? - dc App
@ㅇㅇ(116.125) 넵 왠만하면요 - dc App