성능이란?
성능 : '빠르기'를 중심으로 한 개념
성능 측정 지표
- 응답시간(혹은 처리 시간, response time)
ex) 어떤 처리를 하는데 몇초 걸렸다.
- 처리율(throughput)
특정 처리(트랜잭션)를 단위 시간에 몇 건 처리가 가능한가에 대한 측정 단위
ex) 트랜잭션을 초당 50건 처리 가능 --> 이 시스템의 처리율 : 50TPS(Transaction Per Second)
처리율이 높은 시스템일수록 CPU나 메모리 같은 하드웨어 자원이 매우 필요해짐.
즉 동시에 실행되는 처리가 많아질수록 필요한 물리 자원도 증가한다.
정점과 한계점
동시 실행 처리 수가 증가할수록 준비해야 할 물리적 자원도 증가한다.
그러다가 한가지 자원이라도 한계에 다다르게 되면 이 시점부터 성능이 나빠지기 시작한다.
즉 응답 시간은 상승하고 반대로 처리율은 떨어지게 된다.
이렇게 최초로 한계에 이른 자원을 버틀넥 포인트 즉 병목 이라고 한다.
시스템은 동시에 실행되는 처리가 가장 많아지는 순간을 설정해서 자원을 준비해 두지 않으면 정점(peak)일 때 극단적인 지연을 일으키게 된다. 이처럼 처리율과 응답 시간이 극단적으로 나빠지기 시작하는 처리량을 한계점 이라고 부른다.
이렇게 정점을 상정한 자원을 확보해 두는 것을 사이징(sizing)이나 캐퍼시티 플랜(capacity planning)이라고 한다.
하지만 정점이 정적이지 않거나 최대치를 예측하기 어려운 때가 있다.
이럴 경우 클라우드를 사용한다.
클라우드는 가상화를 기반으로 자원량을 유연하게 변동할 수 있는 기술.
스케일 업과 스케일 아웃도 예전과 비교하면 쉬우며 짧은 시간 내에 실시 가능.
--> 정점일 때만 자원을 증가하고 정점이 아닐 때는 줄이는 등의 동적인 자원 관리 가능.
데이터베이스의 성능
데이터베이스는 왜 병목이 되는가?
- 취급하는 데이터 양이 가장 많다.
- 자원 증가를 통한 해결이 어렵다.
- 위에서 정점에 필요한 자원 추가를 위해 클라우드 같이 동적으로 자원을 증감할 수 있는 아키텍처가 필요하다고 했는데 데이터베이스의 경우에는 이것이 어렵다.
- 데이터베이스의 병목 지점은 저장소 즉 대부분 하드디스크. 이것을 스케일 아웃 하는 것은 어렵다.
(DB가 기본적으로 active-standby 구성이나 공유 디스크에 의한 active-active 구성밖에 취할 수 없기 때문)
- 저장소를 포함해 스케일 아웃이 가능한 것은 shared nothing 뿐이다.
--> 데이터베이스에서는 전통적으로 튜닝 기술이 발달했다.
(튜닝 : 애플리케이션을 효율화해 같은 양의 자원이라도 성능을 향상하게 하는 기술)
즉 SQL을 어떻게 하면 빠르게 할 수 있을까?
데이터베이스 성능 결정 요인
데이터베이스가 결과를 통지하는 모든 과정들이 DB 성능을 결정!
SQL 구문이 주어질 때 이것의 실행계획을 보는 방법
SQL문 앞에 EXPLAIN
만 붙여주면 됨!
ex ) EXPLAIN SELECT * FROM TABLE
- 풀스캔 : 테이블에 포함된 레코드를 처음부터 끝까지 전부 읽어 들이는 방법
- 레인지 스캔 : 테이블의 일부 레코드만 액세스 하는 방법
- where 구로 검색 조건에 따른 범위 제한을 하는 경우 레인지 스캔
- 또한 레인지 스캔을 하려면 where 구의 검색 조건 컬럼에 대한 index가 있어야 함.
- where 구를 사용한다고 하더라도 해당 컬럼에 대한 index가 없으면 레인지 스캔 안하고 풀스캔함!