데이터베이스는 데이터를 장기간 보존하는 매체가 필요. 대량의 데이터를 영구적으로 보존하고 그에 따른 성능도 요구되기 때문에 데이터를 보존하는 매체에 필요한 요건이 높음.
DB 서버만을 다중화하고 저장소는 하나만 둠. DB 서버가 두 대가 있을 때 동시에 동작하는 것을 허락할 지에 따라 나뉨.
저장소를 공유하는 Active-Active 구성이 가능한 DBMS는 현재 Oracle과 DB2 뿐. 나머지 DBMS는 Active-Standby를 사용.
보통 Standby 상태의 DB 서버는 사용되지 않다가 Active DB 서버에서 장애가 일어날 때 사용. Active DB와 heartbeat 통신을 하다가 통신이 끊기면, 에러 발생을 감지.
각 구성을 가용성과 성능이 좋은 순으로 정리 (라이선스료의 '가격순')
1. Active-Active
2. Active-Standby(Hot-Standby)
3. Active-Standby(Cold-Standby)
데이터 센터 전체가 지진으로 붕괴하거나 화재가 나면 데이터를 다 잃게 됨. 이런 상황에 대응하기 위한 클러스터 구성이 '리플리케이션(Replication)'. DB 서바와 저장소 세트를 복수로 준비하는 것.
Active 측 저장소의 데이터는 항상 사용자로부터 갱신된다는 것.
Standby 측 데이터에도 갱신을 반영하여 항상 최신화할 것.(이미지 출처 : http://channy.creation.net/project/dev.kthcorp.com/2012/05/04/what-is-mysql-replication-part-3/index.html)
복수의 서버가 1대의 디스크를 사용하는 구성을 'Shared Disk'.
Shared Disk 타입의 Active-Active 구성은 DB 서버를 늘려도 무한으로 처리율이 향상되지 않고 어딘가에서 한계점에 도달함.
저장소가 공유 자원이라서 쉽게 늘리기 어렵고 DB 서버 대수가 증가할수록 DB 서버 간의 정보 공유를 위한 오버헤드가 크기 때문. 이 단점을 극복하기 위한 아키텍처로 고안된 것이 'Shared Nothing'.
'아무것도 공유하지 않는다.'
네트워크 이외의 자원을 모두 분리하는 방식.
선형적으로 성능이 향상됨. 비용 대비 성능이 좋음.
저장소를 공유하지 않는 것은 결국 '각각의 DB 서버가 동일한 1개의 데이터에 액세스할 수 없다'는 것을 의미. 또한, 하나의 DB 서버가 다운되었을 때 그 데이터에 액세스할 수 없는 문제 발생.
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;
페이지 나누기(pagination) 기능을 위해 LIMIT 구에 OFFSET을 지정. OFFSET은 생략 가능하며 기본값은 0.
SELECT 열명 FROM 테이블명 LIMIT 행수 OFFSET 위치;
만약, SELECT * FROM 테이블명 LIMIT 3 OFFSET 3;
이라면, 첫번째 페이지는 3행까지, 두번째 페이지는 4행부터 3건의 데이터를 표시.
+ - * / % MOD
연산자 | 연산 | 예 | 우선순위 |
---|---|---|---|
+ | 덧셈(가산) | 1+2->3 | 2 |
- | 뺄셈(감산) | 1-2->-1 | 2 |
* | 곱셈(승산) | 1*2->2 | 1 |
/ | 나눗셈(제산) | 1/2->0.5 | 1 |
% | 나머지 | 1%2->1 | 1 |
Column 중 가격을 나타내는 price column과 수량을 나타내는 quantity column이 있다고 가정.SELECT *, price*quantity FROM 테이블명;
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
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
SELECT amount, ROUND(amount) FROM 테이블명;
ROUND 함수는 기본적으로 소숫점 첫째 자리를 기준으로 반올림한 값을 반환. ROUND 함수의 두 번째 인수로 반올림할 자릿수를 지정할 수 있음.
SELECT amount, ROUND(amount,1) FROM 테이블명;
위의 경우는 소숫점 둘째 자리를 반올림.
-1을 지정하면 1단위, -2를 지정하면, 10단위를 반올림.
버림을 하는 경우에는 TRUNCATE.
SIN, COS 등 삼각함수나 루트를 계산하는 SQRT, 대수를 계산하는 LOG 등 수많은 함수가 제공.
SELECT 결과에서 price*quantity라고 명명된 열이 금액을 계산한 부분. 이렇게 열 이름이 길고 알아보기 어려운 경우에는 별명을 붙여 열명을 재지정.
SELECT *, price*quantity AS 새로 지정한 열명 FROM 테이블명
사실 AS는 생략해도 가능. 별명은 영어, 숫자, 한글 등으로 지정.
숫자로 시작해서는 안됨.
다만, MySQL에서는 숫자로 시작하는 객체명 허용. 다만 숫자만으로 구성되는 경우는 X.
Oracle은 숫자로 시작하는 이름 허용 X. 데이터베이스 별로 다름.
한글로 지정하는 경우에는 오류가 날 수 있으므로, 더블쿼트(MySQL에서는 백쿼트)로 둘러싸서 지정.
SELECT *, price*quantity AS "금액" FROM 테이블명
더블쿼트로 둘러싸면 데이터베이스 객체의 이름. "sample21"
싱글쿼트로 둘러싸면 문자열 상수. 'ABC', '박성진'