DB마다 구현이 많이 많이 달라서 튜닝 방법도 많이 많이 다르다
1. 튜닝은 인덱스/쿼리 튜닝이다.
2. Cost-Based Optimizer(CBO)
쿼리 튜닝은 CBO가 알아서 해준다.
RDB에서 가장 중요한 기능임.
우리가 할 일은 CBO가 뻘짓할 때, 가이드하는 것 뿐
쿼리 좆같이 짜면 CBO가 뻘짓하니까 이상한 짓 하려고 하지마셈 ㅇㅅㅇㅋㅋㅋ
3. 쿼리는 OLTP / OLAP 2종으로 나눈다
OLTP는 단문 쿼리. Index Seek. 주로 서비스 로직. 길어야 몇 페이지
OLAP는 장문 쿼리. Scan. 주로 통계 로직. 길면 만줄 가볍게 넘음
RDB 엔진은 이걸 철저히 구분해서 다른 알고리즘을 쓰므로
이걸 구분해서 올바른 알고리즘을 쓰는지 봐야 한다
OLAP 쿼리 튜닝은 땔감이 할 수 있는게 아니니 DBA에 패스하셈
사실 대부분 OLAP 쿼리 만질 일도 없을거고 앵간한 DBA도 튜닝 제대로 못 할거임 ㅇㅅㅇㅋㅋㅋ
4. 조건절에서 불필요한 짓 절대 하지 마라
조건절에 변수만 써도 인덱스를 못 쓰는 경우가 생긴다.
SARG(search arguments) 공부해보셈
RDB는 민감한 놈이라 조금만 수틀리면 성능이 훅훅 떨어짐
진짜 어처구니 없는 조건으로 SARG가 안 되서 성능 떨어짐 ㅇㅅㅇㅋㅋㅋ
5. 인덱스
인덱스의 중요성은 아무리 강조해도 지나치지 않긴 한데 귀찮아서 짧게 하겠음
랜덤 엑세스 하는 곳에는 nonclustered index
스캔 하는 곳에는 clustered index를 거는게 좋고
인덱스도 일종의 테이블이며
검색하는 컬럼이 다 인덱스에 포함된 경우, covering index라고 부르는데 이 경우 존나게 빨라짐
6. 나머지는 내용이 길어지기도 하고 특정 DBMS 벤더 특화 내용이라 생략함
7. 마지막으로... 쿼리 튜닝이란 뭔가?
연산에 참여하는 행열의 크기를 최소화. 물리적으로 적게 읽는게 빠른 것
너무 당연한 이야기지만 비지니스 로직에서 이게 잘 되는 경우는 드물다
그러니까 쿼리 튜닝 전문으로 먹고 사는 사람들이 있겠지 ㅇㅅㅇㅋㅋㅋ
당연하지만 인덱스만 잘 걸면 반은 먹고 들어간다
좆간은 옵티마이저가 잘못 돌지 않게 거들 뿐이어서 프로그램 최적화랑 방향이 좀 많이 다름
프로시저에 코딩하려고 하지마라
프로시저는 실행할 때, 컴파일해서 재활용하는데
로직 복잡하면 실행할 때마다 컴파일해서 더 느려지기도 하고 그럼
이런 복잡한 것들이 DBMS 벤더마다 다 다르고
내부가 어떻게 구현되었는지는 비공개이기 때문에 경험과 추측에 의존해야하는 사이비 분야이다 ㅇㅅㅇㅋㅋㅋ
나는 왜 커버링 인덱스 안되냐 - dc App
억울해 - dc App
몰?루 ㅇㅅㅇㅋㅋㅋ
mssql 기반이었어서 다른데랑 다를 수 있음
DB는 좀 깊게 들어가면 너무 어려워.. 레코드마다 내부에 어떻게 저장되는지랑.. 경우에 따라선 Index타는거보다 그냥 Full로 읽는게 빠르다던데 어떤 경우가 그런지도 잘 모르겠고 실행계획은 인덱스 나오는데 실제 실행에선 인덱스 안타길래 확인해보니 뭐더라 분석결관가 그거 실행 멈춰놔서 인덱스 안타고..
ㄹㅇ...
상위 1퍼 데이터베이스 핫산
플머인데 강의 들을 기회가 있어서 수박 겉핥기로만 본거임 ㅇㅅㅇㅋㅋㅋ
클러스터링 팩터가 좋을수록 인덱스 효율이 올라간다 하지만 선택도 특정 지점부터는 테이블 풀스캔이 인덱스 스캔보다 효율이 더 좋다 적은양의 데이터를 결과집합에 뽑아낼때는 인덱스가 99.9%로 좋으나 많은양의 데이터를 뽑을때는 테이블 풀스캔도 고려해야한다
인덱스는 index range scan(seek)을 위주로 짜는게 효율적인 방법이다 = 조건으로 unique scan을 하면 가장 베스트겠다
인덱스 컬럼을 가공하면 인덱스를 타지 않는다 부정연산을 해도 인덱스를 타지 않는다 고로 인덱스 컬럼을 가공하지말고 인덱스 반대편 값을 가공해서 인덱스에 맞추는 것이 좋다
인덱스를 걸면 속도가 빨라진다고 무작정 인덱스를 걸면 오히려 테이블의 insert delete update 작업이 느려지니 과한 인덱스 생성보다 계획적이고 효율적인 방법으로 설계해야한다
옵티마이저는 묵시적 형변환을 한다 그러므로 문자형 = 숫자형 같이 서로 데이터타입이 맞지 않는 경우 내부 규칙에따라 우선순위가 높은 데이터타입으로 형변환한다. 그러므로 인덱스 컬럼이 묵시적형변환되어 컬럼이 가공되면 인덱스를 타지 않을 수도 있으니 가능하면 데이터타입을 맞춰주는게 좋다
쓰다가 귀찮으니 여기까지만 하겠다
알짜 노하우 감사합니다 굽신굽신. 외울게요 ㅇㅅㅇㅋㅋㅋ
해당 댓글은 삭제되었습니다.
대충만 알고 수틀리면 dba한테 던지면 됨 ㅇㅅㅇㅋㅋㅋ
cs에서 db가 젤 어려운듯