Replies: 3 comments
-
성능을 생각하자
주기형과 돌발형
데이터베이스와 병목데이터베이스가 병목되는 이유는 다음과 같다
이런 제한 때문에 데이터베이스에서는 튜닝 기술이 발달했다. 튜닝은 애플리케이션 효율화고 같은 자원으로 성능을 향상하는 것이다. 성능 결정 요인, 데이터베이스 결과 통지 과정을 보자sql을 받아 사용자에게 결과를 통지하는 과정을 정리하자
통계정보 수집이 오래 걸리는 경우 오히려 성능이 떨어지게 된다. 통계정보는 이미 집약된 작은 크기에 데이터기에 다소 부정확함은 눈감아줘도 충분한 이익인 속도를 손에 넣을 수 있다. 실행계획 과정
성능은 옵티마이저가 얼마나 정밀도가 높은 실행계획은 세우냐에 달려있다. 이를 위해서는 정밀도가 높은 통계정보가 필요하고 이것이 떨어지는 것이 결국 낮은 성능을 가져온다. 아래는 통계정보의 정밀도를 낮추는 안티 패턴이다.
|
Beta Was this translation helpful? Give feedback.
-
10장 성능을 생각하자성능이란성능이란 무엇인가?성능은 기본적으로 성능을 측정하는 2가지 지표
데이터베이스와 병목의 관계데이터베이스는 왜 병목이 되는가
성능을 결정하는 요인데이터베이스가 SQL문을 처리하는 과정
요청온 SQL문의 문법을 파악하는 것으로 잘못된 SQL문으로 요청이 오면 에러를 반환한다.
요청온 SQL문에 오류가 없다면 데이터베이스에서는 어떤 방식으로 데이터에 접근할지에 대한 실행계획을 세우게 되는데 이를 사람이 아닌 옵티마이저를 통해 실행계획을 만들게 하는 이유는 사람이 직접 선택하는 것보다 컴퓨터가 선택하는 것이 정확하면서도 속도가 빠르기 때문이다. SQL문이 복잡해지면 이를 처리를 방식인 실행계획이 많아지는데 이를 직접 일일이 비교해 나가는 것은 쉽지 않다. 옵티마이저는 실행계획은 어떻게 세워지는가실행계획을 표시한다.우리가 실행하려는 SQL문 앞에 EXPLAIN을 붙이면 실행계획에 대한 정보를 확인할 수 있다. 풀 스캔과 레인지 스캔table: 데이터가 취득되는 테이블을 의미한다. rows: 현재 데이터 행의 개수를 의미한다. type: 데이터를 취득하기 위해 테이블을 엑세스 하는 방식을 나타내며 풀 스캔(ALL)과 레인지 스캔(range) 2가지가 있다.
인덱스의 중요성possible Keys와 key의 경우 풀 스캔일 때에는 NULL 값을 가지지만 레인지 스캔을 하는 경우에는 PRIMARY라는 값을 가지는데 이는 인덱스를 이용한다는 것을 의미한다. 기본적으로 모든 DBMS에서는 인덱스를 이용한다. PRIMARY는 기본키로 인덱스를 설정한다는 것을 의미한다. 인덱스는 SQL에서 만든다결국 추출해야하는 데이터가 적은 범위라도 인덱스가 없는 상황에서는 풀스캔을 하기 때문에 성능에 영향을 많이 미친다. 이와 같은 상황을 방지하기 위해서는 특정 열에도 인덱스를 추가할 수 있다. CREATE INDEX [인덱스명] ON [테이블명]([열명]);
// 여기에 새로운 index를 추가한다.
CREATE INDEX ind_district ON City(district);위와 같이 district 열을 인덱스를 추가한 이후에 그 열을 통해 제약조건을 걸게 되면 다음과 같은 실행계획을 볼 수 있다. type 에 ALL이 아닌 ref가 나타나는 것을 알 수 있습니다. 이를 통해 알 수 있는 것은 우리가 직접 인덱스를 적용하는 것이 아닌 내부의 옵티마이저를 통해 실행계획이 보다 효율적인 방식으로 수행되게 설정이 된다는 것이다. 앞선 인덱스와 다르게 type에 range가 아닌 ref가 나타는데 이는 인덱스의 종류에 따라 혹은 where에 제약조건으로 등호를 사용했는지 아니면 범위를 사용했는지에 따라 다르게 나타난다. 그럼에도 두 방식 모두 레인지 스캔을 하는 것을 의미한다 인덱스가 인기가 있는 이유인덱스를 성능 개선을 하는데 가장 먼저 고려되는 옵션이다. 인덱스를 가장 먼저 고려하는 이유는 다음과 같다.
즉, 인덱스는 비용 대비 성능이 높은 방법이다. 인덱스의 구조와 트리 구조의 우위성인덱스는 B-tree 구조를 가지고 있으며 트리 구조가 효과를 나타내기 위해서는 B-tree가 성능면에서 우수한 이유는 예를 들어 다음과 같이 정렬된 데이터가 {개, 고양이, 곰, 말, 사슴, 여우, 코끼리} 존재하면 B-tree는 다음과 같이 정의 될 수 있다. 루트 노드에서 리프 노드로 접근할 때 탐색 과정(이진탐색)이 2번이면 모든 데이터에 접근할 수 있다. 이 부분이 효율적인 이유는 위의 데이터를 하나의 배열로 관리를 한다면 “코끼리”를 조회할 때에는 7번의 탐색과정이 필요하고 반면 “개”를 조회를 하는 경우에는 1번의 탐색과정이 필요하다. 이와 같이 배열은 탐색과정의 횟수가 불규칙하기 때문에 데이터가 많아지는 경우 성능의 편차가 발생하게 됩니다. 이와 같은 이유로 인덱스는 데이터가 많아지면 많아질수록 보다 좋은 성능을 낼 수 있다. 또다른 인덱스의 장점은 불필요한 정렬과정을 하지 않을 수 있다는 것이다. 인덱스를 사용할 때 주의할 점
인덱스를 이용한다는 것은 데이터가 추가 될 때마다 인덱스 자기 자신도 갱신이 필요하다는 것이다 (인덱스는 B-tree 구조를 가지고 있는데 데이터가 추가 될 때마다 이를 갱신해야한다.)
한 개의 테이블에 복수 개의 인덱스를 작성한 경우로 이런 경우에 옵티마이저가 실행계획을 정할 때 의도하지 않은 인덱스를 이용하는 경우가 있다. 이런 경우 오히려 성능이 떨이진다. 인덱스를 만들 때 기준
Cardinality는 값의 분산도를 의미하고 특정 열에 대해 많은 종류의 값을 가지고 있다면 Cardinality가 높다고 한다. Cardinality가 작은 열에 대해서 인덱스를 추가하면 다음과 같은 이유로 성능 향상을 기대할 수 없다.
|
Beta Was this translation helpful? Give feedback.
-
Beta Was this translation helpful? Give feedback.



Uh oh!
There was an error while loading. Please reload this page.
-
성능 생각하기
성능
성능을 결정하는 요인
옵티마이저가 참조하는 통계 정보
실행계획은 어떻게 세워지는가
CREATE INDEX [인덱스명] ON [테이블명]([열명])인덱스의 구조
인덱스 사용 주의사항
인덱스 만들 때 기준
Beta Was this translation helpful? Give feedback.
All reactions