본문 바로가기
코딩 공부 기록/SQL

데이터베이스 성능 분석 개요와 성능 튜닝 기초 개념

by Murphy0v0 2024. 11. 12.

 

1. 데이터베이스 성능 분석 개요

1.1 성능 튜닝의 목적

  • 성능 튜닝이란 데이터베이스 시스템이 효율적으로 동작하도록 개선하는 작업이다. 목표는 응답 속도 단축자원 사용 최적화에 있다.
    • 응답 시간(Response Time) 최적화: 쿼리가 반환되는 시간을 줄인다.
    • 처리량(Throughput) 증대: 단위 시간당 처리할 수 있는 트랜잭션을 증가시킨다.
    • 자원 사용 최적화: CPU, 메모리, I/O 같은 시스템 자원을 효율적으로 사용하여 과부하를 방지한다.

1.2 데이터 처리 과정 이해

  • SQL 문장 실행 절차
    1. SQL 파싱: SQL 문장을 구문 분석해 실행 계획을 수립한다.
    2. 최적화: 다양한 실행 계획 중 비용이 가장 낮은 계획을 선택한다.
    3. 실행: 선택된 실행 계획에 따라 데이터를 가져온다.
    4. 결과 반환: 최종 결과가 클라이언트에 반환된다.

이 단계에서 실행 계획비용 평가가 튜닝에 중요한 요소이며, 비용이 낮은 계획일수록 적은 자원을 사용해 데이터를 가져오므로 성능이 좋다.

 

 


 

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 ExpectancyBuffer Cache Hit Ratio는 메모리 효율성을 나타내는 지표이고, 일반적으로 Page Life Expectancy는 높을수록 좋다.