test 테이블의 데이터

test1
abcd
1111
1234


array로 변경

select array_agg(test1) from test {abcd,1111,1234}

string으로 변경

select string_agg(test1, ',') from test abcd,1111,1234


array 데이터를 각 로우로 변경

unnest(array타입)


-- 예시
select unnest(ARRAY[1,2])


1
2
(2 rows)

array 타입에 데이터 추가

array_append(array, 값)


-- 예시
array_append(ARRAY[1,2], 3)


{1,2,3}

array 타입끼리 협차기

array_cat(array, array}


-- 예시
array_cat(ARRAY[1,2], ARRAY[3,4])


{1,2,3,4}

array에서 string(단일컬럼)으로 변경

array_to_string(array, 구분자, [NULL 값 대체 구분자])


-- 예시
array_to_string(ARRAY[1, 2, 3, NULL, 5], ',', '*')


1,2,3,*,5

string을 array로 변경

string_to_array(string, 구분자, [null로 변경할 값])


-- 예시
string_to_array('xx~^~yy~^~zz', '~^~', 'yy')
{xx,,zz}


샤딩(sharding)과 파티셔닝(partitioning)의 차이

파티셔닝이란 퍼포먼스(performance), 가용성(availability) 또는 정비용이성(maintainability)를 목적으로 논리적인 데이터 엘리먼트들을 다수의 table로 쪼개는 행위를 뜻하는 일반적인 용어입니다.

샤딩은 수평 파티셔닝(horizontal partitioning)과 동일합니다. 데이터베이스를 샤딩하게 되면 기존에 하나로 구성될 스키마를 다수의 복제본으로 구성하고 각각의 샤드에 어떤 데이터가 저장될 지를 샤드 키를 기준으로 분리합니다. 

수평 파티셔닝 (horizontal partitioning) = 샤딩


위 예시를 보면 1 ~ 5 번 고객의 정보는 하나의 샤드에 저장하고 6 ~ 10 번 고객의 정보는 다른 샤드에 저장하기로 한 예시 입니다. DBA는 데이터 엑세스 패턴과 저장 공간 이슈(로드의 적절한 분산 , 데이터의 균등한 저장)를 고려하여 적절한 샤드 키를 결정하게 됩니다.

수직 파티셔닝 (vertical partitioning)


수직 파티셔닝(vertical partitioning)은 하나의 테이블에 저장된 데이터들을 공간이나 퍼포먼스의 이유로 다수의 테이블로 분리하는것을 말합니다. 이러한 작업을 하는 이유는 DB의 3정규화(Normalization)로 접근하면 편합니다.

'DB' 카테고리의 다른 글

샤딩(sharding), 파티셔닝(partitioning)  (0) 2018.12.23
[DB] ETL이란  (0) 2018.12.22
[DB] CDC란  (0) 2018.12.22
[DB]Connection Pool  (0) 2017.02.11
[SQL] WHERE절에서 IF문처럼 AND 사용  (0) 2017.02.02
[DB] 클러스터  (0) 2016.11.18

ETL은 Extract, Transform, Load 의 앞글자를 딴 용어입니다. 즉 데이터를 추출, 변환, 적재를 한다는 것입니다. 내용은 그렇게 어렵지가 않습니다.

예를 들어, calendar라는 테이블에 년/월/일/시/분/초 형태로 각 컬럼이 존재합니다. 이러한 데이터를 사용하여 통계를 내는 어떤 프로그램을 실행하려고 확인 했더니 해당 프로그램은 년월일/시분초 와 같은 컬럼형태를 요구하고 있을 때 작업을 하는 것을 ETL이라 합니다.

예시

Extract

대상이 되는 calendar 테이블에서 년/월/일/시/분/초 형태의 데이터를 전부 추출합니다.

Transform

추출한 데이터를 요구하는 형태인 년월일/시분초 형태로 변경을 합니다.

Load

변경이 된 데이터를 새로운 테이블에 적재합니다.

요약

간단하게 위와 같은 단계를 거치는 것이 ETL이라 합니다. ETL은 저장된 데이터를 변형하여(요구사항에 맞게) 다른 곳으로 이동하는 것 이라 볼 수 있습니다. 위 예제처럼 컬럼 개수를 변형할 수도 있고 데이터의 형태나 컬럼 개수를 변형하지 않는 작업이 될수도 있습니다. 예를 들어 MSSQL을 사용하다가 PostgreSQL로 데이터를 이전하고 싶을 경우, 데이터의 형태와 컬럼 개수는 유지하면서 테이블의 스키마를 조금 변형하는 작업이 될 수도 있습니다.

'DB' 카테고리의 다른 글

샤딩(sharding), 파티셔닝(partitioning)  (0) 2018.12.23
[DB] ETL이란  (0) 2018.12.22
[DB] CDC란  (0) 2018.12.22
[DB]Connection Pool  (0) 2017.02.11
[SQL] WHERE절에서 IF문처럼 AND 사용  (0) 2017.02.02
[DB] 클러스터  (0) 2016.11.18

Change Data Capture의 약어로 마지막으로 추출한 이후 변경된 데이터만 골라내는 기술을 의미합니다. 흔히 데이터 백업이나 통합 작업을 할 경우 방대한 데이터를 다뤄야 하는데 원본 소스 데이터 가운데 최근 변경된 데이터들만 골라 다른 시스템으로 옮기게 되면 시스템 로드도 줄이고 전체적인 작업 생산성을 향상시킬 수 있습니다.  특히 한 시스템에 있는 대량의 데이터를 정기적으로 추출해 다른 시스템으로 이동하는 데이터 통합이나 데이터 웨어하우스 업무의 경우 CDC 기술을 이용하면 데이터를 추출, 이동하는 시간을 크게 줄일 수 있습니다. 또한 24시간 운영해야 하는 필수적인 업무 시스템의 경우 CDC 기술을 이용하면 다운타임 없이 실시간 백업과 데이터 통합이 가능합니다.


'DB' 카테고리의 다른 글

샤딩(sharding), 파티셔닝(partitioning)  (0) 2018.12.23
[DB] ETL이란  (0) 2018.12.22
[DB] CDC란  (0) 2018.12.22
[DB]Connection Pool  (0) 2017.02.11
[SQL] WHERE절에서 IF문처럼 AND 사용  (0) 2017.02.02
[DB] 클러스터  (0) 2016.11.18

정렬을 사용자가 원하는대로 하길 원하거나, WHERE절에 건 조건 그대로 정렬이 되기를 원할 때, 아래와 같은 방법으로 처리할 수 있습니다.


1. array_position 사용하기

PostgreSQL의 버전이 9.5 이상일 경우 array_position 함수를 사용하여 구현할 수 있습니다. 


SELECT *
FROM test 
WHERE pk IN (1, 3, 4, 6, 2) 
ORDER BY ARRAY_POSITION(ARRAY[1, 3, 4, 6, 2], pk)

위 구문을 사용할 때 주의할 점은 array에 들어가는 데이터 타입과 조회를 하고자 하는 컬럼의 타입이 동일해야 합니다.

  • ARRAY_POSITION(ARRAY[1::bigint, 3::bigint], 1::int)   - 에러


array_position(anyarray,anyelement [, int])란?
두 번째에 입력된 인수를 첫 번째에 입력된 인수(어레이)에서 검색을 하며 첫 번째로 나온 값을 반환합니다.
예시)
array_position(ARRAY['sun','mon','tue','wed','thu','fri','sat'], 'mon')   – 결과 2

2. case ... when 사용하기

PostgreSQL의 버전이 9.5이하이거나 다른 DB를 사용할 경우 order by 에 case when 구문을 사용하여 구현할 수 있습니다.

SELECT * 
FROM test 
WHERE pk IN (1, 3, 4, 6, 2) 
ORDER BY 
CASE pk 
WHEN 1 THEN 0
WHEN 3 THEN 1
WHEN 4 THEN 2
WHEN 6 THEN 3
WHEN 2 THEN 4
ELSE 5
END


+ Random Posts