본문 바로가기

전체 글8

[MSSQL] 쿼리스토어 query store는 sql server 데이터베이스 엔진의 기능 중 하나로, 쿼리 실행 성능을 모니터링하고 최적화하는 도구로 데이터베이스 내에서 실행되는 쿼리의 실행 계획과 성능 통계 정보를 추적하고 저장(2016 이상부터 지원) 장점 : 실행계획 이슈를 빠르게 파악 및 여러 계획 비교 가능 비동기 저장으로 사용자 작업에 영향 없음 강제 계획 적용 등의 기능이 있어 문제가 발생한 쿼리에 대해 빠르게 대응 가능(but 강제 계획이 오래 유지 되지 않으니 문제의 쿼리는 별도의 개선을 통해 실행 계획 고정 필요) 단점 : 별도의 저장 공간 필요 일부 performance overhead 발생(미미함) DML에 대해서만 활용 가능 보고서 종류 1) 회귀된 쿼리 : 최근 실행 계획 변경, 성능 좋지 않은 쿼리.. 2023. 8. 28.
[MSSQL] SQL 구성 관리자 바로가기가 없는 경우 업무상 SQL Server Configuration Manager를 통해 SQL Native Client 목록 수정을 하는 경우가 잦다. 회사에서 ETL을 위해 SSIS 패키지를 주로 사용하기 때문에 서버가 추가되거나 IP 등이 변경될 때에는 SQL 구성 관리자에서 편집을 해줘야 한다. 그런데 간혹 SQL 구성 관리자가 시작 -> 바로가기에서 뜨지 않는 경우가 있다. 당황하지 말고 windows키 + R키를 누르면 아래와 같은 창이 뜬다. 입력 부분에 아래와 같이 입력하고 확인을 누르면 SQL 구성 관리자가 뜬다. sqlservermanager 뒤의 숫자는 본인 SQL Server 버전이 해당하는 숫자를 입력하면 된다. (찾아보니 2017인 경우는 14라고 해서 아래와 같이 작성함) 2022. 12. 22.
[MSSQL] 물리적 조인(Nested Loop, Merge, Hash) 물리적 Join 작업 1) Nested Loop join 루프를 돌며 두 테이블의 로우를 연결하는 방식 랜덤액세스 방식 선행 테이블을 풀스캔 하므로 선행테이블의 크기가 작을수록 유리 후행 테이블에 반드시 인덱스가 있어야 함 선행 테이블 첫번째 행 접근 해당 행 조인 속성을 가지고 후행 테이블 인덱스를 거쳐 접근 위 작업 반복 후 버퍼에 저장 후 마지막에 출력 2) Merge join 참조할 인덱스가 없는 테이블도 사용 가능 (인덱스가 없어도 조인 가능) 선행 테이블의 조인 조건을 만족하는 행을 찾아 정렬 후행 테이블의 조인 조건을 만족하는 행을 찾아 정렬 정렬된 두 결과를 비교하며 조인 수행 후 성공하면 버퍼에 저장 후 마지막에 출력 동등 조인 (=) 이 아닌 경우 NL 보다 유리 두 테이블의 사이즈가 .. 2022. 12. 20.
[MSSQL] 복구 모델(simple/full/bulk logged) sql server는 세 가지 복구 모델이 있다. -simple 트랜잭션을 보관하지 않아 트랜잭션 로그 백업 지원X 최소한의 로그 정보만 유지 특정 시점 복원은 불가능하고 전체 복원만 가능 마지막 백업 이후의 변경 사항은 보호되지 않음 로그 공간을 자동으로 회수, 트랜잭션 로그 공간 관리X -full 백업할 때까지 로그를 보존 전체, 차등, 특정 시점 복원 모두 가능 데이터 유실이 없음 다만 그만큼 로그 파일 크기가 커지기 때문에 대량 데이터 작업이 있는 경우에는 맞지 않음 -bulk logged 모든 트랜잭션 로그 보유 Bulk INSERT 등과 같은 대량 데이터 작업이 있는 경우 사용 최소 로깅을 진행하여 full 모드 보다 빠른 성능 --현재 DB의 복구 모델 확인 쿼리 SELECT name, re.. 2022. 12. 16.
[MSSQL] 정규화 정규화란? 테이블이 더 이상 분리할 수 없는 상태로 나누어 가는 것 1. 제1정규형 - 원자값이 아닌 도메인을 분해 - primary key가 존재하고, primary key를 통해 각 집합을 고유하게 식별해야 한다. - 각 컬럼이 하나의 속성만을 가져야 한다. - 하나의 컬럼은 같은 종류나 타입의 값을 가져야 한다. - 각 컬럼이 유일한 이름을 가져야 한다. 2. 제2정규형 - 부분 함수 종속성 제거 - primary key가 아닌 컬럼들은 primary key에 의존적이어야 한다. (primary key가 복합 key일 경우 key의 일부분에 key가 아닌 컬럼들이 의존적이면 안 된다. 복합 key에 해당하는 컬럼에 모두 의존적이어야 한다.) 예를 들어 이벤트 번호+응모 회원 번호로 pk가 있는 경우.. 2022. 12. 13.
[MSSQL] identity 현재 값 가져오기 seq, order 넘버 등 identity가 걸려 있는 컬럼이 어디까지 자동 증가가 되어 있는지 확인해야 할 때 사용한다. 가끔 max(seq), count(*) 등으로 조회하여 identity가 어디까지 진행됐는지 확인하는 분들을 봤는데 최대한 사용하지 않았으면 한다. 테이블에 물리적인 delete가 절대로 일어나지 않는다면 위와 같이 진행해도 괜찮을지 모르겠으나 물리적인 delete가 발생할 여지가 조금이라도 있다면 아래의 쿼리로 조회해야 한다. select IDENT_CURRENT('') '' 사이에 테이블 명을 넣어주면 된다. 2022. 12. 9.
[MSSQL] 쿼리스토어 활용 쿼리(호출 시간, 플랜 등 확인) 요즘 SP를 가급적 사용하지 않는 추세이긴 하지만 우리 회사는 대부분의 쿼리들을 SP로 호출하는 중으로 SP에 대한 모니터링 요소가 많다. 그중 하나로 SP 최초 실행, 마지막 컴파일, 마지막 실행 등을 확인할 필요가 있어서 아래의 쿼리로 확인을 한다. select qsq.query_id ,qsp.plan_id ,qsq.object_id ,qst.query_sql_text ,convertedplan = try_convert(XML,qsp.query_plan) ,qsq.last_compile_memory_kb ,qsp.initial_compile_start_time ,qsp.last_compile_start_time ,qsp.last_execution_time from sys.query_store_quer.. 2022. 12. 5.
[MSSQL] 인덱스 사용률(index usage)을 활용한 인덱스 정리 주로 아래의 경우 인덱스 사용률을 확인하여 인덱스 정리를 진행하고 있다. -대용량 데이터 테이블로 생성된 지 오래된 테이블 (과거의 사용 용도와 달라졌을 경우가 있고, 이전에 사용되던 조건들이 현재에는 쓰이지 않을 경우가 많아 인덱스 정리가 필요) -선두 컬럼이 같은 넌클러스터 인덱스가 여러 개 존재하거나 비슷한 컬럼 구성으로 넌클러스터 인덱스가 여러 개 존재하는 테이블 (생성 당시에는 사용할 것으로 판단하여 생성했지만 인덱스 힌트를 강제로 주지 않는 이상 옵티마이저가 선택하지 않아 사용되지 않는 인덱스들이 있음) select i.type_desc as index_type , i.name as index_nm , iu.user_seeks as seek_cnt , iu.user_scans as scan_c.. 2022. 12. 5.