1. 데이터베이스 성능 분석 개요
1.1 성능 튜닝의 목적
- 성능 튜닝이란 데이터베이스 시스템이 효율적으로 동작하도록 개선하는 작업이다. 목표는 응답 속도 단축과 자원 사용 최적화에 있다.
- 응답 시간(Response Time) 최적화: 쿼리가 반환되는 시간을 줄인다.
- 처리량(Throughput) 증대: 단위 시간당 처리할 수 있는 트랜잭션을 증가시킨다.
- 자원 사용 최적화: CPU, 메모리, I/O 같은 시스템 자원을 효율적으로 사용하여 과부하를 방지한다.
1.2 데이터 처리 과정 이해
- SQL 문장 실행 절차
- SQL 파싱: SQL 문장을 구문 분석해 실행 계획을 수립한다.
- 최적화: 다양한 실행 계획 중 비용이 가장 낮은 계획을 선택한다.
- 실행: 선택된 실행 계획에 따라 데이터를 가져온다.
- 결과 반환: 최종 결과가 클라이언트에 반환된다.
이 단계에서 실행 계획과 비용 평가가 튜닝에 중요한 요소이며, 비용이 낮은 계획일수록 적은 자원을 사용해 데이터를 가져오므로 성능이 좋다.
2. 성능 튜닝 관련 용어 및 개념
2.1 성능에 영향을 미치는 주요 자원
- CPU: 계산 및 명령 처리 속도에 영향을 미치며, 복잡한 연산이나 다중 쿼리 실행 시 병목이 생길 수 있다.
- 메모리: 데이터나 인덱스가 메모리에 존재하면 디스크 읽기/쓰기가 줄어들어 성능이 높아진다. 메모리 할당이 부족할 경우 성능에 부정적인 영향을 미친다.
- I/O: 데이터 파일, 로그 파일을 읽고 쓰는 작업이다. 디스크 I/O 작업이 많을 경우 성능 저하의 주요 원인이 될 수 있다.
2.2 병목(Bottleneck) 분석
- 병목은 시스템 성능을 저하시킬 수 있는 특정 자원의 과부하 상태를 의미한다.
- CPU 과부하: 쿼리가 복잡하거나 비효율적일 때 CPU 사용량이 높아진다.
- 메모리 부족: 메모리 내 데이터 캐시가 부족해 데이터베이스가 디스크에서 자주 읽어와야 할 경우.
- 디스크 I/O 병목: 데이터나 로그 파일에 대한 잦은 접근으로 인해 디스크 I/O가 증가하면 성능이 저하된다.
튜닝 시 병목을 해소하려면 실행 계획을 통한 쿼리 최적화나 인덱스 최적화가 필요하다.
3. 실습
3.1 CPU 사용률 확인
SELECT sqltext.TEXT,
req.session_id,
req.status,
req.command,
req.cpu_time,
req.total_elapsed_time
FROM sys.dm_exec_requests req
CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS sqltext
ORDER BY req.cpu_time DESC;
현재 실행 중인 SQL 문장의 CPU 소모량과 실행 시간을 보여준다.
3.2 I/O 사용량 확인
SELECT DB_NAME(database_id) AS DatabaseName,
COUNT(*) * 8 / 1024 AS 'MBRead',
SUM(io_stall_read_ms) AS 'ReadStallMS',
COUNT(*) * 8 / 1024 AS 'MBWritten',
SUM(io_stall_write_ms) AS 'WriteStallMS'
FROM sys.dm_io_virtual_file_stats(null, null)
GROUP BY DB_NAME(database_id);
데이터베이스 파일 I/O 상태를 조회한다.
3.3 메모리 사용 확인
SELECT object_name,
counter_name,
cntr_value
FROM sys.dm_os_performance_counters
WHERE object_name LIKE '%Buffer Manager%'
AND counter_name IN ('Page life expectancy', 'Buffer cache hit ratio');
Page Life Expectancy와 Buffer Cache Hit Ratio는 메모리 효율성을 나타내는 지표이고, 일반적으로 Page Life Expectancy는 높을수록 좋다.
'코딩 공부 기록 > SQL' 카테고리의 다른 글
[MSSQL] 인덱스의 스캔 방식 (2) | 2024.11.22 |
---|---|
[MSSQL] 클러스터 인덱스(Clustered Index)와 비 클러스터 인덱스(Non Clustered Index) (0) | 2024.11.22 |
[MSSQL] 로컬 서버 사용하기 (SSMS, SQL Server Developer) (0) | 2024.11.22 |
[SQL] 데이터베이스 정규화 (1NF, 2NF, 3NF, BCNF, 4NF, 5NF) (2) | 2024.11.12 |
[MSSQL] 메모리 할당 최대/최소 설정 (0) | 2024.11.12 |