[데이터베이스 & SQL 첫걸음] 6주차 공부

김서영·2021년 10월 17일
0

데이터베이스와 아키텍처 구성

DB 서버의 다중화 - 클러스터링

DB와 다른 서버의 차이

데이터베이스는 데이터를 장기간 보존하는 매체가 필요. 대량의 데이터를 영구적으로 보존하고 그에 따른 성능도 요구되기 때문에 데이터를 보존하는 매체에 필요한 요건이 높음.

가장 기본적인 다중화

DB 서버만을 다중화하고 저장소는 하나만 둠. DB 서버가 두 대가 있을 때 동시에 동작하는 것을 허락할 지에 따라 나뉨.

  • Active - Active : 클러스터를 구성하는 컴포넌트를 동시에 가동.
  • Active - Standby : 클러스터를 구성하는 컴포넌트 중 실제 가동하는 것은 Active, 남은 것은 대기(Standby).

저장소를 공유하는 Active-Active 구성이 가능한 DBMS는 현재 Oracle과 DB2 뿐. 나머지 DBMS는 Active-Standby를 사용.

Active-Active 구성의 장점

  • DB 서버가 여러 대라서 1대에서 장애가 발생해도 처리를 계속할 수 있음. (시스템 다운 시간이 짧음)
  • 각 DB 서버의 CPU나 메모리가 동시에 가동하므로 처리 성능이 향상. (성능이 좋음)

Active-Standby 구성

보통 Standby 상태의 DB 서버는 사용되지 않다가 Active DB 서버에서 장애가 일어날 때 사용. Active DB와 heartbeat 통신을 하다가 통신이 끊기면, 에러 발생을 감지.

  • Cold-Standby : 평소에는 Standby DB가 작동하지 않다가 Actvie DB가 다운된 시점에 작동하는 구성
  • Hot-Standby : 평소에도 Standby DB가 작동하는 구성

각 구성을 가용성과 성능이 좋은 순으로 정리 (라이선스료의 '가격순')
1. Active-Active
2. Active-Standby(Hot-Standby)
3. Active-Standby(Cold-Standby)

DB 서버와 데이터의 다중화 - 리플리케이션

리플리케이션

데이터 센터 전체가 지진으로 붕괴하거나 화재가 나면 데이터를 다 잃게 됨. 이런 상황에 대응하기 위한 클러스터 구성이 '리플리케이션(Replication)'. DB 서바와 저장소 세트를 복수로 준비하는 것.

리플리케이션에서 주의할 점

Active 측 저장소의 데이터는 항상 사용자로부터 갱신된다는 것.
Standby 측 데이터에도 갱신을 반영하여 항상 최신화할 것.(이미지 출처 : http://channy.creation.net/project/dev.kthcorp.com/2012/05/04/what-is-mysql-replication-part-3/index.html)

성능을 추구하기 위한 다중화 - Shared Nothing

Shared Disk와 Shared Nothing

복수의 서버가 1대의 디스크를 사용하는 구성을 'Shared Disk'.
Shared Disk 타입의 Active-Active 구성은 DB 서버를 늘려도 무한으로 처리율이 향상되지 않고 어딘가에서 한계점에 도달함.
저장소가 공유 자원이라서 쉽게 늘리기 어렵고 DB 서버 대수가 증가할수록 DB 서버 간의 정보 공유를 위한 오버헤드가 크기 때문. 이 단점을 극복하기 위한 아키텍처로 고안된 것이 'Shared Nothing'.

Shared Nothing

'아무것도 공유하지 않는다.'
네트워크 이외의 자원을 모두 분리하는 방식.

선형적으로 성능이 향상됨. 비용 대비 성능이 좋음.

저장소를 공유하지 않는 것은 결국 '각각의 DB 서버가 동일한 1개의 데이터에 액세스할 수 없다'는 것을 의미. 또한, 하나의 DB 서버가 다운되었을 때 그 데이터에 액세스할 수 없는 문제 발생.

(이미지 출처 :http://channy.creation.net/project/dev.kthcorp.com/2012/05/04/what-is-mysql-replication-part-3/index.html)

정렬과 연산

LIMIT

LIMIT은 SELECT 명령으로 결과값으로 반환되는 행을 제한.
표준 SQL은 아니나, MySQL과 PostgreSQL에서 사용 가능.
SELECT 열명 FROM 테이블명 LIMIT 행수 [OFFSET 시작행];
SELECT 열명 FROM 테이블명 WHERE 조건식 ORDER BY 열명 LIMIT 행수;
LIMIT 다음에는 최대 행수를 수치로 지정. 만약, LIMIT 10이라면, 최대 10개의 행이 클라이언트로 반환.

MySQL이나 PostgreSQL 이외의 데이터베이스에서는 LIMIT 대신 TOP을 사용. SELECT TOP 행수 FROM 테이블명;

Oracle에는 LIMIT도 TOP도 없어서 ROWNUM 사용. WHERE 구로 조건 지정 후 행 제한.SELECT * FROM 테이블명 WHERE ROWNUM <=3;

OFFSET

페이지 나누기(pagination) 기능을 위해 LIMIT 구에 OFFSET을 지정. OFFSET은 생략 가능하며 기본값은 0.
SELECT 열명 FROM 테이블명 LIMIT 행수 OFFSET 위치;
만약, SELECT * FROM 테이블명 LIMIT 3 OFFSET 3; 이라면, 첫번째 페이지는 3행까지, 두번째 페이지는 4행부터 3건의 데이터를 표시.

수치 연산

+ - * / % MOD

사칙 연산

연산자연산우선순위
+덧셈(가산)1+2->32
-뺄셈(감산)1-2->-12
*곱셈(승산)1*2->21
/나눗셈(제산)1/2->0.51
%나머지1%2->11

SELECT 문에서의 사칙연산

Column 중 가격을 나타내는 price column과 수량을 나타내는 quantity column이 있다고 가정.SELECT *, price*quantity FROM 테이블명;

WHERE 구에서 연산

SELECT *, price*quantity AS amount(새로 지정한 열명) FROM 테이블명 WHERE price*quantity >= 2000;

데이터베이스 서버 내부에서 WHERE 구 -> SELECT 구의 순서로 처리. 따라서, SELECT *, price*quantity AS amount(새로 지정한 열명) FROM 테이블명 WHERE amount >= 2000; 에서는 오류 발생.

SELECT 구에서 지정한 별명은 WHERE 구 안에서 사용할 수 없음.

NULL 값의 연산

NULL로 연산하면 결과는 NULL

ORDER BY 구에서 연산

SELECT *, price*quantity AS amount(새로 지정한 열명) FROM 테이블명 ORDER BY price*quantity DESC;
ORDER BY는 서버에서 내부적으로 가장 나중에 처리. 즉, SELECT 구보다 나중에 처리되기 때문에 SELECT 구에서 사용된 별명 이용 가능.SELECT *, price*quantity AS amount(새로 지정한 열명) FROM 테이블명 ORDER BY amount DESC;

함수

함수명 (인수1, 인수2, ...)
연산자도 함수도 둘 다 같은 것이나 표기 방법이 다름.
나머지를 계산하는 % 연산자와, 동일하게 나머지를 계산하는 MOD 함수.
10 % 3 -> 1 MOD(10,3) -> 1

ROUND 함수

SELECT amount, ROUND(amount) FROM 테이블명;
ROUND 함수는 기본적으로 소숫점 첫째 자리를 기준으로 반올림한 값을 반환. ROUND 함수의 두 번째 인수로 반올림할 자릿수를 지정할 수 있음.
SELECT amount, ROUND(amount,1) FROM 테이블명;
위의 경우는 소숫점 둘째 자리를 반올림.

-1을 지정하면 1단위, -2를 지정하면, 10단위를 반올림.
버림을 하는 경우에는 TRUNCATE.
SIN, COS 등 삼각함수나 루트를 계산하는 SQRT, 대수를 계산하는 LOG 등 수많은 함수가 제공.

열의 별명 , AS

SELECT 결과에서 price*quantity라고 명명된 열이 금액을 계산한 부분. 이렇게 열 이름이 길고 알아보기 어려운 경우에는 별명을 붙여 열명을 재지정.

SELECT *, price*quantity AS 새로 지정한 열명 FROM 테이블명

사실 AS는 생략해도 가능. 별명은 영어, 숫자, 한글 등으로 지정.
숫자로 시작해서는 안됨.

다만, MySQL에서는 숫자로 시작하는 객체명 허용. 다만 숫자만으로 구성되는 경우는 X.

Oracle은 숫자로 시작하는 이름 허용 X. 데이터베이스 별로 다름.

한글로 지정하는 경우에는 오류가 날 수 있으므로, 더블쿼트(MySQL에서는 백쿼트)로 둘러싸서 지정.

SELECT *, price*quantity AS "금액" FROM 테이블명

더블쿼트로 둘러싸면 데이터베이스 객체의 이름. "sample21"

싱글쿼트로 둘러싸면 문자열 상수. 'ABC', '박성진'

profile
하지만 저는 이겨냅니다. 김서영이죠?

0개의 댓글