기본 콘텐츠로 건너뛰기

라벨이 튜닝인 게시물 표시

Lock정보가 없지만 대기타고 있는 쿼리를 찾아라! SQL Server

영상버전 :  https://youtu.be/4ssE81DwGr4 얼마전에 며칠을 고생해서 원인 쿼리를 찾은 이야기 입니다.  보통 쿼리는 Lock에 걸려서 대기 상태에 있다면 쉽게 찾는데요..  Lock에 걸리지 않은 상태로 대기를 타는 경우가 있습니다.  Sql server 에서 일단 쉽게 찾는 방법은 Sp_who2 를 실행하는 것이죠.  그냥 SSMS에서 서버에 접속해서 새 쿼리창을 열고  Sp_who2 라고 입력하고  실행해버리면 현재 물려있는 모든 세션의 정보가 나타납니다.  여기서 Blkby 라는 필드에서 숫자가 보이면 그 숫자의 SPID가 원인으로  숫자가 쓰여진 곳의 SPID가 멈춰 있다는 이야기 입니다.  이렇게 원인 세션을 찾고 그 세션이 어떤 쿼리를 던지고 있는지를 찾아서  Kill을 할지, 다른 어떤 액션을 취할지를 택하면 됩니다.  Kill을 하고 싶으면 Kill 999 처럼 SPID를 kill 뒤에 적어주면 되구요..  Blkby에 적힌 숫자를 입력하면 원인 쿼리가 강제 종료 되는데요,  이게 INSERT나 UPDATE의 경우가 많아서  데이터 유실이 될 가능성이 높기 때문에  저 같은 경우는 원인 쿼리의 문제를 해결할 방법만 알려주고  자연히 사라질 때 까지 기다리기는 합니다.  그래도 급히 대응이 필요하거나  아무리 기다려도 사라지지 않는 경우에는  Kill밖에 없겠죠.  지난 번에는 개발팀에서  Begin tran을 던지고 쿼리를 던진 뒤에 Commit이나 rollback을 하지 않아서  Blkby가 보여서 문의했더니  자신들의 실수임을 확인해서 쉽게 끝났지만, 이번에는 Blkby가 뜨지 않은채로  많은 세션들이 SUSPEND가 되어버렸죠.  보통 커넥션 풀을 사용한다 하더라도  SUSPEND가...

chatgpt로 DB튜닝 전문가 되기!

영상버전 :  https://youtu.be/3bhK0B96zIQ 이젠 chatgpt를 사용하면 저와 같은 레벨의 db튜닝을 하실 수 있습니다.  단! 아래와 같은 접근을 잘 연습하신다면 말이죠.. 1. 인덱스 점검 먼저 ChatGPT에게 “이 테이블에 어떤 인덱스가 이미 있고, 어떤 게 부족해 보이는지”를 물어봤습니다. 그러자 놀랍게도, 각 테이블에 필요한 인덱스 목록과 개선 방향을 꽤 체계적으로 제시해주더군요. 2. 복합 인덱스 인덱스를 최소화하면서도 효율을 높이려면 복합 인덱스가 답일 때가 많습니다. 그래서 ChatGPT에게 “그럼 복합 인덱스를 구성한다면 어떤 필드 조합이 좋을까?”라고 물어봤죠. 예: return_date + shop_id, order_id + return_flag 등등 필드 순서를 어떻게 두느냐에 따라 성능이 확 달라진다는 이야기 Include 옵션을 활용하면 인덱스만으로 데이터를 조회할 수 있어 훨씬 빠르다는 조언 이런 내용이 나오는데, 솔직히 저도 모르는 건 아니었지만 다른 시각에서 정리된 결과를 보니 훨씬 명쾌했습니다. 3. ‘카디너리티’ 인덱스 튜닝하면 꼭 등장하는 단어가 **카디너리티(Cardinality)**입니다. 쉽게 말해, 특정 필드가 갖는 값의 다양성 정도죠. 예를 들어, shop_id가 수천 개라면 카디너리티가 높고, dtenpocd처럼 점포코드가 57개밖에 안 된다면 카디너리티가 낮습니다. ChatGPT가 강조하더군요. “카디너리티가 높은 필드는 인덱스의 앞쪽에 두어야 효율을 극대화할 수 있어요.” 반면 카디너리티가 낮은 필드는 필요하면 Include에 넣거나 뒤로 빼서 쿼리 범위를 좁히는 식으로 사용하라고 했습니다. 4. 인덱스 필드 순서 실제로 저도 “기간 검색을 먼저 하고, 그 다음에 shop_id로 필터링하는 게 낫지 않을까?”라는 의문이 있었어요. 그런데 ChatGPT는 “shop_id로 먼저 필터링하고 기간 검색을 거는 게 더 나을 수도 있다”라고 하더군요. 그 이유는 shop의 개수가...

DB튜닝 전문가 망했습니다..ㅠㅡㅠ

영상버전 :  https://youtu.be/iTmkJ2iWJuU 지금 프로젝트에서 개발자들이 프로시저를 만들다보니  개발자의 의식의 흐름대로 데이터 처리를 만들다보니 커서를 이용해서 테이블 변수에 넣고  그걸.  변수로 다른 테이블에서 조회하는 식으로 짜놨네요..  튜닝할 때 항상 하는 이야기 이죠.. Trigger와 커서는 절대 쓰지 말라구요..  이것처럼 속도를 저하시키고 락을 유발 시키는 장치는 없거든요..   트리거는 트리거링 포인트가 되었을 때 대상 테이블을 락을 건 뒤에 트리거 처리를 하고 나서 락을 해제 하기 때문에 아무리 빨리 끝나도 동시에 들어오는 쿼리에 따라서는 데드락에 빠질 가능성도 있습니다.   마찬가지로 커서 역시 테이블을 열고 커서를 만들어 처리하기 때문에 그 모든 처리가 끝날 때까지 락이 걸린 상태가 됩니다. 데이터가 변동하면 안되니까요..  그래서 트리거와 커서를 사용하면 기본 서너배는 느려집니다.  커서랑 트리거만 없어도 50만명 받을 서비스가 15만명도 못받게 되는거죠.. 경우에 따라서는 수백배 느리게 짤 수도 있는게 커서와 트리거 입니다. 그냥 서비스를 떨구든 말든 자기 편한대로 만들겠다는 생각이 있지 않는한 커서는 피하셔야 합니다.   개발자들이 커서를 많이 이용하는 이유는 커서를 이용해서 만들면 복잡한 처리를 할 때 별로 생각하지 않고 개발 코드처럼 만들어도 가능하기 때문이죠  이번 쿼리도 커서를 사용해서 아주 길게 만들어놨네요..   한 줄 읽어서 상태에 따라서 데이터를 매핑해서 테이블 변수에 넣고를 쭈욱 한 뒤에  그 테이블 변수를 다시 읽어서 다른 테이블의 값을 가져오는데..   튜닝을 잘하려면 이 모든 데이터가 머리속에 연결구조를 그려서   하나의 비정규화 된 배열을 만들 수 있어야 합니다.   매번 이야...

감정인식AI의 인프라 제안 - 일본IT컨설턴트의 프로젝트 2회차

영상버전 :  https://youtu.be/mVwIZ1nof8w 지난 번에 고객의 현재 상황 및 요건을 들었습니다.  원래라면 분석에 2주를 잡긴 하지만, 이번은 아주 간단해서 바로 1차 제안을 세 종류 만들어 봤습니다.  현재 개발사가 제안한 scaling에 대한 문제를 제기해야 겠지요..  우선 원래 시스템 중 문제가 있는 서버의 프로세스 구성입니다.  하나의 VM에 Listener, Real time analyzer, Final Analyzer의 세 개가 돌고 모든 IP PBX의 스트리밍 데이터를 받아서 하나의 VM이 처리를 하고 있는 식이죠.  이걸 분산하려고 하고 있습니다. 우선 개발사가 생각한 1안입니다.  하나의 인스턴스에 Thread를 나누어 처리를 하려고 합니다. 하지만 같은 인스턴스다보니 CPU가 터지는 지금 상황에서는 Thread를 분리해봤자 분리된 Thread가 터져서 인스턴스가 뻗을 것 같네요.  개발사가 제안한 2안 입니다.  이건 두 개의 인스턴스로 나누어 왼쪽에 IP PBX에서 데이터를 받아 리얼타임으로 저장하고 CPU부하가 큰 Final analysis는 다른 인스턴스에서 땡겨서 처리하겠다는 발상인데요.. 아마 이번에 테스트한 50세션 동시 처리에는 먹힐 지도 모르겠습니다. 30정도에서 터졌으니까요..  하지만 이건 일시방편이지, 유저를 계속 늘려가는 서비스 입장에서는 오히려 왼쪽 입구에서 받는 트래픽에 그걸 모아서 오른쪽의 VM 복수개에 동시에 파일을 내보내면 트래픽 병목으로 전송 실패가 나겠죠.  아마 700세션 전후에서 터질 것입니다.  그래서 제가 이 내용을 기준으로 일반적인 제안을 했습니다.  1안입니다.  전형적인 Application Gateway에 VMSS설정으로 Application gateway가 알아서 분산하고 VMSS가 알아서 부하도에 따라 증가 시키는 방식이죠.  장점은 Ap...